[[20180609110737]] 『ユーザーメニューからファイルを参照し、ファイル』(ロジック) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『ユーザーメニューからファイルを参照し、ファイルを開くを押すとエラー』(ロジック)

 画像のファイル名の抽出マクロの件でお世話になりましたロジックです。

改めて解決したいことがあり質問させていただきます。

ファイル抽出というシートに、ユーザーフォームを読み込むボタンを作り実際の読み込みに成功いたしました。

それが下記になります。
h ttp://photozou.jp/photo/show/3183234/256201517

ソースコードは下記になります。

ファイル抽出シート


Sub OpenUserForm()

    Load UserForm1
    UserForm1.Show
End Sub

ユーザーフォーム用コード


Private Sub CommandButton1_Click()
Dim OpenFileName As String
    ' カレントフォルダを 指定して[ファイルを開く]ダイアログを表示
    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 >


txtFileNameは作成されているのですね。
Dir(OpenFileName) の返り値は?
自分で確認してみましょう。

(γ) 2018/06/09(土) 11:51


γ様

"C:\Users\Owner\Downloads\base\setting_000002016\item.csv"
のようになっております。
(ロジック) 2018/06/09(土) 11:53


>のようになっております。
その主語は何ですか?

(γ) 2018/06/09(土) 11:57


すみません。
Dir(OpenFileName) の返り値です。
(ロジック) 2018/06/09(土) 11:59

Dirの返り値はフォルダ名を除くファイル名になるはずです。
きちんと実行結果を示した方がいいですね。
 
>txtFileNameは作成されているのですね。
こちらはスキップですか?

(γ) 2018/06/09(土) 12:02


>Dirの返り値はフォルダ名を除くファイル名になるはずです。
きちんと実行結果を示した方がいいですね。
よくみたらemptyとなっておりました。

>>txtFileNameは作成されているのですね。
こちらはスキップですか?

サンプルから作成したのでどのように作成したらいいかわかりませんでした。
(ロジック) 2018/06/09(土) 12:05


それはテキストボックスのつもりなんでしょう?
テキストボックスは作ってあるんですか?
 
言っている意味がわからないようでしたら、
質問板で質問するのではなく、基本的なテキストを購入して学習すべきです。
片手間にできることじゃありません。
# 外出するのでここまでとします。

(γ) 2018/06/09(土) 12:09


テキストボックスは作ってあります。
(ロジック) 2018/06/09(土) 12:12

念のため確認しますが

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/09(土) 23:10

そうしたことより、
Option Explicitの有無の効果は確認してみてはいかが?
「変数の宣言を強制する」のオプション設定は実行してもらいましたか?
についてのコメントをお願いしたかったですね。

(γ) 2018/06/10(日) 11:56


誠に申し訳ございません。
只今外出中のため帰宅したら確認いたします。
(ロジック) 2018/06/10(日) 12:43

遅くなりすみません。

変数の宣言を強制するのチェックはオフとなっております。
(ロジック) 2018/06/10(日) 14:02


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.