Excelシートのリンク方法について

このQ&Aのポイント
  • エクセル2010を利用して、シート1のA1~C1のセルで文字揃えを制御するコードを作成しています。
  • シート1のA1~C1に文字を入力すると、同じ文字と文字揃えがシート2とシート3にも反映されるようにしたいです。
  • しかし、シート1でどこかのセルを選択しないと文字揃えが反映されず、画面が切り替わる問題が発生しています。解決策を教えてください。
回答を見る
  • ベストアンサー

excel|シートのリンク方法について

いつもお世話になります。 エクセルは2010を利用しています。 現在、下記のコードで、文字揃えを制御しています。 A1~C1は、それぞれセルが結合されています。 ---------------------------------------------------------- Sub HorizontalAndVerticalAlignmentSamp1() If Range("B1").Value = "" Then With Range("C1") .HorizontalAlignment = xlHAlignRight End With Else With Range("C1") .HorizontalAlignment = xlHAlignLeft End With End If If Range("A1").Value = "" Then With Range("B1") .HorizontalAlignment = xlHAlignRight End With Else With Range("B1") .HorizontalAlignment = xlHAlignCenter End With End If End Sub Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Range("A1:C1") <> "" Then Call HorizontalAndVerticalAlignmentSamp1 End Sub ------------------------------------------------------------------------- シート2、シート3は、A1~C1のセルがシート1とおなじように結合されています。 シート1で、A1~C1に文字を入力したら、おなじ文字と文字揃えがシート2、シート3でも反映、シート1で、A1~C1に入力されていた文字を削除すると、シート2、シート3も消えているようにしたいです。 わたしの知っている限りの範囲でがんばってみたことは シート2、シート3のA1に「=Sheet1!A1」、B1に「=Sheet1!B1」、C1に「=Sheet1!C1」と入力して シート2、シート3にも上記とおなじマクロを記述してみました。 けれど、シート1で入力しても、シート2、シート3を選択して、どこかのセルを1回選択しないと、文字揃えが反映されませんでした。 そこで、 シート1の上記マクロに Sheet2.select Sheet3.select Sheet1.select を追加してみました。 けれど、あたりまえといえばあたりまえなのですが、シート1でどこかのセルを選択するごとにシート2、シート3、シート1と画面が切り替わるようになり、画面が切り替わったあとにシート2、シート3を見てみても、文字揃えはどこかのセルを選択しないかぎりおなじく反映されませんでした。 どのようにしたらいいのかが分からず、質問いたしました。 みなさまのお知恵を借していただけますと幸いです。 どうかよろしくお願いいたします。

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

  • ベストアンサー
  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.7

#2-6、cjです。#6補足欄へのレスです。 編集が難しいということのようですし、 元々1行めしか想定して書いていませんでしたから、 その点を考慮に入れて、設計変えました。 この際、統一します。 セル範囲がどのように変更になろうとも、 3つの(結合)セルという前提が崩れない限り、 指定箇所 にある、セル参照文字列、だけを修正すれば、 対応できるように書き直しました。 ' ' 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓 ' ' 以下、Sheet1モジュール ' cj8271875_5 Private Sub Worksheet_Change(ByVal Target As Range)   Const fSRef = "D13,G13,I13"  ' 指定箇所 3つの結合セルの左上セルの番地をそれぞれカンマ区切りで '  Const fSRef = "A1,D1,F1"  ' No.5 での追加オーダー の場合 '  Const fSRef = "A1,B1,C1"  ' 原質問 の場合   Dim arrRef() As String   Dim wsh As Worksheet   Dim HAlignB As Excel.XlHAlign   Dim HAlignC As Excel.XlHAlign   If Intersect(Range(fSRef), Target(1)) Is Nothing Then Exit Sub   arrRef() = Split(fSRef, ",")   Application.EnableEvents = False   On Error GoTo ErrHndl_   For Each wsh In Sheets(Array("Sheet2", "Sheet3"))     wsh.Cells(Target.Row, Target.Column).Value = Target(1).Value   Next   On Error GoTo 0   Application.EnableEvents = True   If Range(arrRef(1)).Value = 0 Then     HAlignC = xlHAlignRight   Else     HAlignC = xlHAlignLeft   End If   If Range(arrRef(0)).Value = 0 Then     HAlignB = xlHAlignRight   Else     HAlignB = xlHAlignCenter   End If   For Each wsh In Sheets(Array("Sheet1", "Sheet2", "Sheet3"))     wsh.Range(arrRef(1)).HorizontalAlignment = HAlignB     wsh.Range(arrRef(2)).HorizontalAlignment = HAlignC   Next   Exit Sub ErrHndl_:   MsgBox "シート: Sheet1" & vbLf & "セル範囲:" & Target(1).Address(0, 0) _     & vbLf & vbTab & ".Valueプロパティの取得" & vbLf & "  または" _     & vbLf & "シート: " & wsh.Name & vbLf & "セル範囲:" & Target(1).Address(0, 0) _     & vbLf & vbTab & ".Valueプロパティの設定" & vbLf & "  に失敗しました。" _     & vbLf & vbLf & "実行時エラー'" & Err & vbLf & Err.Description, vbExclamation   Resume Next End Sub ' ' 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓

masarin16
質問者

お礼

