VBAで二つの構文を繋げるには

このQ&Aのポイント
  • A1に数値化した日付を入力するとシート名表示に反映される。例えば2014/07/31でA1には20140731と入力するとシート名にも20140731が表示されます。
  • 複数のシートから今日のシート名になっているシートの色付けを行います。
  • 各月をまとめたシートで1~12のシート名に色付けします。
回答を見る
  • ベストアンサー

VBAで二つの構文を繋げるには

いつもお世話になります。 WIN7 EXCELL2010 です。 1) A1に 数値化した日付を入力するとシート名表示に反映される。  例えば 2014/07/31 で A1 には 20140731 と入力するとシート名にも      20140731 が表示 Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) If Target.Address = "$A$1" Then Sh.Name = Target.Range("A1").Value End Sub 2) 1)で表示された複数のシートから今日のシート名になっているシートの色付けです。 Private Sub Workbook_Open() Dim mySheet As Worksheet For Each mySheet In Worksheets mySheet.Tab.ColorIndex = 19 If mySheet.Name = Format(Now(), "yyyymmdd") Then mySheet.Tab.ColorIndex = 3 End If Next End Sub 3) 各月をまとめたシートで シート名は 1~12 あります。 このシート名にも色付けするため下記マクロを追加したいのですが、1)のマクロとどう繋げばいいか分かりません。 Private Sub Workbook_Open() Dim sh As Worksheet     For Each sh In Worksheets         If isnumeric(sh.Name) Then             sh.Tab.ColorIndex = xlNone             If sh.Name = Month(Now) Then                 sh.Tab.Color = 255 ' 赤             End If         End If     Next End Sub 同じ Private Sub Workbook_Open() で始まるので丸められることが可能ならも含めていい方法を御指導いただけると幸甚です。 宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • eden3616
  • ベストアンサー率65% (267/405)
回答No.2

追加です。 (1)についてですが、そのままでも動作はするとおもいますが・・・ (1ヶ所間違いがありましたので直しています:3行目) 既に使用されている名前であったり、シート名に設定出来ない文字の場合はエラーになるかとおもいます。 以下のようにすることでエラーを回避できます。 (無効な名前が入力された場合はダイアログが表示され、名前は変わりません) (1)のコード Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) If Target.Address = "$A$1" Then   Call StName_change(Sh, Target.Value) End If End Sub Private Sub StName_change(Sh As Object, word As String) On Error GoTo era   Sh.Name = word Exit Sub era: MsgBox word & "は無効な名前です" End Sub

dorasuke
質問者

お礼

早速にご丁寧な御指導誠に有難うございました。 色々試したもののなかなかうまく行かず困っていました。 ご質問して良かったです。

その他の回答 (1)

  • eden3616
  • ベストアンサー率65% (267/405)
回答No.1

(1)はそのままに (2)と(3)を合わせています。 Private Sub Workbook_Open() Dim mySheet As Worksheet For Each mySheet In Worksheets   mySheet.Tab.ColorIndex = xlNone   If mySheet.Name = Format(Now(), "yyyymmdd") Or mySheet.Name = Month(Now) Then     mySheet.Tab.ColorIndex = 3   End If Next End Sub

