
VBAの質問です。
20年前に作られたファイルの更新をしたいです。
ファイルの場所およびファイル名を取得する箇所で、該当のボタンを押すとファイル選択のエクスプローラーが起動するはずなのですが、パソコンを入れ替えたら何も起きなくなってしまいました。
(エラーも出ません)
コードの該当箇所はここだと思うのですが、どこかを書き換えれば動くようになるでしょうか。
なお、一般公開してはまずい情報は含まれていないと判断してアップロード致しましたが、万一含まれていましたらご指摘下さい。質問を取り消します。
Private Sub CommandButton2_Click()
Dim tOpenFileName As OpenFileName
With tOpenFileName
'構造体のサイズを設定
.lStructSize = LenB(tOpenFileName)
'親ウィンドウのハンドルを指定
'.hwndOwner = Me.hWnd
'アプリケーションのインスタンスのハンドルを指定
'.hInstance = App.hInstance '不要の時 0&
'ファイルパターンを設定(複数指定する場合は続いて記入)
.lpstrFilter = "Excelファイル(*.XLS)" & vbNullChar & "*.XLS"
'優先的に表示させるフィルタのインデックス
.nFilterIndex = 1
'ファイル名の内容を初期化
.lpstrFile = String$(256, Chr$(0)) ' "*.txt" & String$(256, Chr$(0))
'同バイト数
.nMaxFile = 256
'ファイル名を受取るバッファの設定(Nullで埋めておく)
.lpstrFileTitle = String$(256, Chr$(0))
'同バイト数
.nMaxFileTitle = 256
'デフォルトのフォルダ名の設定
.lpstrInitialDir = "C:\"
'ダイアログのキャプション名
.lpstrTitle = "ファイルを開く"
'flagsの動作の設定
.flags = OFN_EXPLORER Or OFN_PATHMUSTEXIST _
Or OFN_FILEMUSTEXIST Or OFN_HIDEREADONLY
End With
'ダイアログの表示
If GetOpenFileName(tOpenFileName) = 0 Then
'キャンセルボタンを押した場合(クローズ・エラーも)
strFileName = ""
Exit Sub
Else
'開くボタンを押した場合(ファイル名を取得)
Sheet5.Cells(7, "M") = Left$(tOpenFileName.lpstrFile, InStr(tOpenFileName.lpstrFile, vbNullChar) - 1)
Sheet5.Cells(7, "N") = Left$(tOpenFileName.lpstrFileTitle, InStr(tOpenFileName.lpstrFileTitle, vbNullChar) - 1)
End If
End Sub
A 回答 (8件)
- 最新から表示
- 回答順に表示
No.8
- 回答日時:
こんにちは
取り合えず既存コードをおいといて
#6にある参考サイトのGetOpenFileName 部分を
新規モジュールに丸っとコピペして
Function呼び出し用のプロシージャ・・例
Sub test()
MsgBox GetMyFile("ファイルを開く")
End Sub
を追加・・・
testを実行するとダイアログが生成されます
ファイルを選ぶと情報がMsgboxで返り、キャンセルですと空のstringが返るはずです
OpenFileはWithで括ることも出来るでしょう
各パラメータを確認変更して使用できるようであれば、置き換えて使用することも出来ると思います
API シート関数、シートメソッド、シートオブジェクトは
バージョン変更などで仕様が変わる事があります
この際、改修し易い(理解度や情報が多くある)メソッドやロジックに変えてしまうのが良いと思います。
No.7
- 回答日時:
こんばんは
横からですが・・・
APIの宣言を後出しなさったりしている様子から想像するところ、失礼ながら、質問者様はVBAをあまりご存じないのではないかとの印象を受けました。
ご提示のコードにこだわる理由がわかりませんけれど、ざっと見たところダイアログで指定ファイルのパス(ファイル名かな?)を取得するだけのもののように思われます。
であるなら、わざわざ回りくどい方法をとらなくても、普通の方法で取得すれば簡潔になるのではないでしょうか?
既に、No5様が具体例をご提示済みですが、そちらを利用すれば済む話ではないかと思いますけれど・・
No.6
- 回答日時:
>という記述がありましたので、下記に書き換えてみました。
APIに問題がある場合
Private Type 必要個所が使われているかは不明ですが、書き換える必要があるかも知れません
VBA7の場合
Private Declare PtrSafe Function GetOpenFileName Lib "comdlg32.dll" Alias _
"GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long
Private Type OPENFILENAME
lStructSize As Long
hwndOwner As LongPtr
hInstance As LongPtr '
lpstrFilter As String
lpstrCustomFilter As String
nMaxCustFilter As Long
nFilterIndex As Long
lpstrFile As String
nMaxFile As Long
lpstrFileTitle As String
nMaxFileTitle As Long
lpstrInitialDir As String
lpstrTitle As String
flags As Long
nFileOffset As Integer
nFileExtension As Integer
lpstrDefExt As String
lCustData As LongPtr
lpfnHook As LongPtr
lpTemplateName As String
End Type
参考:https://jkp-ads.com/articles/apideclarations.asp
ご回答ありがとうございます。
下記の記述がありました。
★がついている所が、ご回答の内容と書いてあることが違うようです。
'動作条件を設定するOPENFILENAME構造体(P158)
Public Type OPENFILENAME
lStructSize As Long '構造体のサイズ
hwndOwner As Long '親ウィンドウのハンドル★
hInstance As Long 'モジュールのインスタンスハンドル★
lpstrFilter As String 'VBのファイルパターン
lpstrCustomFilter As String 'カスタムフィルタ
nMaxCustFilter As Long '同バイト数
nFilterIndex As Long 'フィルタのインデックス
lpstrFile As String 'フルパス名を受取るバッファ
nMaxFile As Long '同バイト数
lpstrFileTitle As String 'ファイル名を受取るバッファ
nMaxFileTitle As Long '同バイト数
lpstrInitialDir As String '初期ディレクトリ名
lpstrTitle As String 'ダイアログボックスのキャプションタイトル
flags As Long '動作を指定する定数の組合せ
nFileOffset As Integer 'フルパス中のファイル名までのオフセット
nFileExtension As Integer '同 拡張子までのオフセット
lpstrDefExt As String 'デフォルトの拡張子
lCustData As Long 'フックプロシージャに渡すデータ★
lpfnHook As Long 'フックプロシージャOFNHookprocへのポインタ★
lpTemplateName As String 'テンプレートリソース名
End Type
No.5
- 回答日時:
#2です。
ごめんなさい>'.hInstance = App.hInstance
コメントブロックにされていましたね・・#2は忘れてください
>グレイアウトしたままなのですが
コンパイルは出来ているかと・・実行時自動でされるので気にしなくて良いと思います
GetOpenFileName Lib・・
なんか・・他の処理で使っているかもですが
Shell "EXPLORER.EXE /select とか
Application.GetOpenFilename メソッド で代用出来ないかな?
GetOpenFilenameの例 ファイル名のみ
Sub ExcelFile()
Dim openFilePath As String
openFilePath = Application.GetOpenFilename _
("Excel ファイル,*.xls*", , "エクセルファイルを選んで下さい", MultiSelect:=False)
If openFilePath <> "" Then Sheet5.Cells(7, "M") = Dir(openFilePath)
End Sub
複数選択が必要の場合、(MultiSelect:=True)
Application.GetOpenFilenameをVariantで受けて
配列で複数ファイル情報を取得します
この時のキャンセル対応
If IsEmpty(openFilePath) Then
windows APIについてはうる覚えで調べられる環境にないので とりあえず
No.3
- 回答日時:
Cドライブ以外があればそれを、なければ任意のフォルダを作成し『Cドライブ直下を指定するのをやめる』なんて事はないかな。
初級レベルなジジィですし。
パソコンを入れ替えたってなら『環境をどう変えたのか(Excelのバージョンも変わったのか)』を書かれては?
ご回答ありがとうございます。
パソコンはWindows10・32bit → Windows 11 Pro・64bit への切り替えです。
エクセルのバージョンにつきましては2013~2021(Windows10・64bit)で確認をして、いずれの場合も動作しておりません。
No.2
- 回答日時:
こんにちは
コンパイルは出来ているのでしょうか?
API、Type部分など点検してみては・・32bit-->64bit
Excelを64bitに変えているのなら・・
ぱっと見 .hInstance を(.Hinstanceプロパティを指しているのなら)
.hinstancePtrにしてLongPtr 型に変更するとかでしょうか・・・
他にも多分あると思いますが・・この情報だけでは、分かりませんね
エラーが出ない・・・エラー対策などがあるものと思いますので、
すべて外してデバッグしながら進めるかですかね・・・
ご回答ありがとうございます。
恥ずかしながらエクセルVBAでコンパイルが必要だとは知りませんでした…
メニューの デバッグ>コンパイル を選んでしばらく経ちますが、何も起きま せん。
「コンパイル」のメニューもグレイアウトしたままなのですが、このまま待って いて大丈夫なのでしょうか。
'ファイル選択ダイアログボックスを表示する(P157)
Declare PtrSafe Function GetOpenFileName Lib "comdlg32.dll" (pOpenfilename As OpenFileName) As Long
という記述がありましたので、下記に書き換えてみました。
しかし、まだ動きません。
Declare PtrSafe Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" (pOpenfilename As OpenFileName) As Long
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Excel VBAどこが間違ってますか? 4 2023/07/17 10:04
- Visual Basic(VBA) エクセルのマクロについて教えてください。 4 2023/07/03 09:11
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 1 2023/08/09 10:33
- Excel(エクセル) フォルダ内のワードファイルをPDFに一括変換するVBA 3 2023/06/09 16:51
- Visual Basic(VBA) VBA 参照先で選んだファイルをコピーし、出力先に別名で保存したい 8 2022/05/13 20:37
- Visual Basic(VBA) 複数のcsvファイルをExcelに一括変換したい 2 2023/03/03 12:44
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/06 17:46
- Visual Basic(VBA) エクセルのマクロについて教えてください。 7 2023/07/04 09:18
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Visual Basic(VBA) VBAでファイルを開くプログラムがエラーです 2 2023/02/21 16:56
このQ&Aを見た人はこんなQ&Aも見ています
-
こんにちは。Accessのことで教えてください。M365環境で、Private Declare Fu
Access(アクセス)
-
ODBCの接続に失敗しました(3146)について
その他(Microsoft Office)
-
CommonDialog でエラー
Excel(エクセル)
-
-
4
Excelの入力規則で2列表示したい
Excel(エクセル)
-
5
コモンダイアログコントロールがコンポーネントにありません
Visual Basic(VBA)
-
6
mscomct2.ocxをパソコンに導入するには?
Excel(エクセル)
-
7
ExcelVBAでのkernel32(64bit)
Visual Basic(VBA)
-
8
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
9
Vba LongPtrについて教えてください
Visual Basic(VBA)
-
10
ACCESSのクエリで集計で、先頭・最後とは?
その他(データベース)
-
11
オートシェイプがずれる
Excel(エクセル)
-
12
括弧があるとHYPERLINKで飛べない?
Excel(エクセル)
-
13
コモンダイアログエラー
Excel(エクセル)
-
14
「タイプ初期化子が例外をスローしました」エラー何?
Visual Basic(VBA)
-
15
MSCOMCTL.OCXのアップデートの方法
Visual Basic(VBA)
-
16
レコードを保存するコード アクセスvba
その他(Microsoft Office)
-
17
64ビットエクセルでのAPI宣言/PtrSafe
Excel(エクセル)
-
18
Access2010 Enterで次テキストへ移動
その他(Microsoft Office)
-
19
メッセージボックスで1025文字以上を扱う
Visual Basic(VBA)
-
20
Excel2019 非表示モジュール内でコンパイルエラー
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
動かなくなってしまった古いVBA...
-
AccessからOLEオブジェクト型の...
-
Excel for mac 2011でDir関数?
-
FileDialog オブジェクトでファ...
-
VBAでフォルダ内のhtmlファイル...
-
マクロのワイルドカードの使い...
-
vbsでのアスタリスクとファイル...
-
EXCEL VBAを使ったファイル解析...
-
Excel VBA Outlookメールにエ...
-
サブフォルダ含むフォルダ内の...
-
ファイルを複数選択した時のフ...
-
webブラウザからローカルファイ...
-
vbaサブフォルダーをワイルドカ...
-
ffftpでファイル取得が0バイト...
-
フォルダ階層・ファイル名・ペ...
-
VB6でUTF-8ファイルの読取りを
-
ExcelのVBAコードについて教え...
-
VBA ディレクトリ名をワイルド...
-
「エクセルファイルが開いてい...
-
エクセルのプロパティーでセキ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
動かなくなってしまった古いVBA...
-
「エクセルファイルが開いてい...
-
FileDialog オブジェクトでファ...
-
VBAでフォルダ内のhtmlファイル...
-
VB6でUTF-8ファイルの読取りを
-
vbaサブフォルダーをワイルドカ...
-
webブラウザからローカルファイ...
-
ffftpでファイル取得が0バイト...
-
サブフォルダ含むフォルダ内の...
-
ファイルを複数選択した時のフ...
-
VBAでCSVファイルを読み込もう...
-
複数のワークブックのVBAを変更...
-
excel マクロ PDF化の際のエラ...
-
Wordのプロパティ・総ページ数...
-
フォルダ階層・ファイル名・ペ...
-
フォルダ内のファイル存在監視...
-
AccessからOLEオブジェクト型の...
-
VB.net XMLの作成方法 Iniの代替
-
【ACCESS VBA】アクセスからデ...
-
vbs ブック共有を解除
おすすめ情報
#4さんのご回答のお礼の補足です。
#4さんのご回答に対応してみたら、エラーメッセージがでました。
メッセージボックスを表示させて、処理の流れを確認しましたところ
If GetOpenFileName(tOpenFileName) = 0
の項でThenに行ってしまい、ファイル名が取得されず処理が終わってしまっていることがわかりました。
パソコンはWindows10・32bit → Windows 11 Pro・64bit への切り替えです。
エクセルのバージョンにつきましては2013~2021(Windows10・64bit)で確認をして、いずれの場合も動作しておりません。