cj_moverさまへ これまでいろいろと親身に教えてくださいまして、ほんとうにありがとうございました。 cj_moverさんが教えてくださいましたコードを元に、下記のように少し修正を加えまして、無事うまくいきました。 -------------------------------------------------------------------------------------------------------- Private Sub Worksheet_Change(ByVal Target As Range) Const fSRef = ("D13,G13,I13") ' 指定箇所 3つの結合セルの左上セルの番地をそれぞれカンマ区切りで Const fSRef1 = ("A1,D1,F1") ' No.5 での追加オーダー の場合 '  Const fSRef = "A1,B1,C1"  ' 原質問 の場合 Dim arrRef() As String Dim wsh As Worksheet Dim HAlignB As Excel.XlHAlign Dim HAlignC As Excel.XlHAlign If Intersect(Range(fSRef), Target(1)) Is Nothing = False Then arrRef() = Split(fSRef, ",") Application.EnableEvents = False 'For Each wsh In Sheets(Array("sheet2", "sheet3")) ' wsh.Cells(Target.Row, Target.Column).Value = Target(1).Value ' Next Application.EnableEvents = True If LenB(Range(arrRef(1))) = 0 Then HAlignC = xlHAlignRight Else HAlignC = xlHAlignLeft End If If LenB(Range(arrRef(0))) = 0 Then HAlignB = xlHAlignRight Else HAlignB = xlHAlignCenter End If For Each wsh In Sheets(Array("sheet1", "sheet2", "sheet3")) wsh.Range(arrRef(1)).HorizontalAlignment = HAlignB wsh.Range(arrRef(2)).HorizontalAlignment = HAlignC Next ElseIf Intersect(Range(fSRef1), Target(1)) Is Nothing = False Then arrRef() = Split(fSRef1, ",") Application.EnableEvents = False ' For Each wsh In Sheets(Array("sheet2", "sheet3")) ' wsh.Cells(Target.Row, Target.Column).Value = Target(1).Value ' Next Application.EnableEvents = True If LenB(Range(arrRef(1))) = 0 Then HAlignC = xlHAlignRight Else HAlignC = xlHAlignLeft End If If LenB(Range(arrRef(0))) = 0 Then HAlignB = xlHAlignRight Else HAlignB = xlHAlignCenter End If For Each wsh In Sheets(Array("sheet1", "sheet2", "sheet3")) wsh.Range(arrRef(1)).HorizontalAlignment = HAlignB wsh.Range(arrRef(2)).HorizontalAlignment = HAlignC Next End If End Sub -------------------------------------------------------------------------------------- 「D13,G13,I13」「A1,D1,F1」と2箇所ほしかったので、いろいろ調べてみまして If Intersect(Range(fSRef), Target(1)) Is Nothing = False Then ・ ・ elseif Intersect(Range(fSRef1), Target(1)) Is Nothing = False Then ・ ・ endif というふうにして、うまくいきました。 また -------------------------------------------------------- Application.EnableEvents = False For Each wsh In Sheets(Array("sheet2", "sheet3")) wsh.Cells(Target.Row, Target.Column).Value = Target(1).Value Next Application.EnableEvents = True ------------------------------------------------------------------------ の箇所では、すでに入力している「A1:E3」の2つの結合セルを選択して「DELETE」を押しますと sheet1は2つの結合セルに入力した値が消えますが、sheet2,sheet3では、「D1:E3」の結合セルの値が削除 されませんでした。 そこで、あえて上記のコードをいったんとめて sheet2,sheet3には入力するセル全部に「=Sheet1!A1」というふうにしてリンクすることで解決いたしました。 また、当初は ------------------------------------ If Range(arrRef(1)).Value = 0 Then ------------------------------------ ------------------------------------ If Range(arrRef(1)).Value = "" Then ------------------------------------ としていたのですが たとえば A1 B1 C1 10 000 123 と入力した場合、B1には「000」と入力しているけど 上記では「なにも入力されていない」と判断され、「HAlignC = xlHAlignRight」を返されて都合が悪くなりました。 そこで、なにかいい方法はないかといろいろ調べてみまして LenB関数がセルのバイト数を返すのを見つけて、これだったらもしかしたらいけるかもと思い、試してみました。 結果、うまくいきました。 cj_moverさんにお力添えをいただいたおかげで、期待どおりの動作をするようになりました。 ほんとうにありがとうございました。

その他の回答 (6)

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.6

先頃、帰宅しました。 #2-5、cjです。 #5補足欄へのレスです。 修正の件、 惜しい。もう少しでしたね。 修正ポイント、★マークにしています。 見比べて確認してみてください。 # それから、気にしなくていいですよ。^^ 何か疑問が残っているなら訊いといて貰った方がありがたい位です。 では、また。 ' ' 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓 ' ' 以下、Sheet1モジュール ' cj8271875_3.5 Private Sub Worksheet_Change(ByVal Target As Range)   If Target.Row > 1 Then Exit Sub   If Target.Column > 6 Then Exit Sub  '  ★   Dim wsh As Worksheet   Dim r As Range   With Range("F1")  '  ★     If Range("D1").Value = "" Then  '  ★       .HorizontalAlignment = xlHAlignRight     Else       .HorizontalAlignment = xlHAlignLeft     End If   End With   With Range("D1")  '  ★     If Range("A1").Value = "" Then       .HorizontalAlignment = xlHAlignRight     Else       .HorizontalAlignment = xlHAlignCenter     End If   End With   Application.EnableEvents = False   On Error GoTo ErrHndl_   For Each wsh In Sheets(Array("Sheet2", "Sheet3"))     For Each r In Range("A1,D1,F1")  '  ★       r.MergeArea.Copy Destination:=wsh.Cells(r.Column)     Next   Next   Application.EnableEvents = True   Exit Sub ErrHndl_:   MsgBox "シート: " & wsh.Name & vbLf & "セル範囲:" & r.Column & " 列め" _     & vbLf & vbTab & "への貼付けが失敗しました。" _     & vbLf & "異なるサイズの結合セルへ貼付けようとしているようです。" _     & vbLf & vbLf & "実行時エラー'" & Err & vbLf & Err.Description, vbExclamation     Resume Next End Sub ' ' 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓 ' ' 以下、Sheet1モジュール ' cj8271875_4.5 Private Sub Worksheet_Change(ByVal Target As Range)   If Target.Row > 1 Then Exit Sub   If Target.Column > 6 Then Exit Sub  '  ★   Dim wsh As Worksheet   Dim HAlignB As Excel.XlHAlign   Dim HAlignC As Excel.XlHAlign   Application.EnableEvents = False   On Error GoTo ErrHndl_   For Each wsh In Sheets(Array("Sheet2", "Sheet3"))     wsh.Cells(Target.Column).Value = Target(1).Value   Next   On Error GoTo 0   Application.EnableEvents = True   If Range("D1").Value = "" Then  '  ★     HAlignC = xlHAlignRight   Else     HAlignC = xlHAlignLeft   End If   If Range("A1").Value = "" Then     HAlignB = xlHAlignRight   Else     HAlignB = xlHAlignCenter   End If   For Each wsh In Sheets(Array("Sheet1", "Sheet2", "Sheet3"))     wsh.Range("D1").HorizontalAlignment = HAlignB  '  ★     wsh.Range("F1").HorizontalAlignment = HAlignC  '  ★   Next   Exit Sub ErrHndl_:   MsgBox "シート: Sheet1" & vbLf & "セル範囲:" & Target(1).Address(0, 0) _     & vbLf & vbTab & ".Valueプロパティの取得" & vbLf & "  または" _     & vbLf & "シート: " & wsh.Name & vbLf & "セル範囲:" & Target(1).Address(0, 0) _     & vbLf & vbTab & ".Valueプロパティの設定" & vbLf & "  に失敗しました。" _     & vbLf & vbLf & "実行時エラー'" & Err & vbLf & Err.Description, vbExclamation   Resume Next End Sub ' ' 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓

