[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『シートをコピーした後、コピーにだけ見出しに色を付ける』(kn)
以前、こちらでマクロを教えて頂いたときは大変助かりました。有り難うございます。 今回は、その前回のマクロに「シート見出しの色を付ける」という指示を追加したいのです。
Sub ボタン1_Click() Dim vntSheetName As Variant Dim WS1 As Worksheet Dim WS2 As Worksheet Dim lngRow As Long vntSheetName = "" Do While vntSheetName = "" vntSheetName = Application.InputBox("追加シート名を入力して下さい。", "シート追加", Type:=2) If VarType(vntSheetName) = vbBoolean Then MsgBox "キャンセルしました" Exit Do Else If wsexist(ThisWorkbook, vntSheetName) Then MsgBox vntSheetName & " : このシート名は既に存在します。違うシート名を指定してください" vntSheetName = "" End If End If Loop If Not VarType(vntSheetName) = vbBoolean Then Sheets("週報").Copy After:=Worksheets(Sheets.Count) Set WS1 = Worksheets("in") Set WS2 = ActiveSheet WS2.Name = vntSheetName lngRow = WS1.Range("A" & WS1.Rows.Count).End(xlUp).Offset().Row WS1.Cells(lngRow, 17).Value = vntSheetName WS1.Activate
End If
Dim ws As Worksheet, wsName() As String, i As Long Columns("Q").ClearContents ReDim wsName(1 To Worksheets.Count - 2, 1 To 1) For Each ws In Worksheets If ws.Name <> "in" And ws.Name <> "週報" And ws.Name <> "手書き用" Then i = i + 1 wsName(i, 1) = ws.Name End If Next ws Range("Q1").Resize(UBound(wsName)).Value = wsName End Sub '======================================================================== Function wsexist(ByVal bk As Workbook, ByVal shtnm As String) As Boolean 'wsexist true 指定のシート名は存在する ' false 指定のシート名は存在しない On Error Resume Next Err.Clear Dim wk As Object Set wk = bk.Sheets(shtnm) wsexist = Not CBool(Err.Number) On Error GoTo 0 End Function
※"in" = データ用シート "週報" = コピーする元のシート "手書き用" = マクロには関わってきません。
現在、ボタンをクリックするとシート名を指定して"週報"をコピー、 上記3つを除く全てのシート名を取得し、"in"に表示させるようになっています。
そこで、コピーしたほうのシートのみにシート見出しの色を統一で付けられる様にしたいのですが、如何せん初心者ゆえ、 どんなマクロなら良いのか、何処に組み込めばいいのかさっぱり見当がつきません。
宜しければアドバイスお願い致します。
OSはXP、バージョンは2007です。
何はさておき、まず「シート見出しに色を付ける」と言うコードが必要です。 これはマクロの記録で得られると思いますが、記録してみましたか?
また、お伺いしてみますが Set WS2 = ActiveSheet WS2.Name = vntSheetName この2行がどんな指示を出しているか 説明出来ますか?
(HANA)
HANA様、コメント有り難うございます。
通常、例として Sub Sample09() Worksheets("Sheet1").Tab.ColorIndex = 3 End Sub このようなマクロになりますよね。それは調べることが出来たのですが、これを何処にどう入れれば良いのかが分かりませんでした。
Set WS2 = ActiveSheet WS2.Name = vntSheetName この2つについてですが、一番最初に組んだときにこの掲示板にあるものをコピーして作成したので、 よく分かりません。 申し訳ないです。
えっと。。。そんなに難しく考えず
Set WS2 = ActiveSheet →アクティブシート をWS2にセットする・・・のかな?
WS2.Name = vntSheetName →WS2の名前を vntSheetName にする・・・のかな?
って読めませんか?
「vntSheetName」は、上の方で vntSheetName = Application.InputBox("追加シート名を入力して下さい。", "シート追加", Type:=2) 追加シート名を入力しましたね?
すると、WS2にはアクティブシートがセットされているのだから アクティブシートの名前を InputBox に入力した名前にする・・・のかな?
と思いませんか?
でも、その通りに動いていますよね?
シートタブの色を変えたいのは、Worksheets("Sheet1")ではなく どのシートだったら良いのですか?
まずはコピペでも動くコードを作るのが良いとは思いますが 動くコードが出来たら、内容を読んで行かないと いつまでたっても分かるようにはならないと思いますよ?
勿論、呪文のように覚えておけばよい部分もありますが Set とか Name とか InputBox とか ActiveSheet とか・・・・ そんなになじみの薄い単語ではないと思います。
(HANA)
HANA様の仰るとおりに動いておりました。
>シートタブの色を変えたいのは、Worksheets("Sheet1")ではなく >どのシートだったら良いのですか? それが、その時その時でつける名前が違うのでどうすればいいのかと悩んでおりまして。。 変数を指定すれば良いのでしょうか??
HANA様のお手を煩わせてしまい申し訳ないのですが、マクロを組んだりしても内容がなかなか理解できずにいつも苦労しております。
えっと。。。。 コピーしたシートの名前を変える時だって コピー後のシートの名前を指定して変更してませんよね?
Sheets("週報をコピーして出来たシート名を指定して").Name = vntSheetName ってしてませんよ?
何で指定せずに済んでるかって言うと
Sheets("週報").Copy After:=Worksheets(Sheets.Count) 週報シートをコピーしたら、コピー後のシートがアクティブに成ってますね? Set WS2 = ActiveSheet アクティブシートをWS2にセットしてます。アクティブシート=コピー後のシートです。 WS2.Name = vntSheetName WS2=アクティブシート=コピー後のシート・・・の名前を変更
しているので、週報シートをコピーした時のシート名が 週報(1) でも 週報(2) でも 週報(3) でも何になったとしても コピーしたシートの名前を vntSheetName に変更出来ます。
コピーしたシートのタブの色を変える時も 同じようにすればシートの名前を指定しなくても良いですよね?
WS2=アクティブシート=コピー後のシート・・・のタブの色を変更
>変数を指定すれば良いのでしょうか?? どうしてもシート名を指定したいなら 「vntSheetName」にシート名は入っていると思いますので そのまま使用すればよいと思います。
それから、シートは Sheets("週報").Copy After:=Worksheets(Sheets.Count) After = 後 Worksheets(Sheets.Count) = 一番最後のシート の 一番最後のシートの後にコピーされているので その時点での一番最後のシート = コピーしたシート と言う指定でも良いですね。
あまり難しく考えなくて良いと思いますが。。。 たくさんエラーも出してみて下さい。 エラーが出たコードをたくさん載せて下さい。 次の書き込み以上は、引っ張ろうとは思いませんので。
(HANA)
HANA様、アドバイス有り難う御座います。
一度「シートコピー→見出し色を付ける」というマクロを記録させ、 HANA様の説明を読みながら考えてみました。
Sub ボタン1_Click() Dim vntSheetName As Variant Dim WS1 As Worksheet Dim WS2 As Worksheet Dim lngRow As Long vntSheetName = "" Do While vntSheetName = "" vntSheetName = Application.InputBox("追加シート名を入力して下さい。", "シート追加", Type:=2) If VarType(vntSheetName) = vbBoolean Then MsgBox "キャンセルしました" Exit Do Else If wsexist(ThisWorkbook, vntSheetName) Then MsgBox vntSheetName & " : このシート名は既に存在します。違うシート名を指定してください" vntSheetName = "" End If End If Loop If Not VarType(vntSheetName) = vbBoolean Then Sheets("週報").Copy After:=Worksheets(Sheets.Count) Set WS1 = Worksheets("in") Set WS2 = ActiveSheet WS2.Name = vntSheetName lngRow = WS1.Range("A" & WS1.Rows.Count).End(xlUp).Offset().Row WS1.Cells(lngRow, 17).Value = vntSheetName WS1.Activate
End If
With Worksheets(Sheets.Count).Tab .Color = 255
End With
Dim ws As Worksheet, wsName() As String, i As Long Columns("Q").ClearContents ReDim wsName(1 To Worksheets.Count - 2, 1 To 1) For Each ws In Worksheets If ws.Name <> "in" And ws.Name <> "週報" And ws.Name <> "手書き用" Then i = i + 1 wsName(i, 1) = ws.Name End If Next ws Range("Q1").Resize(UBound(wsName)).Value = wsName End Sub '======================================================================== Function wsexist(ByVal bk As Workbook, ByVal shtnm As String) As Boolean 'wsexist true 指定のシート名は存在する ' false 指定のシート名は存在しない On Error Resume Next Err.Clear Dim wk As Object Set wk = bk.Sheets(shtnm) wsexist = Not CBool(Err.Number) On Error GoTo 0 End Function
で、色を指定する事が出来ました(これが正しいのかは分かりませんが…) 大変助かりました。ありがとうございます。
(kn)
出来ましたか、良かったです。
因みに With Worksheets(Sheets.Count).Tab .Color = 255 End With 3行で書いてありますが、With でまとめる必要は無さそうですよ? Worksheets(Sheets.Count).Tab.Color = 255
シート名が変数「vntSheetName」に入ったままに成っているので Worksheets(vntSheetName).Tab.Color = 255 でも良いと思います。
でも、せっかく Set WS2 = ActiveSheet WS2.Name = vntSheetName と言う記述が有るので、このすぐ下に WS2.Tab.Color = 255 でも良かったのではないかと思いますが。。。どうでしょう?
それから、前の話しの続きだと思いますが lngRow = WS1.Range("A" & WS1.Rows.Count).End(xlUp).Offset().Row WS1.Cells(lngRow, 17).Value = vntSheetName この2行は要らないんじゃないかと思います。
で、WS1.Activate の後に Call sheetsname とすると、↑と重複する部分のコードは不要に成ります。 [[20100301163618]] 『シートのコピー&削除とシート名の取得』(kn)
・・・と思ったのですが、最後にアクティブにするのは コピーしたシートですか・・・?
(HANA)
お返事が遅くなってしまい大変申し訳ございません。
>因みに > With Worksheets(Sheets.Count).Tab > .Color = 255 > End With >3行で書いてありますが、With でまとめる必要は無さそうですよ? > Worksheets(Sheets.Count).Tab.Color = 255 > >シート名が変数「vntSheetName」に入ったままに成っているので > Worksheets(vntSheetName).Tab.Color = 255 >でも良いと思います。
これを試してみたのですが、エラーが出てしまいました。 withでまとめる必要がないってことはそのまま書いてイイって事ではないんでしょうか? 私の読解力の問題でしょうか…
>それから、前の話しの続きだと思いますが > lngRow = WS1.Range("A" & WS1.Rows.Count).End(xlUp).Offset().Row > WS1.Cells(lngRow, 17).Value = vntSheetName >この2行は要らないんじゃないかと思います。 > >で、WS1.Activate の後に > Call sheetsname >とすると、↑と重複する部分のコードは不要に成ります。
この部分は仰るとおり、変更しても何も問題ありませんでした。
あと、最後にアクティブになるのは"in"のシートです。
(kn)
私の記述の仕方が悪かったようです。
Worksheets(Sheets.Count).Tab.Color = 255
でいけました。
HANA様のおかげで、マクロの考え方も前より分かってきたような気がします。 このデータのマクロもかなりスッキリしたコードになりました! 本当に有り難う御座いました。
(kn)
現在コードのシートをコピーする部分の処理は If Not VarType(vntSheetName) = vbBoolean Then Sheets("週報").Copy After:=Worksheets(Sheets.Count) Set WS1 = Worksheets("in") Set WS2 = ActiveSheet WS2.Name = vntSheetName WS2.Tab.Color = 255 WS1.Activate Call sheetsname End If となっていますか?
その場合、WS1 は Set した後一回しか使ってないですよね? ですので、Set せずに直接 Worksheets("in").Activate としても良いのではないかと思います。
また、WS2もSet してありますが With ActiveSheet .Name = vntSheetName .Tab.Color = 255 End With の様にしておけば、SW2の Set も不要になると思います。
(HANA)
アドバイス有り難う御座います。
Sub ボタン1_Click() Dim vntSheetName As Variant Dim lngRow As Long vntSheetName = "" Do While vntSheetName = "" vntSheetName = Application.InputBox("追加シート名を入力して下さい。", "シート追加",Type:=2) If VarType(vntSheetName) = vbBoolean Then MsgBox "キャンセルしました" Exit Do Else If wsexist(ThisWorkbook, vntSheetName) Then MsgBox vntSheetName & " : このシート名は既に存在します。違うシート名を指定してください" vntSheetName = "" End If End If Loop If Not VarType(vntSheetName) = vbBoolean Then Sheets("週報").Copy After:=Worksheets(Sheets.Count) With ActiveSheet .Name = vntSheetName .Tab.Color = 5287936 End With Worksheets("in").Activate Call sheetsname End If
End Sub
というようにしておけばいいでしょうか?
>というようにしておけばいいでしょうか? と言われると、ちょっとドキドキしちゃいますが 私ならその様にしておきます。
後で何度か出てくるなら Set した方が良い場合も有ると思います。 また、Set した方がご自身で分かりやすいと思えば Set すれば良いと思います。
今回の変更は、動きに関係する事ではなく 物語に関係する事なので。
例えば、Set するかしないかは 昔々ある所に、おじいさんとおばあさんが住んでいました。 おじいさんは山へ芝刈りに、おばあさんは川へ洗濯に行きました。 と言うお話と おじいさんを「人物1」おばあさんを「人物2」と表す事にします。 昔々ある所に、人物1と人物2が住んでいました。 人物1は山へ芝刈りに、人物2は川へ洗濯に行きました。 と言うお話の違いの様な感じです。
内容はどちらも同じです。 もしも、登場人物がおじいさんとおばあさんではなく キツネとタヌキに変更になった場合、 最初のお話では4箇所変更が必要ですが 次のお話では2箇所変更するだけで済みますね。
「人物1」と「人物2」を後で一度しか使わないなら Setしてもしなくても、2箇所の変更は必要なので 数の点から見るとどちらでも同じです。
ただ、この場合も この二つが、長いコードの中間と下の方に出てくる様なもので それを探し出して変更するのが面倒だと思うなら コードの最初の方にまとめて Set しておいても良いと思います。 後で追加の処理が有りそうだと思うのなら 現在不要でも先を見越して Set しておいても良いと思います。
ですが、使う前に「○○と表す事にします」と言う一文が必要ですし ○○で何を表す事にしたのか覚えておく必要が有ります。
ただ漫然と、参考にした元のコードがこうなっていたからその様にしていたコード と いくつかの方法の内どの方法でやろうかしっかり考えて作ったコード とでは そのコードに変更が必要に成った時に得られる物は違ってくると思います。
動くコードが出来たら、もう一歩踏み込んで頂くと良いと思います。 すると、他の人のコードを見る目(自分の参考に成りそうなコードを探す目)も 変わってくると思います。
(HANA)
HANA様、とても分かり易い解説ありがとうございます。 数ヶ月前に見様見真似でマクロをいじりはじめた私にですので、 今社内で使っているコードも半分理解、半分暗号といった具合でデバックするような事にならない限り コードを見たりすることもありませんでした。
今回、初めて1からマクロを組んで、HANA様はじめ色んな方からアドバイスを頂き 少しずつですが理解できるようになってきた様に思います。
これからももっと実用的なものが組めるよう勉強していきたいと思います。
本当にありがとうございました。
(kn)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.