質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

ダイアログ

ユーザーにウィンドウやボックス等の形で個別で表示されるフォームであり、ユーザーに判断を促す目的で表示される。ユーザーが見逃す事のないよう、操作中のフォーム上にポップアップして表示される。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Q&A

解決済

2回答

1773閲覧

【VBA】ダイアログボックスで取得したパスを別プロシージャで使いたい

ff.kk

総合スコア17

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

ダイアログ

ユーザーにウィンドウやボックス等の形で個別で表示されるフォームであり、ユーザーに判断を促す目的で表示される。ユーザーが見逃す事のないよう、操作中のフォーム上にポップアップして表示される。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

0グッド

0クリップ

投稿2019/03/18 02:35

前提・実現したいこと

VBAでダイアログボックスで取得したパスを別プロシージャで使いたいと思っています。
例があまりよくないかもしれませんが、
列削除プロシージャでダイアログボックスでパスを取得し、列削除(処理1)を行い、
その後、行削除(処理2)のみ行いたいとき、同様のパスを使用するにはどのように書けばよいでしょうか?

このソースコードで書くと列削除のみ、行削除のみで実行できず、
行削除プロシージャで列削除プロシージャが呼び出されて、どちらも実行されてしまいます。

※列削除、行削除はあくまで例となります。
※初心者でもわかりやすく教えて頂けるととても嬉しいです。

該当のソースコード

VBA

1Sub 列削除(ByRef OpenFilePath As String) 2 Dim OpenFilePath As String 3 OpenFilePath = Application.GetOpenFilename("Microsoft Excelブック,*.xls?") 4 5 '列削除の処理 6End Sub 7 8Sub 行削除() 9 Dim filePath As String 10 Call 列削除(filePath) 11 12 '行削除の処理 13End Sub

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

提示のコードだと宣言重複エラーになりますよね。
下記のように宣言重複している行をコメントアウトすれば動作はします。

vba

1Public Sub 列削除(ByRef OpenFilePath As String) 2' Dim OpenFilePath As String 3 OpenFilePath = Application.GetOpenFilename("Microsoft Excelブック,*.xls?") 4 5 '列削除の処理 6End Sub 7 8Public Sub 行削除() 9 Dim filePath As String 10 Call 列削除(filePath) 11 12 '行削除の処理 13End Sub

このソースコードで書くと列削除のみ、行削除のみで実行できず、
行削除プロシージャで列削除プロシージャが呼び出されて、どちらも実行されてしまいます。

そのようにコードを書いていますから当然そうなります。

まず、やりたいことを整理しましょう。

特定のワークブックに対して、列削除、行削除をしたい。
両方実行する場合もあり、また、片方だけ実行したい場合もある。

ということだとします。
列削除、行削除は、ワークブックに対して行う処理なので、パスを渡すとその処理の中でワークブックを開く処理が必要になりますが、両方実行する場合、無駄になりますよね。あるいは、既に開いているかどうか確認する処理とかも必要になり複雑になります。
ワークブックオブジェクトを渡せば、単純に、列削除、行削除のみのコードを書けばいいのでシンプルになります。

そうすれば、列削除、行削除 を呼び出すときに、ワークブックを開いてそれを引数で渡すか、開いているなら開いているワークブックを引数に渡せばいいだけです。

例えば、ユーザーがダイアログで指定したワークブックに対して、行削除、列削除を実行したいなら、下記のようなコードになります。

vba

1Public Sub Test() 2 Dim OpenFileName As String 3 Dim wb As Workbook 4 5 OpenFileName = Application.GetOpenFilename("Microsoft Excelブック,*.xls?") 6 If OpenFileName <> "False" Then 7 Set wb = Workbooks.Open(OpenFileName) 8 Call 行削除(wb) 9 Call 列削除(wb) 10 Else 11 MsgBox "キャンセルされました" 12 End If 13End Sub 14 15Public Sub 列削除(ByRef wb As Workbook) 16 With wb 17 18 'ワークブックに対する列削除の処理 19 MsgBox .Name & "に対して列削除" 20 End With 21End Sub 22 23Public Sub 行削除(ByRef wb As Workbook) 24 With wb 25 26 'ワークブックに対する行削除の処理 27 MsgBox .Name & "に対して行削除" 28 End With 29End Sub

投稿2019/03/18 03:32

hatena19

総合スコア33699

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

その例だと行削除の中で列削除してしまいますが大丈夫ですか・・・?
別々に行いたいものと仮定してお答えします。

ダイアログを求める部分と処理を行うプロシージャを分割するのが一般的です。

vba

1Sub 列削除(ByVal filePath As String) 2 '列削除の処理 3End Sub 4 5Sub 列削除_dlg() 6 Dim filePath As String 7 filePath = Application.GetOpenFilename("Microsoft Excelブック,*.xls?") 8 Call 列削除(filePath) 9End Sub 10 11Sub 行削除(ByVal filePath As String) 12 '行削除の処理 13End Sub 14 15Sub 行削除_dlg() 16 Dim filePath As String 17 filePath = Application.GetOpenFilename("Microsoft Excelブック,*.xls?") 18 Call 行削除(filePath) 19End Sub 20 21Sub 行と列削除_dlg() 22 Dim filePath As String 23 filePath = Application.GetOpenFilename("Microsoft Excelブック,*.xls?") 24 Call 列削除(filePath) 25 Call 行削除(filePath) 26End Sub

プロシージャ分割をしたくない場合はこんな方法も考えられます。
※ただしエクセルが再起動したり「END」ステートメントが実行されるまで、ダイアログが二度と要求されなくなりますので、都度確認が必要な場合は使えません。

vba

1Function ファイル選択() As String 2 Static OpenFilePath As String 3 If OpenFilePath = "" Then 4 OpenFilePath = Application.GetOpenFilename("Microsoft Excelブック,*.xls?") 5 End If 6 ファイル選択 = OpenFilePath 7End Function 8 9Sub 列削除() 10 Dim filePath As String 11 filePath = ファイル選択 12 13 '列削除の処理 14End Sub 15 16Sub 行削除() 17 Dim filePath As String 18 filePath = ファイル選択 19 20 '行削除の処理 21End Sub 22 23Sub 行と列削除() 24 Call 列削除 25 Call 行削除 26End Sub

投稿2019/03/18 02:54

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ff.kk

2019/03/18 04:07

後者のような実行をしたかったのです。 乏しい質問内容からご回答いただきありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問