masarin16
質問者

補足

cj_moverさまへ お返事が遅くなり、申し訳ございません。 早急なご回答をくださいまして、ほんとうにありがとうございます。 また、「気にしなくていいですよ」と言ってくださいましたこと とてもうれしかったです。 教えていただいたコード、「cj8271875_3.5」「 cj8271875_4.5」を試してみましたところ パターン2の結合セルでも無事に動くようになりました!(^^) ありがとうございます。 ただ、今回つくっていたエクセルBOOKで、A1:I3につくっていたところを C13:K15にもっていかないといけなくなってしまいました。 そこで、下記のコードにそれぞれ修正してみました。 ■cj8271875_3.5 --------------------------------------------------------------------------------- Private Sub Worksheet_Change(ByVal Target As Range) 'If Target.Row > 1 Then Exit Sub 'If Target.Column > 6 Then Exit Sub '  ★ Dim wsh As Worksheet Dim r As Range With Range("h13") '  ★ If Range("f13").Value = "" Then '  ★ .HorizontalAlignment = xlHAlignRight Else .HorizontalAlignment = xlHAlignLeft End If End With With Range("f13") '  ★ If Range("c13").Value = "" Then .HorizontalAlignment = xlHAlignRight Else .HorizontalAlignment = xlHAlignCenter End If End With Application.EnableEvents = False On Error GoTo ErrHndl_ For Each wsh In Sheets(Array("Sheet2", "Sheet3")) For Each r In Range("c13,f13,h13") '  ★ r.MergeArea.Copy Destination:=wsh.Cells(r.Column) Next Next Application.EnableEvents = True Exit Sub ErrHndl_: MsgBox "シート: " & wsh.Name & vbLf & "セル範囲:" & r.Column & " 列め" _ & vbLf & vbTab & "への貼付けが失敗しました。" _ & vbLf & "異なるサイズの結合セルへ貼付けようとしているようです。" _ & vbLf & vbLf & "実行時エラー'" & Err & vbLf & Err.Description, vbExclamation Resume Next End Sub --------------------------------------------------------------------------------------- こちらを実行してみましたところ sheet1は正常だったのですが sheet2,sheet3では、「C1:E3」「F1:G3」「H1:K3」の結合セルが作成されて そのなかにsheet1で入力した数字がコピーされていました。 ■cj8271875_4.5 ------------------------------------------------------------------------------ Private Sub Worksheet_Change(ByVal Target As Range) 'If Target.Row > 1 Then Exit Sub 'If Target.Column > 6 Then Exit Sub '  ★ Dim wsh As Worksheet Dim HAlignB As Excel.XlHAlign Dim HAlignC As Excel.XlHAlign Application.EnableEvents = False On Error GoTo ErrHndl_ For Each wsh In Sheets(Array("Sheet2", "Sheet3")) wsh.Cells(Target.Column).Value = Target(1).Value Next On Error GoTo 0 Application.EnableEvents = True If Range("f13").Value = 0 Then '  ★ HAlignC = xlHAlignRight Else HAlignC = xlHAlignLeft End If If Range("c13").Value = 0 Then HAlignB = xlHAlignRight Else HAlignB = xlHAlignCenter End If For Each wsh In Sheets(Array("Sheet1", "Sheet2", "Sheet3")) wsh.Range("f13").HorizontalAlignment = HAlignB '  ★ wsh.Range("h13").HorizontalAlignment = HAlignC '  ★ Next Exit Sub ErrHndl_: MsgBox "シート: Sheet1" & vbLf & "セル範囲:" & Target(1).Address(0, 0) _ & vbLf & vbTab & ".Valueプロパティの取得" & vbLf & "  または" _ & vbLf & "シート: " & wsh.Name & vbLf & "セル範囲:" & Target(1).Address(0, 0) _ & vbLf & vbTab & ".Valueプロパティの設定" & vbLf & "  に失敗しました。" _ & vbLf & vbLf & "実行時エラー'" & Err & vbLf & Err.Description, vbExclamation Resume Next End Sub -------------------------------------------------------------------------------------------------------------- sheet1では、正常なのですが sheet2,sheet3では、sheet1で入力した数字が「C1」「F1」「H1」に入力されてしまいました。 「cj8271875_3.5」「 cj8271875_4.5」の下記のところで r.MergeArea.Copy Destination:=wsh.Cells(r.Column) wsh.Cells(Target.Column).Value = Target(1).Value offsetをつけてみたり、Target(1)の箇所をいろいろ変更してみましたが 解決できませんでした。 上記についてご教授いただけますと、とてもうれしく思いますm(_ _)m

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.5

#2-4、cjです。 #4の続きです。 ちょっとやそっとエラーにならない堅い書き方も挙げておきます。 もう少しシンプルに書きたい感じはしますし、 逆に、もっと変数増やして丁寧に書きたい感じもしますが、 処理自体は寧ろこれまでのものより軽くなっています。 .Value プロパティ と .HorizontalAlignment プロパティ にしか触って(変更を加えて)いませんから、 (UserInterfaceOnly 未設定にて)シートの保護でもしない限り、 エラーは相当に考え難いです。 特に説明しませんけれど、何かあったら訊いてください。 # えーと、どれを選ぶもご自由に^^どうぞ。 Sheet2, Sheet3 にて、Worksheet_Change イベントを使っていなければ、 ▼マークの行(2カ所)は不要です。 エラートラップ、必要とは思えないので、 もし、そちらで判断できましたら、 ◆マークの行(6カ所)は削除して構いません。 ' ' 以下、Sheet1モジュール ' cj8271875_4 Private Sub Worksheet_Change(ByVal Target As Range)   If Target.Row <> 1 Then Exit Sub   If Target.Column > 3 Then Exit Sub   Dim wsh As Worksheet   Dim HAlignB As Excel.XlHAlign   Dim HAlignC As Excel.XlHAlign   ' ' Sheet2, Sheet3 .Valueを設定   Application.EnableEvents = False  '  ▼   On Error GoTo ErrHndl_  '  ◆   For Each wsh In Sheets(Array("Sheet2", "Sheet3"))     wsh.Cells(Target.Column).Value = Target(1).Value   Next   On Error GoTo 0  '  ◆   Application.EnableEvents = True  '  ▼   ' ' Sheet1, Sheet2, Sheet3 .HorizontalAlignmentを設定   If Range("B1").Value = "" Then     HAlignC = xlHAlignRight   Else     HAlignC = xlHAlignLeft   End If   If Range("A1").Value = "" Then     HAlignB = xlHAlignRight   Else     HAlignB = xlHAlignCenter   End If   For Each wsh In Sheets(Array("Sheet1", "Sheet2", "Sheet3"))     wsh.Cells(2).HorizontalAlignment = HAlignB     wsh.Cells(3).HorizontalAlignment = HAlignC   Next   Exit Sub  '  ◆ ErrHndl_:  '  ◆  ←↓   MsgBox "シート: Sheet1" & vbLf & "セル範囲:" & Target(1).Address(0, 0) _     & vbLf & vbTab & ".Valueプロパティの取得" & vbLf & "  または" _     & vbLf & "シート: " & wsh.Name & vbLf & "セル範囲:" & Target(1).Address(0, 0) _     & vbLf & vbTab & ".Valueプロパティの設定" & vbLf & "  に失敗しました。" _     & vbLf & vbLf & "実行時エラー'" & Err & vbLf & Err.Description, vbExclamation   Resume Next  '  ◆ End Sub

