取引記録に登場するすべての取引先名のシートを作成する(IDの割り振りも行う)

この講座は有料講座です。
講座の購入後ご覧になれます。

ログインアカウントの新規作成

解説

重複して取引先名が出現するリストを元にして、それぞれの取引先の名称のシートを作ります。
(ただし、あらかじめ取引先名で並べ替えがされていません。また、元データには番号が振られていません)

この教材についての過去の質問・感想

9341 : 小川慶一の回答 (2018-01-14 21:39:00)

三橋さん:

お楽しみいただけているようでなによりです (^^

「カウンターが1だけ増えている」とは限りません。
例えば、以下のプログラム参照。

Sub hoge()
    Dim c As Long
    For c = 2 To 33 Step 3
        Debug.Print c
    Next
    Debug.Print c
End Sub


以下は、出力結果:
 2 
 5 
 8 
 11 
 14 
 17 
 20 
 23 
 26 
 29 
 32 
 35 


ともあれ、

>最後の最後にカウンター変数は一つだけ増えてしまうんですね

いちおうご理解されているもの..と思いつつあえてもう一度書きますが、言語の仕様として、ループを抜けた直後のカウンター変数の値は保証されていません。なので、それを利用するための知見は無意味です。
ひきつづき、お楽しみください☆


9340 : 三橋さんのコメント (2018-01-12 06:25:45)

小川様

いただいた返信をもとにF8でひとつずつ動きを確認してみました。よくわかりました。

Next~For構文では、構文内の繰り返し(2~9行)が終わり次の命令に移るその時に「Nextを通る」ため、最後の最後にカウンター変数は一つだけ増えてしまうんですね(カウンター変数cGyoは10になっていた)。

いやぁ私にとってこれは大きな発見でした。
モヤモヤしていましたが、小川さんの「カウンター変数を再利用するのが意味がない」という意味がよくわかりました。。

すっきりしました。質問してよかったです。


9338 : 小川慶一の回答 (2018-01-10 08:27:31)

三橋さん:

ポイントは、以下の2つです。

[a]
>自分で作っておきながら、なぜそうしなければいけないのかよくわからないというのも妙な話ですが

そういうときは、サンプルデータをシンプルなものにしてテストしてみます。
300行を超えるデータだったものを一瞥できる分量にまで減らし、値もテスト結果を理解しやすいものに変更する。
並べ替えもそもそも不要なデータに。値の重複もさせない。

[b]
For Next構文のカウンターとして使った変数に入っている(であろう)値をカウンターの外で再利用しようという方針がそもそも間違いです。


三橋さんでしたら、以下の[1]-[4]のステップでいろいろ理解できるものと思います。

[1]
シートmainを作ります。

[2]
シートmain1を作ります。

[3]
シートmainに、以下のような自作データを投入します。

id name
1 name1
2 name2
3 name3
4 name4
5 name5
6 name6
7 name7
8 name8

[4]
上記準備が済んだら、以下のコードを実行します。

Sub sheetTsuika2()
    Dim ws As Worksheet
    Dim sNamae As String 'As String を追記しました。
    Dim cLst As Long
    Dim cGyo As Long
    Set ws = Worksheets("main")
    cLst = Range("B" & Rows.Count).End(xlUp).Row

'    ws.Range("A1:G" & cLst).Sort Key1:=Range("B1").Value, _
'                               Order1:=xlAscending, Header:=xlYes
    
    'key1:=WS.range("B1").value ,,, です。
    ws.Range("A1:G" & cLst).Sort Key1:=ws.Range("B1").Value, _
                               Order1:=xlAscending, Header:=xlYes

    For cGyo = 2 To cLst
        If sNamae <> ws.Range("B" & cGyo).Value Then
            If cGyo <> 2 Then
                Worksheets("main1").Copy after:=ws
                ActiveSheet.Name = sNamae
            End If
            sNamae = ws.Range("B" & cGyo).Value
        End If
    Next cGyo
    
    Debug.Print "cLstの値は: " & cLst
    Debug.Print "cGyoの値は: " & cGyo
    
    Worksheets("main1").Copy after:=ws
'    ActiveSheet.Name = ws.Range("B" & cGyo - 1).Value
    ActiveSheet.Name = ws.Range("B" & cLst).Value
End Sub


9335 : 三橋さんのコメント (2018-01-10 07:39:31)

小川様
いつもお世話になっております。
ワークシートを追加し、シート名を取引先名称に変更するマクロに関する質問です。
復習のために小川さんの言うマクロの「型」でワークシートを追加してみようと下記のようにマクロを組んでみました。


Sub sheetTsuika2()
Dim ws As Worksheet
Dim sNamae
Dim cLst As Long
Dim cGyo As Long
Set ws = Worksheets("main")
cLst = Range("B" & Rows.Count).End(xlUp).Row

ws.Range("A1:G" & cLst).Sort Key1:=Range("B1").Value,  _
Order1:=xlAscending, Header:=xlYes

For cGyo = 2 To cLst
If sNamae <> ws.Range("B" & cGyo).Value Then
If cGyo <> 2 Then
Worksheets("main1").Copy after:=ws
ActiveSheet.Name = sNamae
End If
sNamae = ws.Range("B" & cGyo).Value
End If
Next cGyo
Worksheets("main1").Copy after:=ws
ActiveSheet.Name = ws.Range("B" & cGyo - 1).Value
End Sub

End sub の1行前の記述に関する質問です。
シートmainの最終行は317行(宮崎繊維)のはずなのに
cGyo=318となってしまいます。
どこで1行加えられているのでしょうか?
cGyo-1とすればいい(そうすれば宮崎繊維がシート名となる)ことは理解できるのですが、
cGyo=318となってしまう理由がわかりません。
自分で作っておきながら、なぜそうしなければいけないのかよくわからないというのも妙な話ですが、教えていただけないでしょうか。
よろしくお願いします。


2681 : 小川慶一の回答 (2014-10-09 07:12:43)

匿名 さん:

はい。この「伝票作成マクロ」シリーズは、しつこく同じことをくりかえしているところがキモです v(^^

>何度も取り組むと手が慣れてきて、本当に嬉しいです。
>「特打」同様、手を動かしてもっともっと慣れていきたいと思っています。


2676 : 受講生さんのコメント (2014-10-09 06:35:27)

何度も取り組むと手が慣れてきて、本当に嬉しいです。
「特打」同様、手を動かしてもっともっと慣れていきたいと思っています。


1913 : 小川慶一の回答 (2014-08-11 16:15:23)

古川智之 さん:

この動画解説シリーズはかなり強力です。楽しんでください!
並べ替えをするマクロについてのお話、まさにそのとおりです。

ひきつづきよろしくお願いいたします!

>B列の並び替えについて、2007だと形式がちがっていました。
>テキストを参照したら、並び替えできました。(2003の方がシンプルですね。)
>09_homeworkの課題をやり始めました。
>最初はこの動画の手順からですね。


1887 : 古川智之さんのコメント (2014-08-10 08:28:23)

B列の並び替えについて、2007だと形式がちがっていました。
テキストを参照したら、並び替えできました。(2003の方がシンプルですね。)
09_homeworkの課題をやり始めました。
最初はこの動画の手順からですね。


3日がかりのその仕事、3分で終わらせる方法教えます。ガラパゴスタディーオンライン講座 ユーザー登録

本講座の動画一覧

  1. 【動画1】 すべてのシートを順に処理する
    【動画1】 すべてのシートを順に処理する 未習得
  2. 【動画2】 所定のシート以外すべてを削除する
    【動画2】 所定のシート以外すべてを削除する 未習得
  3. 【動画3】 所定の条件に一致しないシートすべてを削除する
    【動画3】 所定の条件に一致しないシートすべてを削除する 未習得
  4. 【動画4】 警告ダイアログを出さずにシートを削除する
    【動画4】 警告ダイアログを出さずにシートを削除する 未習得
  5. 【動画5】 複数シートを作成し、取引先名リストにあるのと同じ名前を順に割り当てる
    【動画5】 複数シートを作成し、取引先名リストにあるのと同じ名前を順に割り当てる 未習得
  6. 【動画6】 テンプレートシートを複数コピーし、取引先名リストにあるのと同じ名前を順に割り当てる
    【動画6】 テンプレートシートを複数コピーし、取引先名リストにあるのと同じ名前を順に割り当てる 未習得
  7. 【動画7】 あらかじめ並べ替えられているリストから重複しないリストを作成する
    【動画7】 あらかじめ並べ替えられているリストから重複しないリストを作成する 未習得
  8. 【動画8】 重複しないリストを作成し、新規シート作成時にリストからシート名を生成する
    【動画8】 重複しないリストを作成し、新規シート作成時にリストからシート名を生成する 未習得
  9. 【動画9】 重複しないリストを作成する(並べ替えから行う)
    【動画9】 重複しないリストを作成する(並べ替えから行う) 未習得
  10. 【動画10】 重複しないリストを作成する(並べ替えを行い、最後に元に戻す)
    【動画10】 重複しないリストを作成する(並べ替えを行い、最後に元に戻す) 未習得
  11. 【動画11】 取引記録に登場するすべての取引先名のシートを作成する
    【動画11】 取引記録に登場するすべての取引先名のシートを作成する 未習得
  12. 【動画12】 取引記録に登場するすべての取引先名のシートを作成する(IDの割り振りも行う)
    【動画12】 取引記録に登場するすべての取引先名のシートを作成する(IDの割り振りも行う) 未習得
  13. 【動画13】 取引先ごとに作成したシートにデータ転記を行う
    【動画13】 取引先ごとに作成したシートにデータ転記を行う 未習得
  14. 【動画14】 取引先ごとに作成したシートにデータ転記を行う2
    【動画14】 取引先ごとに作成したシートにデータ転記を行う2 未習得
  15. 【動画15】 データ転記先のシートすべてに対し、罫線を引く等の後処理をする
    【動画15】 データ転記先のシートすべてに対し、罫線を引く等の後処理をする 未習得

塾長 小川慶一

メニュー

コメント紹介

もっと見る

ページの先頭へ