
表題どおりなのですが、別シートに罫線がかけません。
例えば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
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」を省略しても正常に動作します。
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にはつけるのを忘れやすいですね。私も失敗した例を思いがしました。
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")」を指定したほうが確実です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBA 罫線について B列3行目から21行毎にデータがはいります。 データがはいったらデータが入った 6 2022/11/15 17:22
- Excel(エクセル) なぜExit Subがあるのかわかりません 4 2023/02/19 12:34
- Visual Basic(VBA) vbaのvlookup関数エラー原因を教えていただけないでしょうか。 3 2022/04/25 16:16
- Visual Basic(VBA) VBAコードが作動せず、どこに問題があるのか教えて下さい。 3 2023/06/13 13:20
- Visual Basic(VBA) 他のシートからコピーする下記マクロで貼付け位置をWorksheets(1).Range("A3")の 8 2023/01/30 18:48
- Visual Basic(VBA) EXCELのVBAについて 2 2023/07/05 17:17
- Visual Basic(VBA) オートフィルタで抽出結果に 罫線をひく方法 1 2022/07/13 13:08
- Visual Basic(VBA) 【VBA】ボタンに登録したマクロがエラーになる 4 2022/07/25 17:47
- Visual Basic(VBA) Sheet「状況」から、分類の年齢別カウント数をSheet「D表」へ転記する下記マクロを作っています 7 2022/12/14 17:57
- Excel(エクセル) エクセルVBAでオブジェクトが必要です 2 2022/09/10 16:37
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・「それ、メッセージ花火でわざわざ伝えること?」
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・【お題】甲子園での思い出の残し方
- ・【お題】動物のキャッチフレーズ
- ・人生で一番思い出に残ってる靴
- ・これ何て呼びますか Part2
- ・スタッフと宿泊客が全員斜め上を行くホテルのレビュー
- ・あなたが好きな本屋さんを教えてください
- ・かっこよく答えてください!!
- ・一回も披露したことのない豆知識
- ・ショボ短歌会
- ・いちばん失敗した人決定戦
- ・性格悪い人が優勝
- ・最速怪談選手権
- ・限定しりとり
- ・性格いい人が優勝
- ・これ何て呼びますか
- ・チョコミントアイス
- ・単二電池
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと
- ・泣きながら食べたご飯の思い出
- ・一番好きなみそ汁の具材は?
- ・人生で一番お金がなかったとき
- ・カラオケの鉄板ソング
- ・自分用のお土産
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excel VBA 定義されたプロージ...
-
Excel VBAでリンク切れをチェッ...
-
モジュールの最大数はいくつな...
-
ユーザー定義関数に#NAME?が返...
-
AddressOf と同じ機能を持った...
-
EXCELのVBAで、あるワークシー...
-
Excel VBAで、ユーザーフォーム...
-
ExcelでTelnetを動かしたい
-
Excel VBA 『Call』で呼び出す...
-
vba userFormのSubを標準モジュ...
-
msoFileDialogFolderPicker
-
ユーザー定義関数をEXCELに常駐...
-
コンボボックスの変更に応じて...
-
モジュールとは何ですか
-
モジュールからフォームのボタ...
-
VB2005ーDataGridViewの選択さ...
-
VBAで旧字体を異字体に一括で変...
-
VBAで別モジュールへの変数の受...
-
エクセルのシート上に配置され...
-
Excel VBA 標準モジュール内で...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excel VBAで、ユーザーフォーム...
-
Excel VBAでリンク切れをチェッ...
-
エクセルVBAでシートモジュール...
-
vba userFormのSubを標準モジュ...
-
ユーザー定義関数に#NAME?が返...
-
Excel VBA 『Call』で呼び出す...
-
VBでグローバル変数を宣言するには
-
Excel VBA 定義されたプロージ...
-
モジュールの最大数はいくつな...
-
VBAで旧字体を異字体に一括で変...
-
SendKeysの使い方について
-
Access VBA標準モジュールにつ...
-
モジュールからフォームのボタ...
-
VBAで別モジュールへの変数の受...
-
【vba】フォームに書いてあ...
-
エクセルVBA クラスモジュール...
-
Workbook.BeforeSave イベント...
-
モジュールとクラスの違いって...
-
ユーザー定義関数をEXCELに常駐...
-
標準モジュールを削除したい。(...
おすすめ情報