masarin16
質問者

補足

cj_moverさまへ 早急なお返事をいただきまして、ほんとうにありがとうございます。 No.4で教えていただいたコードを試してみましたところ、エラーなく バッチリ動くようになりました! また、お礼を書きかけ中に、No.5のお返事をいただきまして、本当に感謝しております。 No.5も同様にバッチリ動きました。 ほんとうにありがとうございます。 けれど、数字を打つところが2パターンありまして、そのひとつが、いま解決しましたA1:A2の結合セル、B1:B2の結合セル、C1:C2の結合セルです。 そして、もうひとつのパターンが、A1:C3の結合セル、D1:E3の結合セル、F1:I3の結合セルです。 シート内で見たとき、A1:C3、D1:E3、F1:I3の結合セルのサイズは違いますが A1:C3の結合セル、D1:E3の結合セル、F1:I3の結合セルのサイズはsheet1~sheet3でおなじです。 上記の結合セルのもと、No.4でご教授いただいたコードを下記のように一部変更して試してみましたところ、機能はするのですが、そのつど -------------------------------------------------- シート:sheet2 セル範囲:2列め への貼り付けが失敗しました。 異なるサイズの結合セルへ貼り付けようとしているようです。 実行時エラー’1004 結合されたセルの一部を変更することはできません。 -------------------------------------------------------- がでてしまいました。 ---------------------------------------------------------------------------- Private Sub Worksheet_Change(ByVal Target As Range) Dim wsh As Worksheet Dim r As Range With Range("f1") If Range("d1").Value = 0 Then .HorizontalAlignment = xlHAlignRight Else .HorizontalAlignment = xlHAlignLeft End If End With With Range("d1") If Range("A1").Value = 0 Then .HorizontalAlignment = xlHAlignRight Else .HorizontalAlignment = xlHAlignCenter End If End With Application.EnableEvents = False On Error GoTo ErrHndl_ For Each wsh In Sheets(Array("Sheet2", "Sheet3")) For Each r In Range("A1:f1") r.MergeArea.Copy Destination:=wsh.Cells(r.Column) Next Next Application.EnableEvents = True Exit Sub ErrHndl_: MsgBox "シート: " & wsh.Name & vbLf & "セル範囲:" & r.Column & " 列め" _ & vbLf & vbTab & "への貼付けが失敗しました。" _ & vbLf & "異なるサイズの結合セルへ貼付けようとしているようです。" _ & vbLf & vbLf & "実行時エラー'" & Err & vbLf & Err.Description, vbExclamation Resume Next End Sub ------------------------------------------------------------------------------------ 教えていただいたNo.5のコードをおなじく下記のコードにしてみましたところ、 上記のようなエラーはでなかったのですが、セルの文字揃えがうまく機能しなくなってしまいました。 ------------------------------------------------------------------------------------- Private Sub Worksheet_Change(ByVal Target As Range) Dim wsh As Worksheet Dim HAlignB As Excel.XlHAlign Dim HAlignC As Excel.XlHAlign ' ' Sheet2, Sheet3 .Valueを設定 Application.EnableEvents = False '  ▼ On Error GoTo ErrHndl_ '  ◆ For Each wsh In Sheets(Array("Sheet2", "Sheet3")) wsh.Cells(Target.Column).Value = Target(1).Value Next On Error GoTo 0 '  ◆ Application.EnableEvents = True '  ▼ ' ' Sheet1, Sheet2, Sheet3 .HorizontalAlignmentを設定 If Range("d1").Value = 0 Then HAlignC = xlHAlignRight Else HAlignC = xlHAlignLeft End If If Range("A1").Value = 0 Then HAlignB = xlHAlignRight Else HAlignB = xlHAlignCenter End If For Each wsh In Sheets(Array("Sheet1", "Sheet2", "Sheet3")) wsh.Cells(2).HorizontalAlignment = HAlignB wsh.Cells(3).HorizontalAlignment = HAlignC Next Exit Sub '  ◆ ErrHndl_: '  ◆  ←↓ MsgBox "シート: Sheet1" & vbLf & "セル範囲:" & Target(1).Address(0, 0) _ & vbLf & vbTab & ".Valueプロパティの取得" & vbLf & "  または" _ & vbLf & "シート: " & wsh.Name & vbLf & "セル範囲:" & Target(1).Address(0, 0) _ & vbLf & vbTab & ".Valueプロパティの設定" & vbLf & "  に失敗しました。" _ & vbLf & vbLf & "実行時エラー'" & Err & vbLf & Err.Description, vbExclamation Resume Next '  ◆ End Sub --------------------------------------------------------------------------------------- 最初のパターンで、結合セルが解決できると、もうひとつのパターンの結合セルでも機能すると安易に考えていたため、cj_moverさんにもうひとつのパターンについて伝えておらず、たいへん申し訳ございませんでした。 もし伝えていたら、そのことも考慮されてコードを書かれていたと思いますので、お手間をとらせてしまいました。 もうひといきの感じがしますので、ご教授いただけますと幸いです。

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.4

