エクセルマクロ オンライン講座コメント紹介

コメント紹介
   └ 解説「伝票作成マクロ」
       └ 取引記録に登場するすべての取引先名のシートを作成する(IDの割り振りも行う)

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

[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となってしまう理由がわかりません。
自分で作っておきながら、なぜそうしなければいけないのかよくわからないというのも妙な話ですが、教えていただけないでしょうか。
よろしくお願いします。

 


[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

 


まずはここから!スマホでも学べる無料動画講座

今なら先着30名限定で無料!定価4,800円の、初心者のためのエクセルマクロ動画講座。
  1. Excel 97~Excel 2016まですべて対応。動画本数20本、総再生時間2時間44分53秒
  2. PC, Mac, iPhone, iPad, Androidのお好みの環境で、いつでも好きなときに学べます。
2004年から10年間述べ3,000名以上に実施した研修の経験と実績を集約した講座です。
いますぐ無料で試してください。

トップへ