• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:変数を保持して呼び出す方法)

変数の保持と呼び出し方法

このQ&Aのポイント
  • 変数を保持して呼び出す方法や変数が受け継がれない場合の対処法について教えてください。
  • Sub AとSub Bという複数のプロシージャをModule1に配置し、Sub Aで指定したファイルをSub Bで呼び出そうとしていますが、変数が受け継がれません。変数を保持する方法はありますか?
  • シートのセルに変数を保持して呼び出す方法以外に、変数を保持する方法はありますか?

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

  • ベストアンサー
  • kkkkkm
  • ベストアンサー率65% (1624/2466)
回答No.14

利用した各プロシージャの最後に Set C_Ws = Nothing は入れておいてください。 入れておかないと、一度実行して正常にプロシージャから抜けた後でシート名(コードではなく実際のシート名)を変更した場合、そのまま次のプロシージャを実行するとSetとシート名が違うのにエラーになりません。 Setでシート名ではなくシートのオブジェクト名がSetされるためだと思われます。 シート名で探してオブジェクト名でSetする感じ。 なので Set C_Ws = Nothing で開放しておくと、その後の実行時に新しくSetするのでシート名が違う場合ちゃんとエラーになります。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (13)

  • kkkkkm
  • ベストアンサー率65% (1624/2466)
回答No.3

> 多分、Sub A()が終了した時点で一度マクロが終了して > 新たにSub B()を呼び出すので上手く変数が受け継がれないのだと思いますが If rc = vbNo Thenで中止とvbYesの終了どちらで終了しても変数の値は保持しています。 '(途中のコード省略)のところでT_Fileを""にしているところが無いでしょうか。 中止とvbYesの終了のところでMsgBoxでT_Fileの値を確認してみてください。 宣言も同じモジュールの中だという事みたいですので (Sub A()に宣言が無いのでそのままだとT_Fileの定義が無いというエラーになりますよね) Dim T_File As String で大丈夫だと思いますが、一度 Public T_File As String で試してもいいかもしれません。 あと、かなり以前にグローバル変数は何かのタイミングで飛ぶことがあるというのを聞いたことがあります。ただ、かなり前なので今はそういう事は無いのかもしれませんが、もしかしたら程度で片隅に置いておいてもいいかもしれません。

全文を見る
すると、全ての回答が全文表示されます。
  • asciiz
  • ベストアンサー率70% (6650/9424)
回答No.2

ええと、一つのモジュール内で宣言し、そのモジュール内でしか使えない変数を「プライベート変数」と言います。 そしてモジュール外で宣言し、どのモジュールからでも使えるような変数は「グローバル変数」と言います。 Excel VBA で、グローバル変数を作成するには、「Public」を付けて宣言します。 ということでまあNo.1さんと同じ回答にはなってしまうのですが。 次のページなども読んでみてください。 >Office TANAKA - 変数の使い方[変数の適用範囲] >http://officetanaka.net/excel/vba/variable/05.htm

NuboChan
質問者

補足

>Dim T_File As String を >Public T_File As Stringにすればいいのでは。 sub A()が始まる前に DIMで配列宣言をすれば、Public と書かなくても それは、Publicとして扱われると思っていたのですが 私の認識が間違っているいるのでしょうか? Option Explicit Dim dlg As FileDialog Dim T_File As String Sub A()

全文を見る
すると、全ての回答が全文表示されます。
  • sknbsknb2
  • ベストアンサー率38% (1134/2935)
回答No.1

Dim T_File As String を Public T_File As Stringにすればいいのでは。

NuboChan
質問者

補足