#2、3、cjです。 #3、補足欄へのレスです。 まずは、すみません、ミス(ポカ)してました。     Range("A1:A3").Copy Destination:=wsh.Range("A1") ではなくて、意図したのは(実際にテストしていた記述は)、     Range("A1:C1").Copy Destination:=wsh.Range("A1") でした。ごめんなさい。 ----------------------------------------------------------------- 実行時エラー'1004': 結合されたセルの一部を変更することはできません。 ----------------------------------------------------------------- Excel2010であらためて確認してみましたが、 補足いただいた条件では、     Range("A1:C1").Copy Destination:=wsh.Range("A1") または、     Range("A1:C2").Copy Destination:=wsh.Range("A1") のような記述で問題なく処理されます。 もし、それでも、そのエラーが出るとすると、 原因候補1◆3つの結合セルのサイズが異なる場合、 原因候補2◆3つのシート間でそれぞれの結合セルのサイズが異なる場合、 という風に原因は限定されます。 とりあえず、原因候補1◆だけ対策してみます。 一応エラートラップ掛けました。 混乱するといけないので、既出のコードは削除して試してください。 ' ' 以下、Sheet1モジュール ' cj8271875_3 Private Sub Worksheet_Change(ByVal Target As Range)   If Target.Row <> 1 Then Exit Sub   If Target.Column > 3 Then Exit Sub   Dim wsh As Worksheet   Dim r As Range   With Range("C1")     If Range("B1").Value = "" Then       .HorizontalAlignment = xlHAlignRight     Else       .HorizontalAlignment = xlHAlignLeft     End If   End With   With Range("B1")     If Range("A1").Value = "" Then       .HorizontalAlignment = xlHAlignRight     Else       .HorizontalAlignment = xlHAlignCenter     End If   End With   Application.EnableEvents = False   On Error GoTo ErrHndl_   For Each wsh In Sheets(Array("Sheet2", "Sheet3"))     For Each r In Range("A1:C1")       r.MergeArea.Copy Destination:=wsh.Cells(r.Column)     Next   Next   Application.EnableEvents = True   Exit Sub ErrHndl_:   MsgBox "シート: " & wsh.Name & vbLf & "セル範囲:" & r.Column & " 列め" _     & vbLf & vbTab & "への貼付けが失敗しました。" _     & vbLf & "異なるサイズの結合セルへ貼付けようとしているようです。" _     & vbLf & vbLf & "実行時エラー'" & Err & vbLf & Err.Description, vbExclamation     Resume Next End Sub 原因候補2◆については、 もしも、そういう事なら前提から違ってくるので、アプローチを変えてみようかな? と迷う点もありますので、あらためて補足ください。

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.3

#2、cjです。お礼欄へのレスです。 A1、B1、C1、の3セルにそれぞれ 値を設定してあるかどうか、という点だけみると 2*2*2、で、8通りになりますが、 説明されているのは3通り、ご提示のコードでは4通りです。 それで十分成立している、ということなのでしょうし、 この条件下で成立するマクロは書けているのですが、 「それ以外の場合の処理」って、 VBAを書く上では必ず確認する必要があるものです。 今後新たに手を加える必要もあるでしょうから、今の段階では、 元々ご提示のコード内容に沿った書き方を提示しておきます。 一点だけ注意として、  Sheet1 の A1:C1 を丸ごとコピーしたものを  Sheet2 Sheet3 の A1 に貼り付ける という処理に書き直しました(∵記述がシンプルになるので)。 この場合、それぞれのシートで 結合セルのサイズが異なっていたりするとエラーになりますが、 敢えてエラートラップを掛けていません。 > シート2、シート3は、A1~C1のセルがシート1とおなじように結合されています。 という説明があるので、サイズも同じだとは思いますが、 もし、こういう理由でエラーになってしまった場合は、     Range("A1:A3").Copy Destination:=wsh.Range("A1") この ↑ 行で、止まってしまうので、 イベントが発生しなくなってしまい以後このマクロは動きませんから、 とりあえず、Excelを閉じて開き直すようにしてください。 ' ' 以下、Sheet1モジュール ' cj8271875_2 Private Sub Worksheet_Change(ByVal Target As Range)   If Target.Row <> 1 Then Exit Sub   If Target.Column > 3 Then Exit Sub   Dim wsh As Worksheet   With Range("C1")     If Range("B1").Value = "" Then       .HorizontalAlignment = xlHAlignRight     Else       .HorizontalAlignment = xlHAlignLeft     End If   End With   With Range("B1")     If Range("A1").Value = "" Then       .HorizontalAlignment = xlHAlignRight     Else       .HorizontalAlignment = xlHAlignCenter     End If   End With   Application.EnableEvents = False   For Each wsh In Sheets(Array("Sheet2", "Sheet3"))     Range("A1:A3").Copy Destination:=wsh.Range("A1")   Next   Application.EnableEvents = True End Sub

masarin16
質問者

補足

cj_moverさまへ ご回答ありがとうございます。 cj_moverさんの教えていただいたコードについていろいろと調べて 書かれてある内容について自分なりに理解することができました。 そのうえで、No.3でcj_moverさんから教えていただいたコードをsheet1モジュールに入れてみたのですが、セルが結合されていたら下記のエラーが出てしまいます。 ----------------------------------------------------------------- 実行時エラー'1004': 結合されたセルの一部を変更することはできません。 ----------------------------------------------------------------- エラー箇所は、cj_moverさんが注意として教えてくださった ---------------------------------------------- Range("A1:C1").Copy Destination:=wsh.Range("A1") ------------------------------------------------- のところです。 セルの結合を解除して試したところ、A1、B1、C1は、わたしの求めていた動作をしました。 ためしに、新しく「新規作成」をして sheet1,sheet2,sheet3に A1:A2を選択して、「セルを結合して中央揃え」 B1:B2を選択して、「セルを結合して中央揃え」 C1:C2を選択して、「セルを結合して中央揃え」 として、教えていただいたコードをsheet1モジュールに入れてみても同様のエラーが出てしまいます。 以前、下記の質問をさせていただいたときも結合セルがネックになったことがありました。 http://oshiete.goo.ne.jp/qa/8226147.html http://oshiete.goo.ne.jp/qa/8241405.html  の No.2 上記URLをヒントに Range("A1:C1").cell(1).Copy Destination:=wsh.Range("A1").cell(1) Range("A1:C1").cell(1).MergeArea.Copy Destination:=wsh.Range("A1").cell(1).MergeArea など、いろいろと試してみましたが、解決できませんでした。 なにか解決案がございましたら、ご教授してくださいますと幸いです。 どうかよろしくお願いいたします。

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.2

