アプリ版:「スタンプのみでお礼する」機能のリリースについて

表題どおりなのですが、別シートに罫線がかけません。
例えば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

A 回答 (3件)

おそらくシートモジュールにプログラムを書いてるんですよね?


その場合、特に指定せずに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」を省略しても正常に動作します。
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/01/13 17:11

#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にはつけるのを忘れやすいですね。私も失敗した例を思いがしました。
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/01/13 17:14

> 「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")」を指定したほうが確実です。
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/01/13 17:12

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!