どうにも解決が付かず、困ってしまっています、どなたかご回答をお願いいたします。
デスクトップ上にAというフォルダがあり、その中に二つのファイルa.xls、b.xlsがあるとします。
今、a.xlsを開いて、その中に「データ入力表」というシートを作り、そこに入力したデータをマクロを貼り付けたボタン一つでb.xlsへデータ蓄積できるようにしようと考えています。蓄積データが大量になることが予想されるので、別ファイルとしたかったのですが、そうすると、何度もb.xlsにデータを転記する必要があるので、b.xlsはその都度開いたり閉じたりせずに開いたままにしておきたいわけです。
そこで、ボタンに貼り付けるマクロには、
・最初にデータ転記する時にb.xlsを開く
・以降のデータ転記時にはb.xlsは開いたままにする
ように、IF文で分岐を付けたいのですが、最初にファイルを開くのは
Set wb = Workbooks.Open("b.xls")
で良いわけですが、「b.xlsを開いたままデータを転記する」場合がどうにもうまくいきません。
ファイルをオブジェクト変数にセットするように、
Set wb = Workbook("b.xls")
とすると「インデックスが有効範囲にありません」と怒られ、パスの設定か?と思い、
myDir.Workbook("b.xls")
とすれば「オブジェクトが必要です」
と断られてしまいます。
この、転記先となるb.xlsを開いたままデータを転記する場合には、オープンしてあるb.xlsはどうセットしたら良いのでしょうか?、というのが今回の質問です。
まだ初心者のため要点が掴みづらい文章となってしまい、お答えしにくいかとは思いますが、どなたかこの混迷状態をご理解頂けた方、ご返答を宜しくお願いいたします。
No.4ベストアンサー
- 回答日時:
#3さんのつけたしになっちゃいますが、変数の使い方がきちんと分かっていれば、モジュールレベルの変数という方法もあると思います。
Public 変数だと、残し忘れがありますが、どちらでも良いと思います。Dim wb As Workbook 'モジュールレベルの変数
Sub test_open()
'開ける時
If wb Is Nothing Then
Set wb = Workbooks.Open("b.xls")
End If
End Sub
Sub Sheet_Copy()
'コピーするとき
If Not wb Is Nothing Then
ThisWorkbook.Sheets(1).Cells.Copy wb.Sheets(1).Range("A1")
'ここは工夫してください。
End If
End Sub
Sub Test_Close()
'閉じる時(ユーザーが閉じてしまった場合に、エラー・トラップを入れておく)
On Error Resume Next
If Not wb Is Nothing Then
wb.Save
wb.Close
End If
Set wb = Nothing
End Sub
ありがとうございました。
No.3さんとNo.4さんのご回答で、ようやくエラーの謎が解けました。変数のセットについてもう一度勉強し治してくる必要がありますね、ほんとうにご回答有り難うございました。
No.5
- 回答日時:
No.3です。
No.4のWendy02さんの回答で何故エラーが出るのかお分かりですよね。
If wb Is Nothing を使うときは、オブジェクト変数wbは
モジュールレベルかパブリックレベルでないといけません。
そこを気付いてもらうためにわざとその説明を抜かしました。
この際に”変数の摘要範囲”をしっかりと理解するようにしてください。
プログラムを書くためには必須ですから。
No.4さんへのお礼にも書きましたが、お二人のおかげでエラーの謎が解けました。本当にありがとうございました。
なかなか成書にも問題解決の糸口となるヒントが見つからず、付け焼き刃のプログラム書きではやはり基本的な部分、今回のような変数の適用範囲のようなエラーの解決には限界がありました。
おっしゃるとおり、もう一度基本的な変数の使用法に関して勉強しておかなければならないことを痛感させられました。
本当にご回答ありがとうございました。
No.3
- 回答日時:
こんなんでも出来るのでは?
If wb Is Nothing Then
Set wb = Workbooks.Open("b.xls")
End If
ご回答有り難うございます。
これだと、やはりb.xlsを開いたままの状態でマクロを実行すると、「b.xlsはすでに開かれています。二重に開くと・・・」のアラートが出てしまいます。
これが出ないようにしたいんですけどね~・・・
No.2
- 回答日時:
エラーは#1さんの回答で回避出来ると思います。
開くファイル名やパスが同じなら、サブルーチン化してあげるとか。
開いているブック内から b.xls を探して、あれば変数にセット、
無ければこのマクロが書かれたファイルと同じフォルダ内にある
b.xls を開いてセットします。
'--------------------------------------------
Sub Test()
Dim wb As Workbook
Call BookOpenCheck(wb)
MsgBox wb.Name
End Sub
'--------------------------------------------
Sub BookOpenCheck(wb As Workbook)
Dim twb As Workbook, Flg As Boolean
Flg = False
For Each twb In Workbooks
If twb.Name = "b.xls" Then
Set wb = twb
Exit Sub
End If
Next twb
If Not Flg Then
Set wb = Workbooks.Open _
(ThisWorkbook.Path & "\b.xls")
End If
End Sub
ご返答有り難うございます。
一度開いてあるファイルをもう一度オープンしようとするとエラーが出ますよね?最初にデータを転記した後はb.xlsは開いたままになっているので、次のデータを入力・転記する時には、b.xlsは開いたままになっていますからこの状態で(b.xlsをオープンせずに)変数にセットしたい、ということで、IF分岐を考えたのですが・・・
サブルーチンを使ってファイルを探してあれば変数にセット、というのは思いつきませんでした。大変参考になりました、ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) DisplayAlertsブロパティで ”実行時エラー424オブジェクトが必要です” 5 2022/05/15 18:02
- Visual Basic(VBA) エクセルVBA Workbook変数に変数を使ったファイル名を格納したい 5 2023/06/13 14:46
- Visual Basic(VBA) エクセルVBA 既存エクセルを開きその中のシートとしてCSVファイルを開く 3 2023/05/31 13:11
- Visual Basic(VBA) VBAでファイルを開くプログラムがエラーです 2 2023/02/21 16:56
- Excel(エクセル) フォルダ内の全ブックのシート名を変更したい 7 2022/09/22 21:34
- Visual Basic(VBA) 動かなくなってしまった古いVBAを動くようにしたい 8 2022/09/20 13:57
- Access(アクセス) Access2016のExcelインポートの機能のことで教えてください 1 2022/09/11 14:58
- Visual Basic(VBA) 入力ボックスが繰り返しポップアップして止まらない。 下記コードでファイル名の変更をしたいのですが、変 1 2022/09/08 11:27
- Visual Basic(VBA) ファイル名の右側を変更したい ファイル名:「1001日別売上」の左側へ「2022」を追加し、「202 6 2022/10/14 10:03
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ExcelVBAで今開いているユーザ...
-
フォルダ内の全ブックのシート...
-
【Excel VBA】ブックを複数開い...
-
エクセルVBA Workbook変数に変...
-
他のBookのユーザー定義関数を使う
-
【ExcelVBA】指定の書式で、マ...
-
VBA、Excelのworkbook.open に...
-
同じ名前で拡張子が違うファイル
-
EXCELマクロでxlsとxlsxを開く方法
-
【VBA】他のExcelを起動し、呼...
-
フォルダ内の全てのBookに同じ...
-
excelマクロ、任意セルの値で名...
-
excelでハイパーリンク 別ブッ...
-
Excel マクロでファイル名を変...
-
VB2010でExcelの行をコピーして...
-
フォルダ内の全ブックのシート...
-
【マクロ】アクティブセルの行...
-
複数のデータ系列の線の太さを...
-
ファイル名を今日の日付、時刻...
-
エクセル終了時の保存確認メッ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
フォルダ内の全ブックのシート...
-
エクセルVBA Workbook変数に変...
-
ExcelVBAで今開いているユーザ...
-
フォルダ内の全ブックのシート...
-
【ExcelVBA】指定の書式で、マ...
-
VB2010でExcelの行をコピーして...
-
【Excel VBA】ブックを複数開い...
-
すでに開いているブックのマク...
-
EXCELマクロでxlsとxlsxを開く方法
-
フォルダ内の全てのBookに同じ...
-
excelマクロ、任意セルの値で名...
-
[Excel VBA] フォルダ内の複数...
-
personal.xlsの削除方法
-
EXCEL VBA起動時の処理
-
Excel VBAを後ろで動かす方法
-
VBA、Excelのworkbook.open に...
-
VBA セル入力された日付データ...
-
他のBookのユーザー定義関数を使う
-
Excelの一括印刷で通し番号をつ...
-
VBA ファイルの開き方
おすすめ情報