提示のコードだと宣言重複エラーになりますよね。
下記のように宣言重複している行をコメントアウトすれば動作はします。
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
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。