• ベストアンサー

別シートに罫線がひけない

表題どおりなのですが、別シートに罫線がかけません。 例えばSheet1にあるボタンをクリックするとSheet2に罫線をかく。 (コードは下記参照)としたときにエラーが発生します。 「1004 Rangeメソッドは失敗しました。」 そのため「ActiveSheet.」をはずしてみると”Sheet1”に描画されてしまいます。 なにか宣言が必要なのでしょうか? Private Sub CommandButton1_Click() Worksheets("sheet2").Activate '.Selectでも同じ For i = 4 To Range("G30").Column ActiveSheet.Range(Cells(4, i), Cells(30, i)).Borders(xlLeft).Weight = xlThin ActiveSheet.Range(Cells(4, i), Cells(30,i)).Borders(xlLeft).LineStyle = xlContinuous Next End Sub

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

  • ベストアンサー
  • popesyu
  • ベストアンサー率36% (1782/4883)
回答No.1

おそらくシートモジュールにプログラムを書いてるんですよね? その場合、特に指定せずにRangeやCellsを使うとそれはそのシートモジュールのWorksheetを参照することになるという決まりごとがあります。これが標準モジュールの方ならとくに指定が無ければActiveSheetとするという決まりごとがあります。 つまり下記の部分は ActiveSheet.Range(Cells(4, i), Cells(30, i)) ↓ ActiveSheet.Range(Worksheets("sheet1").Cells(4, i), Worksheets("sheet1").Cells(30, i)) という認識になっているので正常に動作しません。もしシートモジュールの方に書くなら下のように正確に指定する必要があります。 ActiveSheet.Range(ActiveSheet.Cells(4, i), ActiveSheet.Cells(30, i)) 他の対策としては標準モジュールに書いたコードをCallで呼び出す方式にするという方法もあります。その場合だと「ActiveSheet」を省略しても正常に動作します。

a-k-a
質問者

お礼

お礼が遅くなってしまいました. 確かにシートモジュールに書いていました. 原因が分かりスッキリです. ありがとうございました.

その他の回答 (2)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.3

#1でご指摘の方法 Sheetのシートモジュール Private Sub CommandButton1_Click() Module1.aaa End Sub Module1に Public Sub aaa() Worksheets("Sheet2").Activate '.Selectでも同じ For i = 4 To Range("G30").Column ActiveSheet.Range(Cells(4, i), Cells(30, i)).Borders(xlLeft).Weight = xlThick ActiveSheet.Range(Cells(4, i), Cells(30, i)).Borders(xlLeft).LineStyle = xlContinuous Next i End Sub でうまくいきました。 Private でなくPublicにすること。 ーーー Sub test01() Worksheets("sheet2").Activate '.Selectでも同じ For i = 4 To Range("G30").Column ActiveSheet.Range(Cells(4, i), Cells(30, i)).Borders(xlLeft).Weight = xlThin ActiveSheet.Range(Cells(4, i), Cells(30, i)).Borders(xlLeft).LineStyle = xlContinuous Next End Sub で実行してもエラー ーー Sheet1のシートモジュール Sub test01() For i = 4 To Range("G30").Column Worksheets("Sheet2").Range(Cells(4, i), Cells(30, i)).Borders(xlLeft).Weight = xlThin Worksheets("Sheet2").Range(Cells(4, i), Cells(30, i)).Borders(xlLeft).LineStyle = xlContinuous Next End Sub でもエラー ーーー Sheet1のシートモジュール Sub test01() Worksheets("sheet2").Activate For i = 4 To Range("G30").Column Worksheets("Sheet2").Range(Cells(4, i), Cells(30, i)).Borders(xlLeft).Weight = xlThin Worksheets("Sheet2").Range(Cells(4, i), Cells(30, i)).Borders(xlLeft).LineStyle = xlContinuous Next End Sub を実行でもエラー ーーー Sheet1のシートモジュール Private Sub CommandButton1_Click() Worksheets("sheet2").Activate For i = 4 To Range("G30").Column Worksheets("Sheet2").Range(Cells(4, i), Cells(30, i)).Borders(xlLeft).Weight = xlThin Worksheets("Sheet2").Range(Cells(4, i), Cells(30, i)).Borders(xlLeft).LineStyle = xlContinuous Next End Sub でもエラー ーーー Private Sub CommandButton1_Click() Dim sh2 As Worksheet Set sh2 = Worksheets("Sheet2") sh2.Activate For i = 4 To Range("G30").Column sh2.Range(Cells(4, i), Cells(30, i)).Borders(xlLeft).Weight = xlThin sh2.Range(Cells(4, i), Cells(30, i)).Borders(xlLeft).LineStyle = xlContinuous Next End Sub もエラー ーーー Sub test01() Dim sh2 As Worksheet Set sh2 = Worksheets("Sheet2") For i = 4 To sh2.Range("G30").Column sh2.Range(sh2.Cells(4, i), sh2.Cells(30, i)).Borders(xlLeft).Weight = xlThin sh2.Range(sh2.Cells(4, i), sh2.Cells(30, i)).Borders(xlLeft).LineStyle = xlContinuous Next End Sub はOK ーーーー #2のご回答 Private Sub CommandButton1_Click() With Worksheets("sheet2") For i = 4 To Range("G30").Column .Range(.Cells(4, i), .Cells(30, i)).Borders(xlLeft).Weight = xlThick .Range(.Cells(4, i), .Cells(30, i)).Borders(xlLeft).LineStyle = xlContinuous Next i End With End Sub はOK。 以上参考のため、報告します。 シートモジュールの中で、他のシートのあActivate はできないのかと思ったが、そうではなくSh2.をCell()の前にまでつけていなかったのが原因。 他シートを参照するなら、Range、Cellsの前に、徹底して Sh2.(またはWorksheets(”Sheet2”)をつけないといけないということでした。 Range(Cells(4, i), Cells(30, i)).のCellにはつけるのを忘れやすいですね。私も失敗した例を思いがしました。

a-k-a
質問者

お礼

お礼が遅くなってしまいました. まとめていただいてありがとうございます. 原因が分かりスッキリです. ありがとうございました.

  • dsuekichi
  • ベストアンサー率64% (171/265)
回答No.2

> 「1004 Rangeメソッドは失敗しました。」 > ActiveSheet.Range(Cells(4, i), Cells(30, i)).Borders(xlLeft).Weight = xlThin 「ActiveSheet」が指し示すのが「Sheet2」で、 「Cells」が指し示すのが「Sheet1」だからではありませんか? > ActiveSheet.Range(ActiveSheet.Cells(4, i), ActiveSheet.Cells(30, i)).Borders(xlLeft).Weight = xlThin こうしてみるとか・・・ 一般に、「Active~」とか「Select~」は、不正確(想定外のもの)になることがあるので、 できるだけ使わないほうが良いですよ。 例えば、 ------------------------------------------------------------ With Worksheets("sheet2") For i = 4 To Range("G30").Column .Range(.Cells(4, i), .Cells(30, i)).Borders(xlLeft).Weight = xlThin .Range(.Cells(4, i), .Cells(30, i)).Borders(xlLeft).LineStyle = xlContinuous Next End With ------------------------------------------------------------ こうして、明示的に「Worksheets("sheet2")」を指定したほうが確実です。

a-k-a
質問者

お礼

お礼が遅くなってしまいました. 確かにシートモジュールに書いていました. 原因が分かりスッキリです. ありがとうございました.

関連するQ&A