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で質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
【お題】大変な警告
【大喜利】「今このパソコンは大変危険な状態です」という警告メッセージを無視してパソコンを開いたら、こんなことが起こった
-
スマホに会話を聞かれているな!?と思ったことありますか?
スマートフォンで検索はしてないのに、友達と話していた製品の広告が直後に出てきたりすることってありませんか? こんな感じでスマホに会話を聞かれているかも!?と思ったエピソードってありますか?
-
あなたの「プチ贅沢」はなんですか?
お仕事や勉強などを頑張った自分へのご褒美としてやっている「プチ贅沢」があったら教えてください。
-
AIツールの活用方法を教えて
みなさんは普段どのような場面でAIツール(ChatGPTなど)を活用していますか?
-
14歳の自分に衝撃の事実を告げてください
タイムマシンで14歳の自分のところに現れた未来のあなた。 衝撃的な事実を告げて自分に驚かせるとしたら何を告げますか?
-
こんにちは。Accessのことで教えてください。M365環境で、Private Declare Fu
Access(アクセス)
-
mscomct2.ocxをパソコンに導入するには?
Excel(エクセル)
-
ODBCの接続に失敗しました(3146)について
その他(Microsoft Office)
-
-
4
メモ帳(notepad.exe)の起動オプション
UNIX・Linux
-
5
ExcelVBAでのkernel32(64bit)
Visual Basic(VBA)
-
6
参照設定は2.8と6.0 6.1とどちらにチェッ
その他(Microsoft Office)
-
7
「指定したフォルダにあるファイルを書き出す」古いマクロの修正
Visual Basic(VBA)
-
8
VBAで文字を反映させると255文字の制限になってしまいます。
Visual Basic(VBA)
-
9
ACCESS VBAでインポート定義の場所
Access(アクセス)
-
10
Accessのフォームでタブの色
Access(アクセス)
-
11
コモンダイアログコントロールがコンポーネントにありません
Visual Basic(VBA)
-
12
アクセスのフォームで、文字を中央揃えにしたい
Access(アクセス)
-
13
APIを使う時は参照設定は不要?
Excel(エクセル)
-
14
Access VBAでタブコントロールで選択するタブをしていするには。
Access(アクセス)
-
15
コモンダイアログエラー
Excel(エクセル)
-
16
CommonDialog でエラー
Excel(エクセル)
-
17
レコードを保存するコード アクセスvba
その他(Microsoft Office)
-
18
64ビットエクセルでのAPI宣言/PtrSafe
Excel(エクセル)
-
19
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
20
Microsoft Access 2016でエラーが出る
Access(アクセス)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・ことしの初夢、何だった?
- ・【お題】大変な警告
- ・【大喜利】【投稿~1/20】 追い込まれた犯人が咄嗟に言った一言とは?
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・【お題】逆襲の桃太郎
- ・自分独自の健康法はある?
- ・最強の防寒、あったか術を教えてください!
- ・【大喜利】【投稿~1/9】 忍者がやってるYouTubeが炎上してしまった理由
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
サブフォルダ含むフォルダ内の...
-
excel マクロ PDF化の際のエラ...
-
Accessのウインドウサイズの固定
-
コモンダイアログでフォルダを...
-
vbaサブフォルダーをワイルドカ...
-
VBAでフォルダ内のhtmlファイル...
-
「mcisendstring」 MIDIフ...
-
ファイルを複数選択した時のフ...
-
VBからExcelファイルを開くとき...
-
Long型で表現できないファイル...
-
ExcelVBA 文字コード変換
-
ファイルをドラッグした時にexc...
-
「エクセルファイルが開いてい...
-
ファイルへのハイパーリンクで...
-
vbsでのアスタリスクとファイル...
-
ffftpでファイル取得が0バイト...
-
webブラウザからローカルファイ...
-
コモンダイアログのファイルを...
-
動かなくなってしまった古いVBA...
-
[EXCEL-VBA]UsrFormよりD&Dファ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
動かなくなってしまった古いVBA...
-
「エクセルファイルが開いてい...
-
サブフォルダ含むフォルダ内の...
-
VBAでフォルダ内のhtmlファイル...
-
複数のワークブックのVBAを変更...
-
Accessのウインドウサイズの固定
-
VB6でUTF-8ファイルの読取りを
-
vbaサブフォルダーをワイルドカ...
-
FileDialog オブジェクトでファ...
-
ffftpでファイル取得が0バイト...
-
タイムスタンプの更新の方法2
-
VBAでCSVファイルを読み込もう...
-
ExcelVBA 文字コード変換
-
EXCEL VBAを使ったファイル解析...
-
【VBAマクロ初心者】Excel VBA...
-
EXCEL VBA tif画像のプロパティ...
-
AccessからOLEオブジェクト型の...
-
VBAでのファイル名と更新日(作...
-
エクセルのVBAで開いている...
-
excel マクロ PDF化の際のエラ...
おすすめ情報
#4さんのご回答のお礼の補足です。
#4さんのご回答に対応してみたら、エラーメッセージがでました。
メッセージボックスを表示させて、処理の流れを確認しましたところ
If GetOpenFileName(tOpenFileName) = 0
の項でThenに行ってしまい、ファイル名が取得されず処理が終わってしまっていることがわかりました。
パソコンはWindows10・32bit → Windows 11 Pro・64bit への切り替えです。
エクセルのバージョンにつきましては2013~2021(Windows10・64bit)で確認をして、いずれの場合も動作しておりません。