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
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となってしまう理由がわかりません。 自分で作っておきながら、なぜそうしなければいけないのかよくわからないというのも妙な話ですが、教えていただけないでしょうか。 よろしくお願いします。
[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
三橋さんの投稿
(投稿ID: 3620)
いつもお世話になっております。
ワークシートを追加し、シート名を取引先名称に変更するマクロに関する質問です。
復習のために小川さんの言うマクロの「型」でワークシートを追加してみようと下記のようにマクロを組んでみました。
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となってしまう理由がわかりません。
自分で作っておきながら、なぜそうしなければいけないのかよくわからないというのも妙な話ですが、教えていただけないでしょうか。
よろしくお願いします。
小川慶一さんのコメント
(コメントID: 5124)
ポイントは、以下の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]
上記準備が済んだら、以下のコードを実行します。