こんにちは。お邪魔します。 最初は私も、Sheet1:SHeet3を作業グループにする方法を考えていたのですが、 他の処理に影響を与えないように書くのが、かなり手間が掛かりますので、 ベタにシートをループした方が良いと判断しました。  以下、理由。というか言い訳?  例えば、A1に"hoge"とか入力してEnterしたとして、  処理後の選択範囲やアクティブセルをどうするか?  例えば、A1選択中にDelキーを押した時は選択を変えない、  A1を編集状態で値を空にしてEnterした場合はひとつ下のセルとか、  いやいや設定によってはひとつ右だとか、、、。  そもそもVBAでコマンドされた値変更の場合、  Selectionがセル範囲じゃなかったらどうする?Sheet2が選択中だったら?  等々、手当てを考えるとキリがないのです。  といって、現状維持をキチンとしないと、  Select メソッドを使っているVBAユーザーにとっては、  他の処理でエラーを招く原因になりますから。 率直に言って、質問者さんにとっては実力を超えた難しい処理をしようとしているんだと思います。 決して易しく書けるものではないので、こちらが提示するものも、それなりです。 ただ、なるべくエラーフリーな書き方となると、これより簡単には書けないと思います。 以下、細かい解説はしません。 解らない部分は、まず、調べて、それでもお困りでしたら、 遠慮なく、お尋ねください。 一応、説明がなかったので、こちらで未確認のポイントとして、  Sheet1 の   A1 の値が変更されたら、Sheet1:Sheet3 のB1   B1 の値が変更されたら、Sheet1:Sheet3 のC1   の書式を変更する。  .HorizontalAlignmenだけではなくて、.VerticalAlignmentも設定する。 という理解でいます。 こちらで追加した条件として   「 A1 【だけ】 」の値が変更されたら、、、   「 B1 【だけ】 」の値が変更されたら、、、 という風にしています。 A列まるごと消去、などのタイミングでは、機能しないようにしています。 Sub HorizontalAndVerticalAlignmentSamp9()  の引数について  Address 必ず指定します。Sheet1:Sheet3で書式を設定するべきセルの.Addressを"A1形式"で・  VAlign 省略可能です。.VerticalAlignmentの引数に渡す値を指定します。この引数を省略した場合は.VerticalAlignmentを設定しません。  HAlign 省略可能です。.HorizontalAlignmentの引数に渡す値を指定します。この引数を省略した場合は.HorizontalAlignmentを設定しません。 ' ' 以下、Sheet1モジュール ' cj8271875 Private Sub Worksheet_Change(ByVal Target As Range)   If Target.Row <> 1 Then Exit Sub   If Target.Column > 2 Then Exit Sub   If Target(1).Value = "" Then     If Target.Address <> Target(1).MergeArea.Address Then Exit Sub     Call HorizontalAndVerticalAlignmentSamp9(Target.Offset(, 1).Address, , xlHAlignRight)   Else     If Target.Count > 1 Then Exit Sub     Call HorizontalAndVerticalAlignmentSamp9(Target.Offset(, 1).Address, , xlHAlignLeft)   End If End Sub Sub HorizontalAndVerticalAlignmentSamp9( _     ByVal Address As String, _     Optional ByVal VAlign As Excel.XlHAlign, _     Optional ByVal HAlign As Excel.XlVAlign _     )   Dim wsh As Worksheet   For Each wsh In Sheets(Array("Sheet1", "Sheet2", "Sheet3"))     With wsh.Range(Address)       If VAlign <> 0 Then .VerticalAlignment = VAlign       If HAlign <> 0 Then .HorizontalAlignment = HAlign     End With   Next End Sub

masarin16
質問者

お礼

cj_moverさまへ ご回答をいただきまして、ほんとうにありがとうございます。 >一応、説明がなかったので、こちらで未確認のポイントとして、 > Sheet1 の >  A1 の値が変更されたら、Sheet1:Sheet3 のB1 >  B1 の値が変更されたら、Sheet1:Sheet3 のC1 >  の書式を変更する。 > .HorizontalAlignmenだけではなくて、.VerticalAlignmentも設定する。 >という理解でいます。 このたびは、わたしの説明が不十分で、申し訳ございませんでした。 質問文では、“文字”と一言で書きましたが正確には数字のみの入力になります。 C1のセルでは最大100の位の数字を入力します。 B1のセルでは最大10万の位の数字を入力します。 A1のセルでは最大1000万の位の数字を入力します。 例) A1   B1   C1 10   000   000     10   000         300 たとえば、「300」の数字の場合は、B1、A1のセルは未入力でC1は右揃えにしたいです。 また、「10000」の数字を入力する場合は、C1は左揃えに、B1は右揃えにしたいです。(C1が右揃え、B1が中央揃えとかだと、数字のバランスが不自然なため) つぎに、「10000000」の数字を入力する場合は、C1は左揃えに、B1は中央揃えに、A1は右揃えにしたいです。 そして、上記の数字をsheet1に入力したら、自然にsheet2、sheet3にも反映されているようにできるとうれしいです。 vbaの知識がまだまだ未熟なため、いまはcj_moverさんが書かれた上記のコードの意味や意図を1つ1つ調べて、日本語で書いてみているところです。 調べていく段階で、いろいろとわからないところがでてくると思いますが、そのときは、お言葉に甘えまして、聞いてみたいと思います。 ありがとうございました。

  • web2525
  • ベストアンサー率42% (1219/2850)
回答No.1

マクロの中にシートの指定がないので、実行はアクティブシートでしか反映されない Sheets(Array("Sheet1", "Sheet2", "Sheet3")).Select 複数のシートを選択するコードを追加することで解決するかと思われます

masarin16
質問者

お礼

web2525さまへ ご回答くださいまして、ほんとうにありがとうございます。 vbaは、まだまだ初心者でして、上記のコードがどういった機能をしているのかわからなかったので、さっそく調べてみました。 そして、配列というのを利用して、sheet1、sheet2、sheet3の3つのシートを複数選択する――ということを知りました。 エクセルを利用していたときも、sheet1を選択している状態で、シフトキーを押しながらsheet3を押すと、3つのシートを複数選択することができることは知っていたのですが、3つ選択した状態で、セルに文字を入力すると、3つのシートに反映されるというのは知らなかったので、1つ勉強になりました。 ありがとうございます。 そのことを踏まえまして、上記のコードを入れてみました。 結果、sheet1~sheet3に文字が反映したのですが、sheet1~sheet3の文字揃えがなぜかうまくリンクしてくれませんでした。 if~end ifの条件式のやり方辺りに問題があるような気がしますが、もう少しいろいろと考えてみようと思います。 ほんとうにありがとうございました。

