[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『マクロでシート名指定の方法』(おれんじー)
お世話になります。よろしくお願いします。
簡単なマクロを組んで使っていたのですが、変更する必要がでました。 以下のようなとき、一般的にどのようにするものなのでしょうか?
今までシート名を指定してそのシートでのみ使っていました。
Set ws1 = Worksheets("AAA(aaa)AAA") Set ws2 = Worksheets("AAA(bbb)AAA") :
これまでこれで間に合っていましたが、AAAの分類以外も扱うことになり、 AAAと同じことをBBBやCCCでもやることになりました。 (BBB(aaa)BBB、BBB(bbb)BBB……CCC(aaa)CCC、CCC(bbb)CCC…というシートが増えました)
AAAと同じ表で同じ処理なので、BBBのシートを開いているときはBBB分類のシート名のものだけを指定したいのですが、 どういう風にするべきでしょうか? どこかセルに分類名を書いておいて、それをひっぱるとか? 処理方法の考え方がわかりません。
どうぞよろしくお願いいたします。
< 使用 Excel:Excel2013、使用 OS:Windows7 >
これを、どう使うかですかね?
msgbox activesheet.name (BJ) 2017/08/01(火) 14:59
または、シートを増やす度にWorkSheetオブジェクトを増やすのではなく、以下のように全シート分ループするマクロにするのも良いでしょう。
Sub test() Dim i As Long
For i = 1 To Sheets.Count With Sheets(i) 'ここに1シート分の処理を書く End With Next i End Sub (???) 2017/08/01(火) 15:02
BJ様、???様
ご指導ありがとうございます。 activesheetでシート名をとったり指定したりできるのですか。 ではこのあとにカッコの前部分を取り出してそれがついているシートを 順番にws1〜に当てはめていく…という考え方になるのでしょうか? 調べてみます。
> または、シートを増やす度にWorkSheetオブジェクトを増やすのではなく、以下のように全シート分ループするマクロにするのも良いでしょう。
これは楽そう…と心揺れましたが、すみません、説明不足でした。 AAAのものをAAAまとめシートにまとめるマクロなのです。 増えたのでBBBまとめとCCCまとめと・・・と手作業で増やしておいて、 BBBのシート名のものはBBBまとめにまとめたく思っております。
全シートループだと1つのまとめシートにまとまってしまうようです。
(おれんじー) 2017/08/01(火) 15:47
まぁ、具体例がいまいち判らないので、何が適しているかまで教えられないのですが、何かしら元データシートとまとめシートの命名規則に違いがあるのでしょうから、それを判定すれば良いと思いますよ。
(???) 2017/08/01(火) 16:48
dim As String, x As String
ac = ActiveSheet.Name
x = Left(ac, IIf(InStr(ac, "("), InStr(ac, "(") - 1, Len(ac)))
Set ws1 = Worksheets(x & "(aaa)" & x)
Set ws2 = Worksheets(x & "(bbb)" & x)
End Sub
(mm) 2017/08/02(水) 09:51
ご指導ありがとうございます。
> まぁ、具体例がいまいち判らないので
すみません。現在のマクロを貼るべきでした。 シロウトが書いたお恥ずかしい限りのマクロなのですが。 Sub MATOME() Dim WS1 As Worksheet Dim WS2 As Worksheet Dim WS3 As Worksheet Dim WS4 As Worksheet
Set WS1 = Worksheets("AAA(aaa)") Set WS2 = Worksheets("AAA(bbb)") Set WS3 = Worksheets("AAA(ccc)") Set WS4 = Worksheets("まとめ")
With WS1.UsedRange
If .Rows.Count > 1 Then .Offset(1, 0).Resize(.Rows.Count - 1).Copy _ Destination:=WS4.Cells(Rows.Count, 1). _ End(xlUp).Offset(1, 0) End If
End With
With WS2.UsedRange
If .Rows.Count > 1 Then .Offset(1, 0).Resize(.Rows.Count - 1).Copy _ Destination:=WS4.Cells(Rows.Count, 1). _ End(xlUp).Offset(1, 0) End If
End With
With WS3.Range("A1").CurrentRegion
If .Rows.Count > 1 Then .Offset(1, 0).Resize(.Rows.Count - 1).Copy _ Destination:=WS4.Cells(Rows.Count, 1). _ End(xlUp).Offset(1, 0) End If
End With
End Sub
AAA(aaa)シート 日付 分類 名称 数量 2017/7/1 AAA(aaa) あああ 20 2017/7/2 AAA(aaa) あああ 32 2017/7/3 AAA(aaa) あああ 51 2017/7/4 AAA(aaa) あああ 34
他シートも同じ表 まとめシートには各シートにあるこの表が順番に並びます。
現在はAAA分類しかありませんので、まとめシートが1つしかありません。 これがAAAまとめシートとBBBまとめシートと・・・・とまとめシートだけで7つに増やす予定です。 AAA分類は3シートにわたってデータがありますが、BBBは2シート、CCCは1シート等、データシート数は分類によって変わります。
そこで、各分類のまとめシートを開いてからマクロを実行することにし、 現在開いているまとめシートのシート名から対象データシートを判別したいです。
mm様
ご指導ありがとうございます。 「AAAが含まれるワークシート」の指定がわからず調べている最中でした。 これでやってみます!
仕事の関係で試すのは午後になってしまいます、お許しください。 また書き込みます。 (おれんじー) 2017/08/02(水) 10:46
Sub test() Dim DIC As Object Dim i As Long Dim iw As Long Dim cw As String
Set DIC = CreateObject("Scripting.Dictionary")
For i = 1 To Sheets.Count With Sheets(i) iw = InStr(.Name, "まとめ") If 0 < iw Then DIC.Add Left(.Name, iw - 1), .Name End If End With Next i
For i = 1 To Sheets.Count With Sheets(i) iw = InStr(.Name, "まとめ") If iw = 0 Then iw = InStr(.Name, "(") If 0 < iw Then cw = Left(.Name, iw - 1) With .UsedRange If 1 < .Rows.Count Then .Offset(1, 0).Resize(.Rows.Count - 1).Copy _ Destination:=Sheets(DIC(cw)).Cells(Sheets(DIC(cw)).Rows.Count, 1). _ End(xlUp).Offset(1, 0) End If End With End If End If End With Next i
Set DIC = Nothing End Sub (???) 2017/08/02(水) 11:35
mm様
遅くなりましてすみません。 お教えいいただいたものから、現在使用しているマクロを修正できました。 本当にありがとうございます。 ただ、分類によってシート数が違うことにより、うまくいかない場合も出ました。 エラー回避をしなくてはいけませんね。 せっかくですので、考えてみようと思います。 ???様
ご指導本当にありがとうございます。 全分類のまとめ、一気に全部まとまりました!感動しました。 実はまだ、全部の構文が何をやっているか、完全理解してません。 特にScripting.Dictionaryの説明を読んでも今一つ……。 最初、全シート名が入っているのかと思って、分類名はキーにならないんじゃ…と悩みました。 (理解が悪くて書き込みが遅くなりました。申し訳ありません)
また調べて覚えようと思います。 本当にありがとうございました。 (おれんじー) 2017/08/03(木) 17:00
今回のサンプルコードでは、For i のループが2つありますね。 1回目のForループは、シート名に「まとめ」が含まれるものを対象に、辞書を作成しているのです。ステップ実行してみれば、具体的にどういう値が格納されるのか判りますが、たとえば「AAAまとめ」を見つけると、キーは「AAA」、アイテムは「AAAまとめ」として辞書に1件追加します。BBB等も同様に、「まとめ」が含まれていたら1件辞書追加します。
次に、2つ目のForループですが、今度は「まとめ」以外のシート名に反応します。例えば「AAA(aaa)」ですね。 これも文字列検索等で「AAA」だけ抜き出し、cwという変数に代入しています。
コピー元は現在調べているシートで良いですが、コピー先はAAAに該当するまとめシートですよね。これを、DIC("AAA")とすると、答えが「AAAまとめ」と返るのです。 これで、コピー先を決定している訳ですよ。
(???) 2017/08/03(木) 17:28
???様
すみません、金曜に社外に出てて気が付くのが遅くなりました。 失礼いたしました。
丁寧な解説をありがとうございます。 おかげさまでだいぶ内容がわかった(気になってる)と思います。 2つめのループで「「まとめ」以外のシート名に反応」させるところなんて、 自分ではとても思いつかない処理です。 こんな風に書けるようになりたいです。
辞書は一度リストを作っておけば、後の処理でかなり応用が利きそうですので、 使えるように勉強してみます。 楽しみです。
最後のフォローまでありがとうございました。
(おれんじー) 2017/08/07(月) 15:32
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.