• 締切済み

VBA PERSONAL以外に記述すると・・・

普段はPERSONAL.xlsにモジュールを追加し、そこにプログラムを書いていますが、 人に渡す必要がある場合は、渡す対象のブックにモジュールを追加して書いています。 仮にそのブックをabc.xlsといたしますと、 abcのモジュールに記述した場合と、PERSONALに記述した場合とで、 動きが違う時があり、その違いは何故生じるのかを知りたいのです。 シートをコピーしたり、他のブックから移動したりすると、 (例えば ThisWorkbook.Sheets(1).Copy after:=ThisWorkbook.Sheets(2) とか、 Workbooks("xyz.xls").Sheets(1).Copy after:=ThisWorkbook.Sheets(2) とか) その処理が終わった時点で、プログラムが終了してしまうのです。 abc.xlsの「ThisWorkbook」に記述しても、結果は変わりません。 前述の通り、PERSONALの標準モジュールに書くと最後まで処理されます。 何か根本的に間違えていると思うのですが(汗)、よろしくお願いします。

noname#91725
noname#91725

みんなの回答

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんばんは。 >普段はPERSONAL.xlsにモジュールを追加し、そこにプログラムを書いていますが、 PERSONAL.XLS で、 ThisWorkbook.Sheets(1).Copy after:=ThisWorkbook.Sheets(2) というような、PERSONAL.XLS をThisWorkbookとして、そこのシートにコピーするというのは、ありえないと思います。(裏技としてはありますが、リスクが大きい)それに、ワークブックのキメウチを、PERONAL.XLS 上で指定するというコードも通常は書きません。 PERSONAL.XLS のシート数は、通常1つしか作りませんから、Sheets(2)なら、エラーを出すはずです。 PERSONAL.XLS は、常に使うためのコードのみを入れ、保存を頻繁にしたり、シートを足したり減らしたりということはしません。 ActiveWorkbook と間違えていませんか? >abc.xlsの「ThisWorkbook」に記述しても、結果は変わりません。 それは、ThisWorkbook モジュールのことですか?ThisWorkbookモジュールは、ローカルモジュールです。ローカルモジュールには、通常、イベントか、それに対するサブルーチンを入れます。ローカルモジュールは、グローバルな用い方は通常しません。 本来、VBでは、イベントが多いので、主にローカルモジュールを用いますが、Excelは特殊で、ローカルオブジェクトが無数にできてしまうので、それと共にモジュールを作ってしまいます。それで、標準モジュールのほうが楽ですし、親オブジェクトを省略しても、コードがそのまま使えます。 Excel VBAの基本的なことだと思います。Excelでは、個々のブックの標準モジュールにコードを入れます。ここがWordの作り方とは違います。Wordは、Normal.dot に対して、個々のDocument が、自動的に参照設定されます。それに、ローカルオブジェクトが無数にできるということはあまりありません。

noname#91725
質問者

お礼

ご回答ありがとうございます。 質問文が良くなかったようです。PERSONALの標準モジュールに記述して、 別のブックがアクティブな状態でデバッグしています。 標準モジュールがだめならThisWorkbook モジュール?と思ってやってみたけど、 やっぱりだめでした、という感じです。 また別途質問しますので、その時はよろしくお願いします。

  • xls88
  • ベストアンサー率56% (669/1189)
回答No.2

>その処理が終わった時点で、プログラムが終了してしまうのです。 ”プログラムが終了”とは。具体的にどうなるのですか? 何か、アラートは表示されないのですか?

noname#91725
質問者

お礼

ご回答ありがとうございます。 自分ではわかっていても人に状態を伝えるというのは難しいものですね。 F8で一行ずつ処理していくと、そこで終わってしまいます。 アラートは出ません。 またよろしくお願いします。

  • S-Fuji
  • ベストアンサー率36% (592/1624)
回答No.1

 Bookの標準モジュールに書いているのですよね。  WorkbookSheetsを、WorkSheetsの考え方で、修正してみたら?。

noname#91725
質問者

お礼

ご回答ありがとうございます。 質問なので変なところで丁寧に書いた例文にしてしまいました。 単純にSheets(1)とか書いてます。 またよろしくお願いします。

