[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『ユーザーメニューからファイルを参照し、ファイルを開くを押すとエラー』(ロジック)
画像のファイル名の抽出マクロの件でお世話になりましたロジックです。
改めて解決したいことがあり質問させていただきます。
ファイル抽出というシートに、ユーザーフォームを読み込むボタンを作り実際の読み込みに成功いたしました。
それが下記になります。
h ttp://photozou.jp/photo/show/3183234/256201517
ソースコードは下記になります。
ファイル抽出シート
Load UserForm1 UserForm1.Show End Sub
ユーザーフォーム用コード
' カレントフォルダを 指定して[ファイルを開く]ダイアログを表示 CreateObject("WScript.Shell").CurrentDirectory = "C:\Users\Owner\Downloads\base\setting_000002016" OpenFileName = Application.GetOpenFilename()
'ファイルが正しく選択されたら ファイル名をテキストボックスに表示 If OpenFileName <> "False" Then txtFileName.Value = Dir(OpenFileName) cmdShori.SetFocus End If End Sub
Private Sub CommandButton4_Click()
Workbooks.Open Label_File1.Caption Cells.Copy ThisWorkbook.Sheets("item").Range("A1") ActiveWorkbook.Close False
End Sub
Private Sub UserForm_Initialize()
Label1.Caption = "ファイル1" Label2.Caption = "ファイル2" End Sub
上記のコードは
h ttps://h1r0-style.net/excelvba/getopenfilename
を利用して作ったものですが、
ユーザーフォームを開きファイルを開くボタンを押したら
txtFileName.Value = Dir(OpenFileName)
の部分にエラーが発生してオブジェクトが必要ですと表示されたのですが、どのような原因でしょうか?
< 使用 Excel:Excel2016、使用 OS:Windows10 >
(γ) 2018/06/09(土) 11:51
"C:\Users\Owner\Downloads\base\setting_000002016\item.csv"
のようになっております。
(ロジック) 2018/06/09(土) 11:53
(γ) 2018/06/09(土) 11:57
(γ) 2018/06/09(土) 12:02
>>txtFileNameは作成されているのですね。
こちらはスキップですか?
サンプルから作成したのでどのように作成したらいいかわかりませんでした。
(ロジック) 2018/06/09(土) 12:05
(γ) 2018/06/09(土) 12:09
Option Explicit
は、記述していますよね。
(マナ) 2018/06/09(土) 13:24
間違いなく記述しております。
(ロジック) 2018/06/09(土) 13:36
そうですか。では、わたしには原因はわかりそうにありません。
(マナ) 2018/06/09(土) 13:51
短い間でしたが、ありがとうございます。
(ロジック) 2018/06/09(土) 13:53
(マナ) 2018/06/09(土) 13:56
(ロジック) 2018/06/09(土) 13:59
h ttp://photozou.jp/photo/show/3183234/256205163
が得られたものです。
ですが、このパス名をファイル名に返すという風にするにはどのような記述をすればよろしいでしょうか?
Private Sub cmdSearch_Click()
Dim OpenFileName As String
' カレントフォルダを "C:\Test" として[ファイルを開く]ダイアログを表示 CreateObject("WScript.Shell").CurrentDirectory = "C:\" OpenFileName = Application.GetOpenFilename()
'ファイルが正しく選択されたら ファイル名をテキストボックスに表示 If OpenFileName <> "False" Then TextBox1.Value = Dir(OpenFileName) cmdShori.SetFocus
End If End Sub
Private Sub CommandButton1_Click()
TextBox1.Value = _ Application.GetOpenFilename("CSVファイル(*.csv),*.csv", 1, _ "読み込むcsvファイルを選んで", False) End Sub
Private Sub CommandButton3_Click()
TextBox2.Value = _
Application.GetOpenFilename("CSVファイル(*.csv),*.csv", 1, _ "読み込むcsvファイルを選んで", False) End Sub
Private Sub CommandButton4_Click()
Workbooks.Open Label1.Caption
Cells.Copy ThisWorkbook.Sheets("item").Range("A1") ActiveWorkbook.Close False End Sub
Private Sub UserForm_Initialize()
Label1.Caption = "ファイル1" Label2.Caption = "ファイル2" End Sub
(ロジック) 2018/06/09(土) 15:21
まず、サンプルコードをもらったら、
とりあえず動かしてみて、「上手く動いた」「エラーが出て止まった」で、
思考を止めず、1行1行を理解する努力をしましょう。
そして疑問に思ったところや理解が出来ないところがあれば、
質問して一つづつ解消していきましょう。
>txtFileName.Value = Dir(OpenFileName)
>の部分にエラーが発生してオブジェクトが必要ですと表示されたのですが、
>どのような原因でしょうか?
”そのコードは何をしようとしているか解ってますか?”
やり取りがめんどくさいので続いて書きますが、
その代入式は、Valueというプロパティを持った「オブジェクト」のValueプロパティに
値を代入しようとしています。
で、ここで、
txtFileNameというのは、
最初からある、
エクセルにあるオブジェクトや、
ユーザーフォーム上に配置したコントロールのオブジェクト名ならいいのですが、
そういう名前のオブジェクト名のものは初期状態ではありません。
なので、このコードを読む人は(エクセル君も含む)、
txtFileNameとは、「知らない言葉」なので、「変数名に違いない」と思うわけです。
ただ、コードの前半部分を読んでも、この変数に何かを代入した形跡がないので、
変数の中身はNothingまたはEmptyのはずです。
つまり、その変数には、
オブジェクトが代入されてないので、
「Valueプロパティを持ったオブジェクトに値を設定するなら、
Valueプロパティを持ったオブジェクトを変数に代入することが必要です。」と
エラーメッセージは伝えてます。
(※ここで噛み砕いたメッセージがあるといいかもしれませんが、そういうソフトを作るのは、
難しいみたいなので、経験からある程度想像でホントのまずい箇所を推察する必要があります。)
ここで!(※重要)
各モジュールの最初に、
Option Explicit
と記述すると、変数の宣言を強制する設定になります。
どういう事かというと、
変数の宣言をしていないと、それは変数として認められなくなります。
つまり先ほど、これは知らない言葉なので変数に違いないとエクセル君は勝手に解釈しましたが、
「これは変数として宣言されてない言葉だ!」と処理をするのをやめて、メッセージを発してきます。
変数が定義されていません。
つまり、マナさんが確認しているのは、
Option Explicit
と記述してあって、ユーザーフォーム上のコントロールに
txtFileNameというコントロールが存在しないなら、
「変数が定義されてません。」というエラーになるはずだと暗に推測されているわけです。
が、
>間違いなく記述しております。
とあるので、
txtFileNameというオブジェクトは存在しているにも関わらず、
txtFileName.Value = Dir(OpenFileName)
という行で、
「エラーが発生してオブジェクトが必要ですと表示された」というのは、
コードを読んで想像ができない(ありえない)ということです。
ということで、
>わたしには原因はわかりそうにありません。
という話になるのです。
ここで
>txtFileNameは作成されているのですね。
というγさんの指摘を再度読み直してください。
txtFileNameという名前のオブジェクトは「初期状態では存在しない」と書きました。
つまりこれは、開発者(=コードを書く人)が命名したオブジェクト名のはずだということです。
普通、何も考えずにユーザーフォーム上にテキストボックスを配置すると、
「TextBox1」
というオブジェクト名が付いていると思います。
次に、配置すると、
TextBox2となりますね?
つまり、
ないものに値を設定しようとしているから、
「値を入れるオブジェクトが必要です。」というメッセージが返ってくるのでは?
と、γさんは推察されているわけです。
が、
>テキストボックスは作ってあります。
という返答なので、会話になってないから
>言っている意味がわからないようでしたら、基本的なテキストを購入して学習すべきです。
となるわけです。
とどのつまり、
「今、ロジックさんはどのテキストボックスに値を入れたいの?」
となるわけです。
コードにはご自分の「こうしたい」という意思を書いてください。
読むときは、このコードを書いた人はどうしたいんだろうと思って読んでください。
もう一度各各のコントロールのオブジェクトのオブジェクト名を確認し、
「私はこういう時にこうしたい。」という文章を書くよう心掛けてみてはいかがでしょうか?
ちなみに各コントロールのオブジェクト名は、
各コントロールを選んだ時に、
プロパティウィンドウで確認出来ます。
表示してなければ、ツールバーの表示から、プロパティーウィンドウを選択し、
プロパティウィンドウを確認してみてください。
ということで、今一度、「オブジェクト名」について確認してみてください。
それで、テキストボックスのオブジェクト名はちゃんとなっているのに、
エラーになっているなら、
新規ブックで全部新たに試してみてください。
それで大丈夫ならブックが壊れてますし、
だめなら、エクセル自体がポンコツです。
再インストールなどして上手くできるか試してください。
(まっつわん) 2018/06/09(土) 15:24
TextBox1.Valueにしてるじゃないですか。
能天気なコメント言ってる場合じゃないかとwwwwwwwwwwwwwwwww
1行1行の意味を理解してくださいね^^;;
>このパス名をファイル名に返すという風にするにはどのような記述をすればよろしいでしょうか?
↑の書き込みで疲れたから誰かのコメント待ってね^^;
(まっつわん) 2018/06/09(土) 15:28
今回の質問は、エラーの件でしたのでいったんクローズとさせていただきますが大丈夫でしょうか。
(ロジック) 2018/06/09(土) 18:12
気が向いたときに読んで、
思いついたことを書いているだけです。
特に何の権限も持ってないので、ロジックさんにどうしろと、
命令するようなことはありません。
(まっつわん) 2018/06/09(土) 18:31
外出から戻りました。 少しコメントを。
まっつわんさんの話とてもよかったですね。 脳天気などとんでもないですよ。good job!
まっつわんさんのご指摘を是非活かして欲しいですよ。
>今回の質問は、エラーの件でしたので いえいえ重要なポイントが満載のはずです。
(1) Option Explicitの有無は結局どういうことだったのですか? 標準モジュールかどこかに一回書いておけばよいとか思っているんじゃないかな。 ユーザーフォームモジュールにも必要ですよ。 それがある時と無い時で、未宣言のtxtFileNameのようなオブジェクト変数に 対してどういう結果をもたらすか、ご自分で手を動かして確認しておくとよいでしょう。
下記に私が使用しているテンプレートを貼り付けておきますので、 是非実行してください。今後余計な質問をかなり少なくしてくれるはずです。
> Option Explicit > をモジュールの一行目に挿入するようにして下さい。 > そうすれば、今回のような未宣言の変数には警告が出て、 > しかも場所を特定してくれますから、原因が直ぐに判明します。 > > http://officetanaka.net/excel/vba/beginner/06.htm > > なお、 > ツール − オプション − 編集 で > 「変数の宣言を強制する」にチェックを入れておけば、★←ここを是非実行されたし > モジュールを作成した時点で、Option Explicitが自動的に挿入されるので、 > 手間が省けます。 > 一度だけチェックを入れておけば、以後、気にする必要はありません。
(2) >このパス名をファイル名に返すという風にするにはどのような記述をすればよろしいでしょうか? 解決ですか? それはすでに私が指摘しています。 >Dirの返り値はフォルダ名を除くファイル名になるはずです。 Dir関数を使うだけです。
(3) 作成したテキストボックスのオブジェクト名を プロパティウインドウ上で変更する方法も、 ExcelVBAの基本テキストには必ず書かれているはずです。 急がば回れです。テキスト学習もしっかりすることをお薦めします。 人に紹介された記事を長いからといって敬遠するようなことではダメです。 色々なスキルの積み上げが必要です。 上っ面だけさわって簡単にマスターなどできません。
(γ) 2018/06/09(土) 20:14
(γ) 2018/06/10(日) 11:56
変数の宣言を強制するのチェックはオフとなっております。
(ロジック) 2018/06/10(日) 14:02
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.