>Dim T_File As String を >Public T_File As Stringにすればいいのでは。 sub A()が始まる前に DIMで配列宣言をすれば、Public と書かなくても それは、Publicとして扱われると思っていたのですが 私の認識が間違っているいるのでしょうか? Option Explicit Dim dlg As FileDialog Dim T_File As String Sub A()

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 指定ファイルのみ読み込んで表示する

    現在、以下のコードで指定フォルダー内の全ファイルをA2以下に読み込んでいます。 これでは、処理する必要のないファイルまで読み込まれてしまいます。 (そのため、現在は処理必要ないファイルは手動でA列から削除しています。) Set dlg = Application.FileDialog(msoFileDialogFolderPicker) を Set dlg = Application.FileDialog(msoFileDialogFilePicker) に変更すると ユーザーがファイルを処理が必要なファイルのみ選択できそうですが その場合、どのように変更すれば良いですか ? ’-------------------------------------------------------------- Option Explicit Public dlg As FileDialog Public fol_path As String 'フォルダのフルパス Sub フォルダを指定してファイル名一覧を作成する() Dim f_name As String 'ファイル名 Dim i As Long 'ファイル名を出力する行番号 '書き出しセル初期化 Range("A2:B100").ClearContents 'フォルダを指定するモードでFileDialogを表示 Set dlg = Application.FileDialog(msoFileDialogFolderPicker) '読み込み初期フォルダーの指定 dlg.InitialFileName = "C:\Users\Nubo\Desktop\Temp\" If dlg.Show = False Then MsgBox "処理はキャンセルされました。" Exit Sub Else End If fol_path = dlg.SelectedItems(1) '指定されたフォルダのフルパスを変数に格納 f_name = Dir(fol_path & "\*") 'Dir関数を使って、指定されたフォルダ内の一つ目のファイル名を取得 If f_name = "" Then MsgBox fol_path & " にはファイルが存在しません。" Exit Sub End If 'シートに書き出す Range("C1").Value = fol_path & "のファイル一覧" Range("A1").Value = "現在のファイル名" '見出し行の表示(太字、フォントサイズ 12) With Range("A1:B1") .Font.Bold = True .Font.Size = 12 End With 'A2セルから下にファイル名を書き出し i = 2 Do Until f_name = "" Cells(i, "A").Value = f_name i = i + 1 '次のファイル名を取得 f_name = Dir Loop 'セルの内容に合わせて列幅を自動調整する Range("A:D").EntireColumn.AutoFit MsgBox Sheets("DATA").Name & "にファイル名一覧を作成しました。" & Chr(13) & _ "変名に必要ないファイル名があれば削除してください。" End Sub ’----------------------------------- Office 2021,Windows_11

  • ExcelVBA どこが間違えていますか?

    ExcelVBA 初心者です。 下記のようなプロシージャを人様の作ったのをコピーして作ったのですが意図したとおりになりません。どこが間違っているのか教えてください。 私の意図は選択したフォルダの中の全ファイル(Book)名をアクティブシートのA列に順番に表示したい、です。今は実行すると全部セルA1に表示されてしまって、最後の1つのファイル名しか分かりません。ファイルごとに別のセルに表示したいのです。よろしくお願いします。 Sub ファイル一覧() Dim foldername As String Dim filename As String Dim i As Integer Dim dlg_folder As FileDialog Set dlg_folder = Application.FileDialog(msoFileDialogFolderPicker) Folder_Dialog: dlg_folder.Show If dlg_folder.SelectedItems.Count <> 1 Then Exit Sub Else foldername = dlg_folder.SelectedItems.Item(1) MsgBox "選択したフォルダは " & foldername & " です。" filename = Dir(foldername & "\*.xls", vbNormal) If filename = "" Then MsgBox "Excelファイルがありません。" GoTo Folder_Dialog End If End If Set dlg_folder = Nothing Do While filename <> "" For i = 1 To Workbooks.Count Cells(i, 1).Value = filename i = i + 1 Next i filename = Dir() Loop MsgBox "フォルダ " & foldername & " の中のファイルはすべて表示されました。" End Sub あれ、なぜかインデントが無効になっています。

  • msoFileDialogFolderPicker

    オフィス2003を使っています。 Sub Sample1() With Application.FileDialog(msoFileDialogFolderPicker) If .Show = True Then MsgBox .SelectedItems(1) End If End With End Sub をエクセルの標準モジュールに張り付けるとフォルダを選択するダイアログが開きますが、 アクセスに張り付けると 「msoFileDialogFolderPicker」 の部分が、「変数が定義されていません」となってしまいます。 アクセスでも使えるようにするにはどうすればいいでしょうか?

  • なぜiは変数の値が保持されるのに、wは保持されない

    なぜiは変数の値が保持されるのに、wは保持されないのでしょうか? Sub test() Dim w As Worksheet Dim i As Long i = 1 For Each w In Worksheets i = i + 1 Next MsgBox i MsgBox w.Name End Sub -------------------------------------- を行うと、 MsgBox i は表示されるのに、 MsgBox w.Name は、 「オブジェクト変数または With ブロック変数が設定されていません。」になります。 wはオブジェクト変数だから、 For Each ステートメントを抜けると値が破棄されてしまうのでしょうか? でもvbaのヘルプの 「For Each...Next ステートメントの使い方」 を見ても 「ステートメントを抜けるとオブジェクト変数なら値が破棄されます」 と記載されていません。

  • ACCESS エクスポート ダイアログ ファイル名取得

    ACCESS2003で作成したデータをダイアログで指定したファイル名でエクスポートしたいのですが、上手くできません。 ダイアログが開きその指定したフォルダーにあるエクセルファイルを選択すれば、正常にエキスポートできるのですが、 開いたダイアログにファイル名を入力すると、それ以降動かなくなります。 基本的なことが間違っているのでしょうか?? 詳しい方教えてください。下記にコードした内容を書きました。 よろしくお願いします。 Private Sub cmbTransExcel_Click() On Error GoTo Err_cmbTransExcel_Click Dim fileSaveName As Variant Set dlg = Application.FileDialog(msoFileDialogOpen) With dlg .Title = "チェック" .ButtonName = "エキスポート" .InitialFileName = "C:\Program Files\DATA\" .InitialView = msoFileDialogViewList .AllowMultiSelect = False .Filters.Clear .Filters.Add "xls", "*.xls" End With With dlg If .Show = -1 Then For Each vntPath In dlg.SelectedItems strPath = vntPath Next Else Set dlg = Nothing Exit Sub End If End With Set dlg = Nothing Dim strac As String Dim varxls As Variant Dim strmsg As String strac = "Q_チェック" 'Accessファイルを指定します。 varxls = strPath 'エクセルファイルを指定します。 strmsg = strac & " を、Excelファイルへ出力します。" & Chr(13) & _ "出力先は" & varxls & "、 シート名は" & strac & "です。" & _ Chr(13) & "よろしければ、OKをクリックして下さい。" If MsgBox(strmsg, vbOKCancel) = vbOK Then '最初のデータをフィールド名として使います。 DoCmd.TransferSpreadsheet acExport, _ acSpreadsheetTypeExcel9, strac, varxls, True MsgBox "EXCELの出力が正常終了しました。", vbInformation, "処理終了" End If Exit_cmbTransExcel_click: Exit Sub Err_cmbTransExcel_Click: MsgBox "EXCELの出力が異常終了しました。", vbCritical, "エラー!" Resume Exit_cmbTransExcel_click End Sub

  • iと言う変数の値が1から10の間にないならば

    「iと言う変数の値が1から10の間にないならば」、としたいのですが どのようなコードを書けばいいのでしょうか? Sub test1() Dim i As Integer i = 11 If 1 < i < 10 Then MsgBox i & "は1から10の間にはありません" End If End Sub だと、メッセージが表示されてしまいます。

  • プログラムのイベント処理中断方法

    VB2008のイベンド中止処理についてお教え頂けませんでしょうか。 Formにボタンが1つあり、クリックするとCSVファイルが出力される処理をしたいです。 やりたい処理: 1. 「CSVファイル出力しますか?」というメッセージを出す。YESなら処理続行。Noなら処理中止。 2. CSVファイル出力処理。 3. 「CSVファイルを出力しました。」 (プログラム自体を終了したいわけではありません) VBAだと下記のようなコードを書きたいです。 Sub テスト() Dim ans As Integer ans = MsgBox("CSVファイル出力しますか?", vbYesNo, "テスト") If ans = vbNo Then end end if 'CSV出力処理~~~ end sub VBにendというステートメントがあれば、良いのですが無さそうです・・・ 何か上手な処理はあるでしょうか?VBAのコードになってしまいますが、下記のような処理方法しかないでしょうか? '''''''''''''''''1 Sub テスト() Dim ans As Integer ans = MsgBox("CSVファイル出力しますか?", vbYesNo, "テスト") If ans = vbNo Then end else 'CSV出力処理~~~ end if end sub ''''''''''''''''2 Sub テスト() Dim ans As Integer ans = MsgBox("CSVファイル出力しますか?", vbYesNo, "テスト") If ans = vbNo Then goto here end if 'CSV出力処理~~~ here: end sub

  • VBAでユーザーフォーム上に参照したファイルを開きたいのですが…

    EXCEL2003 SP3での質問です。 ユーザーフォームをVBAで作成中です。 主な機能は、対象月をコンボBOXで選択させた上で、 データ元とインプット先のファイルをテキストBOXに参照し、 実行ボタンクリックでデータ元からインプット先の該当月シートに データをコピーするといった感じです。 (データ元の該当シート内データを全てコピー&ペースト) 取り込み以降の処理はVBAを使用せずに作成しようと考えています。 質問は、取込みたいファイルの参照後の「ファイルを開いてデータをコピーする」処理がうまくいかず、 どのようにしたらよいか教えて頂けますでしょうか。 現在、以下のように記述していますが、 CommandButton3_Click()の部分の処理が分からずファイルが開けません。ご教授ください。 Private Sub CommandButton1_Click() With Application.FileDialog(msoFileDialogFilePicker) .Filters.Clear .Filters.Add "テキスト", "*.csv;*.txt", 1 If .Show = 0 Then Exit Sub Me.TextBox1.Text = .SelectedItems(1) End With End Sub Private Sub CommandButton2_Click() With Application.FileDialog(msoFileDialogFilePicker) .Filters.Clear .Filters.Add "テキスト", "*.csv;*.txt", 1 If .Show = 0 Then Exit Sub Me.TextBox2.Text = .SelectedItems(1) End With End Sub Private Sub CommandButton3_Click() Dim file_name As String If TextBox1.Text = "" Then MsgBox "ファイルが指定されていません", vbInformation ElseIf TextBox1.Text = "" Then file_name = TextBox1.Text = "" Shell "Workbooks.OpenText TextBox1.Value " End If End Sub Private Sub CommandButton4_Click() yesno = MsgBox("保存後、ファイルを閉じます。終了していいですか?", vbYesNo + vbQuestion, "Reportの終了") If yesno = vbYes Then ActiveWorkbook.Save ActiveWorkbook.Close Else End If End Sub

  • フォルダ選択で取得した値を保持する方法

    Excel2007VBA(Vista)を使って、『動画探して一覧表示して選択したら再生出来る自作ソフト』 を作ろうとしています。 分からないのは、以下のコード(処理)で取得出来るフルパスの情報(データ)を 一時的に関数等で保存する方法です。 ※このコードの記述は、 「フォルダを手動で選択後、画面(メッセージボックス)に位置(パス)を表示する」ものです。 With Application.FileDialog(msoFileDialogFolderPicker) 'フォルダを選択する画面を表示する If .Show = True Then 'フォルダを選択後、選択したフォルダがあった時 MsgBox .SelectedItems(1) 'メッセージボックスの画面にパスが表示される End If End With メッセージボックスに出てくる値(パス)を、次に作りたい処理 「フォルダの中にある関係するファイル名を全て一覧で表示する」 の時に使いたいと思っています。 関数の使い分や、オブジェクト型とかの違いが出来ず調べ下手の為、お手上げです! でも絶対完成させたいです。アドバイス宜しくお願いします。

  • 再度,ExcelVBA,public変数が消える

    大変申し訳ありません。一度、この件で質問し、その回答を締め切ったばかりなのですが、やはりもう少し知りたくて質問させていただきます。 ある方の回答への補足で、以下のマクロを具体例としてあげました。ただし、以下のマクロは、時にはpublic変数が消えてしまいますが、しかし、消えないこともあります。 消える理由として、 回答していただいたものから考えて、 1.End Sub を通っていないままに終了しているから 2.不完全なマクロ 3.きちんと作られたマクロの流れ(ルーチン)ではない流れがある 4.「Public 変数は、標準モジュールを経由して、ローカルのUserForm に供給、しかし、それを戻すということはしない。つまり、a.ローカルで発生した値 →標準モジュールのPublic 変数 →UserFormのローカルのプロシージャ b.標準モジュールのPublic 変数 → UserFormのローカルのプロシージャ   ※ただし、起動時の一回きり、それ以上の持ち回しはしない。逆もしない。」この件に関して、以下のマクロに問題がある。 この様なことを考えました。 4.の場合、testMainからtest1.showを呼び出し、a=10とするが、このaの値は、testMainには戻らない(戻らないことがある)のでしょうか、あるいは、testMainのend sub の後は値が保障されないのでしょうか。 あるいは、 Worksheet_SelectionChange でend sub で終わっているので、それ以降は値が保持されないのでしょうか。 あるいは、どこかに欠陥のあるマクロなのでしょうか。 http://okwave.jp/qa/q6420530.html への回答のno.6の例のマクロでendをコメントにするかしないかで、endをコメントにした場合はend subで終わった後、値が保持されています。このこととも合わせて考えると、どこに問題があるのか、どのような問題があるのか、よく分からなくなってしまいます。 よろしくお願いします。 標準モジュールにーーーーーーーーーーーーーーーーー Option Explicit Public a As String Sub ini() MsgBox "初期化します" a = "5" End Sub Sub testMain() If a = "" Then ini MsgBox a test1.Show End Sub test1 というフォームのモジュールにーーーーーーーーーーーーーー (このフォームに コマンドボタンがあります。) Private Sub CommandButton1_Click() a = "10" Unload Me End Sub シートのモジュールにーーーーーーーーーーーーーーーーー Option Explicit Private Sub Worksheet_SelectionChange(ByVal Target As Range) testMain End Sub

専門家に質問してみよう