関連するQ&A

  • Excel VBA 指定シートの取込

    こんにちは。 ExcelのVBAを使用して、異なるBookのシートを取込みたいのですが、 シートが無かった場合の処理方法がわかりません。 現在のコードは下記の様になっております。 With Workbooks.Open"BOOK1.xls" .Worksheets("Sh1").Cells.Copy ThisWorkbook.Sheets("Sheet1").Range("A1") .Worksheets("Sh2").Cells.Copy ThisWorkbook.Sheets("Sheet2").Range("A1") .Worksheets("Sh3").Cells.Copy ThisWorkbook.Sheets("Sheet3").Range("A1") .Close End With Book1に指定したシートが無い場合、何もしないようにしたいのですが、 どの様に書き換えれば宜しいでしょうか? よろしくお願いします。

  • エクセルVBA PERSONALのモジュールを消してしまった!

    今、誤ってブックの標準モジュールを削除するべきところ、PERSONAL.XLSの標準モジュールを解放にしてしまいました!! 回復する方法はないでしょうか? 大変困っています。

  • Excel VBA 非表示の別ブックへシートコピー

    Excel2010のVBAで、別のExcelブックを非表示で開いて、 シートをコピーすると、 「実行時エラー'1004':WorksheetクラスのCopyメソッドが失敗しました。」 というエラーが出て、正しくシートをコピーすることができません。 (1)のように自分のブックへはシートをコピーすることはできるのですが、 (2)のように別のExcelブック上でシートをコピーする場合と (3)のように別のExcelブック上にシートをコピーする場合の いずれも同様のエラーになります。 どのように記述すれば(2)と(3)でもコピーすることができるのでしょうか。 ------------------------------------------------------------- Sub test()  Dim newEx As Excel.Workbook  Dim newFile As String  newFile = ThisWorkbook.Path & "\New_Book.xlsx"  Set newEx = Workbooks.Open(newFile, UpdateLinks:=0)  Application.Windows("New_Book.xlsx").Visible = False  '(1)New_BookのSheet3を自分のブックにコピーする (正常)  newEx.Worksheets("Sheet3").Copy after:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)  '(2)New_BookのSheet3をNew_Bookにコピーする (エラー)  newEx.Worksheets("Sheet3").Copy after:=newEx.Sheets(newEx.Sheets.Count)  '(3)自分のブックのSheet3をNew_Bookにコピーする (エラー)  ThisWorkbook.Worksheets("Sheet3").Copy after:=newEx.Sheets(newEx.Sheets.Count)  Application.Windows("New_Book.xlsx").Visible = True  Application.DisplayAlerts = False  newEx.Save  newEx.Close  Application.DisplayAlerts = True  Set newEx = Nothing End Sub -------------------------------------------------------------

  • excel vba

    テーブル情報に基づきシートをコピーするVBAマクロを記述したい。 ExcelのBook111のSheet1に次のような データが入っています。 (1、2)セルにn=3という数字が入っているものとします。 その数値に合わせて、この場合は3なので Sub Sample01() Workbooks("Book3.xls").Worksheets("booksheet3").Copy After:=Workbooks("Book111.xls").Sheet(1) End Sub のようなつまり、booksheet3なるシートをBook111(固定なBOOK)にコピーしようとしています。 このようなことをVBAで書くにはどうすればいいのでしょうか。 ただしBook名とシート名はあくまでデータの値にもとづいたデータをもってくることになります。 要するに間接参照したデータに基づき処理するのをどのように記述するかという質問です。 A列 B列 1 回数 n=3 2     3     4 Book1.xls book1sheet ←n=1 5 Book2.xls book2sheet ←n=2 6 Book3.xls book3sheet ←n=3 7 Book4.xls book4sheet 8 Book5.xls book5sheet 9 Book6.xls book6sheet ←n=6 10 Abc,xls Defsheet ←n=7

  • .xlsにワイルドカードを使うには?

    あい20060925.xls  を下記のように記述してはいけないようですが、 ワイルドカードをどのように使用すればよろしいでしょうか? 以上 よろしくお願い致します。 -------------------- Sub tes1() '任意のブックの全シートを1つのブックにまとめる Workbooks("あい*.xls").Activate ActiveWorkbook.Worksheets. _ Copy after:=Workbooks("集計.xls").Sheets(Workbooks("集計.xls").Sheets.Count) End Sub --------------------

  • Excel VBAの不思議な現象について

    Excel2003を使用しています。 下記にあるコードを実行すると稀に(50回に1回くらいの割合?)、違った動作が走ります。 この原因はなんでしょうか?また、解決策としてはコードをどのように修正したら良いでしょうか?? 【状況】 ・コードを記述しているブック…MENU.xls ・MENU.xlsにあるシート…「メニュー」「AAA」「BBB」「その他」 ※順番もこの通りです 【やりたい動作】 「メニュー」シートのセルの値をコピーして、「AAA」と「BBB」に貼り付ける。 「AAA」と「BBB」を新規ブックへコピーする。 新規ブックにさらに「あああ」と「いいい」というシートを追加する。 新規ブックを確定版.xlsという名前で保存する。 【コード】 ThisWorkbook.Worksheets("メニュー").Range("C1").Copy Worksheets(Array("AAA", "BBB")).Select Range("D9").PasteSpecial Paste:=xlPasteValues ActiveWindow.SelectedSheets.Copy Application.DisplayAlerts = False With ActiveWorkbook .Worksheets.Add(After:=Worksheets(Worksheets.Count)) _ .Name = "あああ" .Worksheets.Add(After:=Worksheets(Worksheets.Count)) _ .Name = "いいい" .SaveAs Filename:=ThisWorkbook.Path & "\" & "確定版.xls" End With Application.DisplayAlerts = True 【不思議な現象】 いつもは、このマクロを実行してエラーも出ず、思った通りの動作で終了します。 ですが、時々、    「AAA」と「BBB」を新規ブックへコピーする。 以降から動作がおかしくなります。 具体的には、 新規ブックに「あああ」と「いいい」が追加されず、MENU.xlsに「あああ」と「いいい」が追加されて、MENU.xlsが「確定版.xls」として保存されてしますのです。 (つまり、ActiveworkbookをMENUであると認識されてしまうようです。) そのため「AAA」と「BBB」を追加した新規ブックは「Book1.xls」として宙ぶらりんの状態です。 この原因は何でしょうか? 途中でエラーが出て止まってくれれば良いのですが、間違ったまま最後まで処理が行われてしまうので困っています。 しかも本当にごく稀にこの現象が起こるのです。 もしお分かりになる方がいらっしゃいましたら教えて下さい。 宜しくお願いします。

  • PERSONAL.XLSのモジュールを呼び出すには?

    任意のブックの標準モジュールから、PERSONAL.XLSの標準モジュールを呼び出す方法をご存知の方おられますか? 基本的なことだと思うのですが、手元の本に載っていません。 PERSONAL.XLS!macroって書いたらVBAEに怒られました! 宜しくお願い致します。

  • エクセルVBAで書式と値の貼付けにつて

    エクセル2007VBAで新規ファイルを作る場合のコピー、貼り付けで質問しましたが 式も全て貼り付けになるとUSBメモリーで持ち出した場合、エラーとなります。 それで値と書式のみ貼り付けする様下記の様に書き直しましたが、.PasteSpecialでメソッドまたはデータメンバーが見つかりませんとなります。 ぐぐっててヘルプを見ますが解決出来ません。どなたがご教授お願いします。 元の式 Sub DGCopy() Workbooks.Add With ThisWorkbook .Sheets(5).Cells.Copy Sheets(1).Cells Sheets(1).Select Sheets("Sheet1").Name = "電気代" .Sheets(6).Cells.Copy Sheets(2).Cells Sheets(2).Select Sheets("Sheet2").Name = "ガス代" F = Application.GetSaveAsFilename(FileFilter:="Excelブック (*.xls),*.xls)") If F = "False" Then Exit Sub ' ダイアログでCancelをクリックした場合 ActiveWorkbook.SaveAs Filename:=CStr(F) End With End Sub 書き直した式 Sub DGCopy() Workbooks.Add With ThisWorkbook Sheets(5).Select Cells.Selection.Copy Sheets(1).Selection .PasteSpecial Paste:=xlPasteFormats ←エラー部分 .PasteSpecial Paste:=xlPasteValues Sheets("sheets1").Name = "電気代" Sheets(6).Select Cells.Selection.Copy Sheets(2).Selection .PasteSpecial Paste:=xlPasteFormats .PasteSpecial Paste:=xlPasteValues Sheets("sheets2").Name = "ガス代" F = Application.GetSaveAsFilename(FileFilter:="Excelブック (*.xls),*.xls)") If F = "False" Then Exit Sub ActiveWorkbook.SaveAs Filename:=CStr(F) End With End Sub

  • VBAでVBAを削除?

    作業中のブックから一枚のシートを以下のSub 別ファイル保存()プロシージャで別のブックとして保存します。それはうまくいったのですが、この元になるシートには Private Sub Worksheet_SelectionChange(ByVal Target As Range) '途中略 End Sub と Private Sub Worksheet_Deactivate() '途中略 End Sub の二つのVBAが記述してあり、これまで一緒に別のブックに入ってしまいます。 これを防ぐにはどのようにすればよいのでしょうか? Sub 別ファイル保存() mypath = ThisWorkbook.Path fn = Sheets("Declarations").Range("H15").Value & Format(Date, "yymmdd") ffn = mypath & "\" & fn & ".xls" Sheets("Declarations").Copy ActiveWorkbook.SaveAs Filename:=ffn ActiveWorkbook.Close End Sub

  • VBAのブックやシートのアクティブ化について質問です。

    元ファイルに格納されているマクロを実行すると、 他のエクセルファイルを開いて、 そこから必要な情報を収集して元ファイルに集める… というマクロをいま組んでいるのですが、 他のエクセルファイルを開いたら、 そのファイルはアクティブになるはずで、 それ以下に記述の処理は、元のファイルを触らない限り、 当該他のファイルに対して行われると思っているのですが、 元ファイルが処理されていします。 なので、現在、記述する際には、 以下のようにブック名とシート名から指定しています。 Workbooks(BookBango & ".xls").Sheets(2).Range(Workbooks(BookBango & ".xls").Sheets(2).Cells(1, 1), Workbooks(BookBango & ".xls").Sheets(2).Cells(paste_counter, 3)).Copy … これで一応動くは動くのですが、 とても冗長ですし、ミスを誘いやすく、修正が大変ですので、 解決したいのですが、 どうにも解決法が分かりません。 不勉強で申し訳ありませんが、どうかご指導下さい。 お願いします。

専門家に質問してみよう