関連するQ&A

  • 複数の条件でVBAによるシートの並びえ変え

    いつもお世話になります。 WIN7 EXCELL2010 です。 シート数が多くなると並び替えが大変で何とかして省力化を図りたいです。 インターネットのVBAでシートでシートの並び替えをいろいろ調べましたがただ単純に 昇順 降順 でした。 もう少し工夫したVBAが可能ならばと下記のように考え御指導を仰ぎたいです。 御指導を仰ぎたいのは、 参照図で説明しますと 下側 が今月の並びです。 上側が 来月です。 だから マクロで 下側 から 上側 のようにシートの並び替えがマクロで可能でしょうか。 もしも可能ならご教授いただけませんでしょうか。 条件 1 シート名「記入」 は一番左側に 条件 2 シート名「祭日」 は一番右側に 条件 3 例えば今月の場合、 08 が 「記入」右側 その右から 0801 0802 0803 0804 という具合に 9月になると 例えばコマンドボタンで 09 が 「記入」右側 その右から 0901 0902 0903 0904 です ※ 1月~12月分があって途中で重くなることもあって過ぎたシートは適時削除します。 参考に 下記マクロはすでに適用しています。 1) シート名のマクロ (A1に文字列の数字 例えば今日ですと 20140802 08 で文字列です) Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) If Target.Address = "$A$1" Then Call StName_change(Sh, Target.Value) End If End Sub Private Sub StName_change(Sh As Object, word As String) On Error GoTo era Sh.Name = word Exit Sub era: MsgBox word & "は無効な名前です" End Sub 2) 該当日 該当月の色付けマクロ Private Sub Workbook_Open() Dim mySheet As Worksheet For Each mySheet In Worksheets mySheet.Tab.ColorIndex = xlNone If mySheet.Name = Format(Now(), "mmdd") Or mySheet.Name = Format(Now(), "mm") Then mySheet.Tab.ColorIndex = 3 End If Next End Sub 何かむつかしい質問をしていますが是非是非ご協力いただけませんでしょうか。

  • VBAでキャンセルしたときの構文は

    いつもお世話になりります。 WIN7 エクセル2010 です。 次のようなマクロがあります。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$C$10" Then Target.Offset(-6, 2).Value = Date End If If Target.Address = "$C$10" Then ActiveSheet.Tab.ColorIndex = 49 End If End Sub この場合、 C10 をクリアーした時 「G4(-6,2)の日付 と シートタブの色」 の両方をクリアーすることも可能でしょうか。 もし可能ならばご指導願えませんか。

  • マクロで二つの構文を繋ぐには

    いつもお世話になります。 WIN7 EXCELL2010 です。 Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) If Target.Address = "$A$1" Then Sh.Name = Target.Range("A1").Value End Sub ThisWorkbook に上記のマクロに下記のマクロを追加したいのですが、 End Sub の ところを End If End With などに変えたのですがうまくゆきません。 御指導お願いできませんでしょうか。 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Dim myRange As Range Set myRange = Intersect(Target, Range("M3:V27")) If Not myRange Is Nothing Then Select Case Target.Value Case "" Target.Value = "○" Case "○" Target.Value = "●" Case Else Target.ClearContents End Select Cancel = True End If End Sub 宜しくお願いいします。

  • マクロでシート名を変更を変更したい

    A1セルの値をシート名にするマクロは以下のとおりだと思います。 Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) If Target.Address = "$A$1" Then Sh.Name = Target.Range("A1").Value End Sub では、E6セルの値をシート名にすることは可能でしょうか? よろしくお願いします。

  • Excelでシート名と最終更新日を自動表示したい

    Excelを使って (1)セルA1に入れた名目をシート名にし (2)セルH1には、最終更新日を自動で入れたいです。 調べた結果、 シート名を右クリックして「コードの表示」から (1)は Private Sub Worksheet_Change(ByVal Target As Range) Sheets(1).Name = Range("B1") End Sub を入れてうまくいきましたが、 (2)は Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)  If ThisWorkbook.Saved = False Then   Worksheets("Sheet1").Range("H1").Value = Date  End If End Sub を入れてみましたが(←調べましたもの) うまくいきませんでした。 単純に、 Private Sub Worksheet_Change(ByVal Target As Range) Sheets(1).Name = Range("B1") End Sub Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)  If ThisWorkbook.Saved = False Then   Worksheets("Sheet1").Range("H1").Value = Date  End If End Sub とつなげて入れるのではだめなんでしょうか? それとも、(2)の何かが間違っていますか? ご教授願います。

  • 今日の日付に該当するシート名に赤色を

    いつもお世話になります。 WIN7 EXCELL2010 です。 A1に「20140721」と記入しエンターキーを押すと下記のマクロでシート名が自動で「20140721」となるようにしています。 例えば今日(7月21日)になったら自動で赤色にしていくつかあるシートの中で今日のシートを目指させたいのでご指導いただけませんでしょうか。 参考に Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) If Target.Address = "$A$1" Then Sh.Name = Target.Range("A1").Value End Sub 是非ご協力をお願いします。

  • ThisWorkBookモジュールとSheetモジュールの両立

    エクセル2003でマクロを組んでいます。 Sheet1,Sheet2の2つのシートがあり、 片方のシートの"A4:G10"の範囲に値を書き込むと、もう片方の同じ位置に同じ値が書き込まれるようなマクロを組みたいです。 以前ここで教えていただいたものを改変して以下を作りました(ThisWorkBookモジュールです)。 Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) Dim r As Range Dim Num As Integer Dim S As String, Sh_name As String Sh_name = ActiveSheet.Name Set r = Intersect(Target, Range("A4:G10")) If Not (r Is Nothing) Then Application.EnableEvents = False For Num = 1 To 2 S = "Sheet" & Num If S <> Sh_name Then Worksheets(S).Range(r.Address).Value = r.Value End If Next Application.EnableEvents = True End If End Sub ここまでは正常に動作します。 また、 Sheet1とSheet2のモジュールに、 A列のセルに値が入力された場合、同じ行のC列のセルの色を塗るという記述をしています。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column = 1 Then Cells(Target.Row, 3).Interior.ColorIndex = 5 End If End Sub これらを同時に生かしたいのですが、 どのように書けばいいでしょうか。 EnableEvents = False/Trueを消してしまうと、 Worksheets(S).Range(r.Address).Value = r.Valueが実行されるたびにThisWorkBookモジュールが動いているようです。 そして2回目のSet r = Intersect(Target, Range("A4:G10"))でエラーが出ます。 (エラーは出ずとも延々と(無限ではない回数)ThisWorkBookモジュールを繰り返したコードもありました。) よろしくお願いします。

  • <マクロ・VBA> 大きいEnterキーを押してVBA処理

    はじめまして。よろしくお願いします。 ワークシートに入力して、 入力内容により色をつけるというVBAを作っています。 Enterキー(大きい方)を押したら 即時情報が更新されるものを作りたいんですが、 大きいEnterキーで更新する方法が分かりません。 どうぞご教授宜しくお願いします。 やりたいこと>> (1)大きいEnterキーを押してすぐ内容を判定して行に色をつける (2)行の色は以下の通り  削除…赤  変更…薄い黄色  その他…色はなし 記述>> 【ThisWorkBook】 Private Sub Workbook_Open() キー定義 End Sub Private Sub Workbook_BeforeClose(Cancel As Boolean) キー定義の解除 End Sub -------------------------------------------------- 【標準モジュール】 Sub キー定義() Application.OnKey "{ENTER}", "判定" End Sub Sub 判定() If ActiveWorkbook.Name = "色付けテスト" Then If ActiveCell.Value = "削除" Then ActiveCell.EntireRow.Interior.ColorIndex = 3 ElseIf ActiveCell.Value = "変更" Then ActiveCell.EntireRow.Interior.ColorIndex = 36 Else: ActiveCell.EntireRow.Interior.ColorIndex = xlNone End If End If End Sub 今のところはテンキーのEnterキーで対応しています。 よろしくお願いします。

  • Excel VBA シート名を条件に使用して…

    Excel2003を使用しています。 C列に特定の文字が入力されたら、その行のG列に、ある数式を入力したく、イベントマクロを作成しましたが、シートがたくさんあるときや、シートの追加がある場合は、クラスモジュールを使用するとよいということを過去の質問から参考にさせていただき、下記のクラスモジュールを作成しました。 ------------------------------------------------------- Public WithEvents myApp As Application Private Sub myApp_sheetchange(ByVal sh As Object, ByVal target As Range)  If Len(sh.Name) = 4 Then   If target.Column = 3 And target.Row >= 4 Then    If target.Value = "特定の文字" Then     Cells(target.Row, 7).FormulaR1C1 = "=数式A"    End If   End If  End If End Sub ------------------------------------------------------- 上記マクロを使用しているBook中の30数枚のシート名は「1234」というように、4桁の数字(全角)になっているのですが、さらに条件を加えて、例えば、シート名の数字が「1250」以下の場合は、Aという数式を入力し、シート名の数字が「2000」以上の場合は、Bという数式を入力するという条件でも可能でしょうか? 可能な場合、どのようにコードを記述すればいいのでしょうか? よろしくお願いします。

  • エクセルVBA 双方向での書式のリンク方法

    エクセルVBAにて双方向での書式のリンクをさせたいと考えています。 具体的にはセルの背景色の双方向リンク方法について教えていただきたいです。ここで双方向での背景色のリンクとは別々のシート上のセルの背景色をどちら側の変更であっても、もう一方に変更を反映させることです。 【シート1】 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$A$1" Then Sheets("Sheet2").Range("$A$1").Value = Sheets("Sheet1").Range("$A$1").Value Sheets("Sheet2").Range("$A$1").Interior.ColorIndex = Sheets("Sheet1").Range("$A$1").Interior.ColorIndex End If End Sub 【シート2】 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$A$1" Then Sheets("Sheet1").Range("$A$1").Value = Sheets("Sheet2").Range("$A$1").Value Sheets("Sheet1").Range("$A$1").Interior.ColorIndex = Sheets("Sheet2").Range("$A$1").Interior.ColorIndex End If End Sub 上記のコードを記述しています。値のリンクはできているのですが背景色のリンクがどうしてもうまくできません。どちらかの変更と同時にもう一方の背景色も変更されるようにするにはどうすればよいでしょうか? どんな方法でもかまいませんのでお詳しい方よろしくお願いします。

専門家に質問してみよう