関連するQ&A

  • EXCEL VBA 複数シート選択の方法

    エクセルVBAのシート選択方法について教えてください。 選択対象シート数は4つで、シート名は、「101」「102」「103追加工」「104」とします。 シート名「表紙」のセルは A1:101 A2:102 A3:103追加工 A4:104となっており、 使用者はB1~B4セルに「○」「×」を入力し、 「○」となっているシートのみ選択出来るようにしたい。 下記マクロの場合、シート名が全角文字だと使えるのですが、 シート名が「101」のように半角数字だけの場合コピーできません。 どこを修正すればよいのでしょうか? Sub TestSample2() Dim c As Range Dim flg As Boolean On Error Resume Next flg = True ThisWorkbook.Activate  With Worksheets("表紙")  For Each c In .Range("B1:B4")   If c.Value Like "○*" Then     Worksheets(c.Offset(, -1).Value).Select flg     flg = False   End If  Next c End With  With ActiveWindow.SelectedSheets  If .Count > 0 Then    .Copy  End If  End With  '元のシートに戻る場合  'Application.Goto ThisWorkbook.Worksheets("表紙").Range("A1") End Sub

  • EXCELマクロでのシート間のデータ同期方法

    質問させていただきます。 EXCELにて、"シート1"のA1~C3と"シート2"のD4~F6を 同期化したく考えております。 ・いわゆる一方のシートが「読み取り専用」になってしまうリンク貼り付けではなく、シート1、シート2相互が書き換え可能の同期化です。 ・A1とD4、B3とE6、のように互いに照合箇所のセル同士を同期反映させたいと考えております。 なお、他の質問を参照したところ、 シート1のA1とシート2のD4の単一セルを同期かする方法は確認できました。(以下参照) ***************************************************************** シート1のコードは Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$A$1" Then Worksheets("シート2").Range("D4") = Target End If End Sub シート2のコードは Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$D$4" Then Worksheets("シート1").Range("A1") = Target End If End Sub *************************************************************** これを参考にVBAの シート1のコードエディターに Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$A$2" Then Worksheets("シート2").Range("D5") = Target End If End Sub シート2のコードエディターに Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$D$5" Then Worksheets("シート2").Range("A2") = Target End If End Sub というように追記していったのですが、エラーとなってしまいます。 お詳しい方がおられましたらお願いいたします。

  • シート全体対象の設定方法と複数のセル範囲の参照方法

    ブック名「全体.xls」の全シート対象に、 (A1:B10) (D1:F10)の範囲だけの数値を調べ、 その数値が50以上のときに背景色を赤色にするマクロを作りたいですが。 Sub セルの値が50以上の時、背景色を赤色にする() Dim i As Integer i = ActiveCell.Value With ThisWorkbook("全体").Range("A1,B10") If i >= 50 Then ActiveCell.Interior.ColorIndex = 3 Else ActiveCell.Interior.ColorIndex = xlNone End If End With With ThisWorkbook("全体").Range("C1,F10") If i >= 50 Then ActiveCell.Interior.ColorIndex = 3 Else ActiveCell.Interior.ColorIndex = xlNone End If End With End Sub こうしても、 With ThisWorkbook("全体").Range("A1,B10") のところでエラーではじかれます。シート全体の("A1,B10")を対象にしたいですが、指定方法が分かりません。 ちなみにシート数は追加・削除あるので一定ではないです。 また、("A1,B10")と("C1,F10")にて個別にコードを書くのではなく 同時に設定したいけれど、(.Range("A1,B10")&("C1,F10")みたいな) やり方を知りたいです。 初歩的な質問で申し訳ありません。よろしくお願いします。

  • EXCEL VBA コピーしたシートへ値をコピペ

    選択対象シート数は4つで、シート名は、「101」「102」「103」「104」とします。 シート名「表紙」のA列のセルはA10:101 A11:102 A12:103 A13:104となっており、 使用者はとなりのB10~B14セルに「○」「×」を入力規則から選択します。 また、シート名「表紙」のB6セルには製造番号(例:AM01-130012)を入力しておきます。 「○」となっているシートのみ選択して、下記マクロにてコピーを作成します。 コピーしたシートすべてのB2セルに製造番号を入力します。 ここまではできていて、下記のプログラムを追加したいのですが、うまくいきません。 さらに、○を付けたのと同じ行のD10~L10、D11~L11、D12~L12、D13~L13セルに、 使用者が文字列を入れる場合と入れない場合があります。文字列は左のD列から順に入れます。 文字列があれば、○を付けてコピーした対応するシートの中のH3~P3セルへ貼り付けたいのです。 D10、D11、D12、D13セルが空白のときは何も処理は行わないとします。 たとえば、下記のようにB12セルが○で、D12セルに文字列があれば、 D12~L12セルの値を、コピーで作成したシート103の中のH3~P3セルへ貼り付けたいのです。 B11セルも○ですが、D11セルに文字列がないのでシートのコピーだけ行います。 アドバイスいただけると助かります。 VBA初心者で申し訳ございませんが、よろしくお願いいたします。 <表紙のシート>    A     B     C    D     E     F    G    H     I     J     K      L 5 6    AM01-130012 7 8 9  10 101    × 11 102    ○ 12 103    ○       A1-1  A1-2  A1-3  A1-4  A1-5  A1-6  A1-7  A1-8   A1-9 13 104    × <プログラム> Sub TestSample() If Application.CountIf(Worksheets("表紙").Range("B10:B17"), "*○*") = 0 Then MsgBox "部品番号が選択されていません。" Exit Sub End If Dim 製造番号 As String 製造番号 = Range("B6").Value Dim c As Range Dim flg As Boolean On Error Resume Next flg = True ThisWorkbook.Activate On Error GoTo ErrOut_ For Each c In Worksheets("表紙").Range("B10:B13") If c.Value Like "○*" Then Worksheets(c.Offset(, -1).Text).Select flg flg = False End If Next c If Not flg Then ActiveWindow.SelectedSheets.Copy ' コピーしたすべてのシートに製造番号を書き込む For Each 各シート In Worksheets With 各シート .Activate Cells(1, 2) = 製造番号 End With Next Exit Sub ErrOut_: MsgBox """表紙""シートに記載されたシート名" & c.Offset(, -1).Text & "は存在しません。, vbInformation" End Sub

  • エクセルVBAでセル選択するコードが変

    エクセルのワークシートでVBAでセル選択するコードで理解に苦しむことがあります。 通常、Cells(2, 1)はセル番地で言えばA2セル Cells(4, 1)はセル番地で言えばA4セルです。 しかし、 With .Range("B5:B15")でくくれば  .Cells(2, 1)はセル番地で言えばB6セルだと思います。 .Cells(4, 1) はセル番地で言えばB8セルだと思います。 ところが下記のコードを動かすと、なぜかC10:C12が選択されてしまいます。 この理屈がわかりません。 Sub test02()   With Sheets("Sheet1")     With .Range("B5:B15")       .Range(.Cells(2, 1), .Cells(4, 1)).Select     End With   End With End Sub なお、 .Range(.Cells(2, 1), .Cells(4, 1)).Selectを .Range(“A2:A4”).Selectに書きかえると、希望のB6:B8が選択されます。

  • EXCEL VBA の シートマクロ? について

    C-Builderでは中級程度のプログラムを作成し、通常のEXCEL VBAは使いこなしている者です。 数種のエクセルマクロの本を読んだり、ネットで検索しても(名称を知らないのでヒットしないのかも知れませんが)出ていない様なので宜しくお願い致します。 質問内容: 1. EXCELのシートの下方のシート選択タブでコードの選択を選んだ時に出てくるVBA部分の正式名称は何でしょうか?ツールから選択するVBAマクロと区別する名称はあるのでしょうか。 2. ある時、たまたまヒットしたサイトの内容を参考に作成したプログラムです。セルに数値を入力すると文字を表示する様にしています。しかし、これでは総てのセルに対応してしまいます。参考にしたプログラムでは with tergetの前に何か範囲指定コマンドの様なものが書かれていた気がしますが、そのプログラムを消してしまった様で分かりません。A列とかB列のセルに対してのみ変換を行いたいのです。 Private Sub Worksheet_Change(ByVal Target As Range) On Error GoTo ErrorLine With Target If .Value = "" Then Exit Sub If .Value = "0" Then .Value = "A" If .Value = "1" Then .Value = "B" If .Value = "2" Then .Value = "C" If .Value = "3" Then .Value = "D" If .Value > "4" Then Exit Sub End With ErrorLine: End Sub 3. 何かこのシートマクロ(私が勝手に呼んでいる名称)の参考サイト、書物がありましたらご紹介下さい。 宜しくお願い致します。

  • VBA 選択したセルが空白であったらシートを削除

    こんばんは!いつもお世話になっています。 選択したシート1のセル(C9)が空白であったら、選択したシートを削除するマクロ(VBA)を作りましたが、上手く作動しなくて困っています。 どうしたらよいのかよろしくお願い致します。 'シート1のセルC9を選択し、空白か判断する Sub セルの選択()   Worksheets("Sheet1").Activate   Range("C9").Select  If Len(Application.Trim(ActiveCell)) = 0 Then   MsgBox("空白セル")  End If End Sub '現在アクティブなシートを削除する Sub DeleteWorksheet() Application.DisplayAlerts = False ActiveSheet.Delete Application.DisplayAlerts = True End Sub

  • 【Excel VBA】シート表示&ボタン操作

    何度もすみません。 シート表示のコードの続きです。 また、別記事で質問していた件(件名の後者)も合わせて コードに組み込んでいます。 Sheets(actsht).Tab.ColorIndex = 2 '当月分のワークシート見出しの色を白に設定する Sheets(actsht).Range("B3").Value = Sheets("Sheet2").Range("A1").Value 'ワークシート(Sheet2)のA1セルの値を当月分のワークシートのB3セルに代入 Sheets(actsht).Range("B4").Value = Sheets("Sheet2").Range("A2").Value 'ワークシート(Sheet2)のA2セルの値を当月分のワークシートのB4セルに代入 ActiveSheet.Range("A2").Select '翌月分のワークシートのA2セルを選択する Sheets("元データ").Visible = True 'ワークシート(元データ)を表示する Call clear_Click 'フォームボタン(clear)をクリックする Sheets("元データ").Visible = False 'ワークシート(元データ)を非表示にする Exit For 'For文を抜ける ElseIf Anser = vbNo Then 'MsgBoxで"vbNo"を選択した場合 Exit For 'For文を抜ける End If 'If文を終了する End If 'If文を終了する Next 'iの値を1増分する If Flag = O Then 'Flagが0であった場合 MsgBox ("新しいワークシートを作成出来ません。") 'MsgBoxを表示する End If 'If文を終了する End Sub

  • VBA シート間の同期(列、行、選択範囲)

    初めての質問となります。 よろしくお願いいたします。 シート間の同期でセルの同期は他の質問を参照してできましたが、 ”行”や”列”での同期/相互参照は、どのように書けばいいのでしょうか。。 下記、sheet1”A1”とsheet2の”B1”に記載したcodeです。 'sheet1に以下を記述 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$A$1" Then Sheets("Sheet2").Range("$B$1").Value = Sheets("Sheet1").Range("$A$1").Value End If End Sub 'sheet2に以下を記述 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$B$1" Then Sheets("Sheet1").Range("$A$1").Value = Sheets("Sheet2").Range("$B$1").Value End If End Sub 【質問内容】 sheet1の”A列”とsheet2の”B列”はどう書くのでしょう? 上記の方法では無理、または負荷が大きい場合は、 sheet1の”A1:C3”とsheet2の”D4:F6”はどう書くのでしょう? という内容になります。 先日からVBAを触り始め、 自分なりに調べて一通り試してみましたが解決できませんでした。。 お手数おかけしますが何卒よろしくお願いいたします。

  • 指定記号のみ別シートにコピー

    sheet1(表-1)の入力文字「A,C,E」をsheet2へコピーする。 sheet2(表-3)のように[A,C,E」以外及びsheet1空白のセルはsheet2でも空白としたい。 その際、sheet2(表-2)に入力済みの記号「○、●、◎」はそのまま残したい。 下記のコードでは、sheet2に入力済みの記号「○、●、◎」が消えてしまいます。 どなたかコードがわかる方よろしくお願いします。 Sub シートコピー() Dim r As Range For Each r In Worksheets("Sheet1").Range("B1:D5") If WorksheetFunction.CountIf(Range("A8:A10"), r.Value) Then Sheets("sheet2").Range(r.Address).Value = r.Value Else Sheets("sheet2").Range(r.Address).Value = "" End If Next End Sub セルA11に"0"を入力して実行してもsheet1空白セルはsheet2でも空白となり困っています。

専門家に質問してみよう