質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

1回答

714閲覧

CSVファイルをボタンを使用してインポートしたい

15DB109_hotaka

総合スコア22

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2018/01/11 05:27

編集2018/01/11 08:22

CSVファイルをエクセルのシート(Sheet1)にインポートしたいです。
はじめマクロの記録でインポートしてボタンに登録して実行したのですが、2回目以降の実行で不具合が出ました。そこで、teratailにて質問しご教授いただきましたプログラムを実行しました。
該当箇所を自分のファイルに変更し試したところ、CSVファイルのインポートがどうもうまくいきませんでした。
今回の問題点

①期待する動き
挿入ボタンをクリックし、PC上からCSVファイルを選択しエクセルシートにインポート
②実際の動き
ボタンをクリックすると、メッセージボックスが開き”インポートしますか?”と出て、”はい”を選択しますとインポートされるはずですが、エラーメッセージが開きます。
③エラー内容
”microsoft visual basic 400”と表示されます。調べて見たところ、セルの未指定等が原因のようでしたので、セル、シートも指定して実行したところやはり同じエラーが出ました。
また、セルをしてすると”識別子が違います”と出ます。指定箇所が違うのでしょうか。

下記がボタンを押した際の処理です

VBA

1Public Sub ImportCsvFile() 2 3 ' 変数宣言 4 Dim csvBook As Workbook 5 Dim csvSheet As Worksheet 6 Dim Sheet1 As Worksheet 7 Dim activeCell As Range 8 Dim csvBookPath As String 9 10 If MsgBox("選択されたセルにCSVデータをインポートしてよろしいですか?", vbQuestion + vbYesNo, "確認") = vbNo Then 11 Exit Sub 12 End If 13 14 15 Set Sheet1 = ActiveSheet 16 17 18 On Error Resume Next 19 Set activeCell = Selection 20 On Error GoTo 0 21 22 23 If Range("A1:D4") Is Nothing Then 24 MsgBox "セルが選択されていないため処理を継続できません", vbExclamation + vbOKOnly, "処理失敗" 25 Exit Sub 26 27 End If 28 29 csvBookPath = Application.GetOpenFilename(FileFilter:="CSV ファイル, *.csv?") 30 31 If csvBookPath = "" Then 32 MsgBox "CSVファイルが選択されなかったので処理を終了します", vbExclamation + vbOKOnly, "処理失敗" 33 Exit Sub 34 35 End If 36 37 Application.ScreenUpdating = False 38 39 Set csvBook = GetCsvBook(csvBookPath) 40 41 If csvBook Is Nothing Then 42 MsgBox "CSVファイルを開けなかったので処理を終了します", vbExclamation + vbOKOnly, "処理失敗" 43 44 Application.ScreenUpdating = True 45 Exit Sub 46 47 End If 48 49 Set csvSheet = csvBook.Worksheets(1) 50 51 Sheet1.Unprotect 52 53 With csvSheet.UsedRange 54 csvSheet.Range(csvSheet.Cells(IIf(NEED_HEADER, 1, 2), 1), .Cells(.Cells.Count)).Copy activeCell 55 End With 56 57 csvBook.Close False 58 59 ProtectSheet ActiveSheet 60 61 Application.ScreenUpdating = True 62 63End Sub

ご指摘よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ExcelVBAer

2018/01/11 05:32

どうもうまくいかないって、なぞなぞですか?
ExcelVBAer

2018/01/11 05:38

GetCsvBookの中身も不明です
Zuishin

2018/01/11 05:52

GetCsvBook の内容も追記してください。
guest

回答1

0

ベストアンサー

①関連リンクがあるのなら貼りましょう

TeraTailには日々たくさんの質問があがっているのですから、以前の質問が関連しているのであればせめてリンクを貼りましょう。
すべての人が質問者さんの過去の質問履歴をひとつひとつ読み返してくれるわけではありませんよ。
⇒たぶんこれ

②問題点は明確に記載しましょう

「どうもうまくいきません」では何もわかりません。
同じ環境を手元に用意し、同じコードを実行したとしても、質問者様が何を問題としているのかわからなければ再現性の確認にもなりません。

・期待する動き
・実際の動き
・問題の発生するソースコード
・エラー内容(エラーが発生している場合)

といった内容は最低限必要です。
これらの情報があれば、回答する側もある程度問題点の絞り込みができることが多いです。

あとはコード上ではどこまで期待する動きとなっており、どこから想定外の動きとなっているのかも記載してほしい内容なのですが、これが絞れる人はある程度自力で対策も立てられるのかもしれません。

再現性について

今回提示いただいたコードと、過去の質問にあったコードを組み合わせて動作確認してみましたが、当方の環境(Windows7、Excel2010)では指定したCSV内容がアクティブシート上に展開されました。
正常動作と思えますが、やはり問題点を明確に記載いただいた方がよさそうです。

追記をお待ちしております。



追記・コメントを受けて

確認メッセージしか表示されていないということは、問題のあるコードは

Set Sheet1 = ActiveSheet On Error Resume Next Set activeCell = Selection On Error GoTo 0 If Range("A1:D4") Is Nothing Then MsgBox "セルが選択されていないため処理を継続できません", vbExclamation + vbOKOnly, "処理失敗" Exit Sub End If csvBookPath = Application.GetOpenFilename(FileFilter:="CSV ファイル, *.csv?")

この範囲に絞られますね。

変数名の問題?

このうち最初の2つの処理Set Sheet1 = ActiveSheetSet activeCell = Selectionについてですが、Sheet1activeCellという変数名はどちらもExcelVBAでは予約語です。

こちらの環境では問題なく動作しているので何とも言えませんが、コードを読む際に誤解を招く可能性もあり、変数名としてはあまりふさわしくありません。
まずは変数名を変更してみてはどうでしょうか。(宣言や利用箇所を全て変更する必要があります)

Range("A1:D4") Is Nothing?

3つめのブロックIf Range("A1:D4") Is Nothing Thenですが、Range範囲を直接指定しているのにNothingになる状況は考えにくく、あまり意味のない判定になっていると思います。
過去の質問で提供されたコードではIf activeCell Is Nothing Thenとなっていたので、デバッグ目的か何かで変更されたままになっているのだと思います。
おそらくボタン自体がフォーカスされている状態でマクロを実行した場合に、Selectionからセル範囲を取れなくなるのを回避しようとしたのではないでしょうか。

最後に選択されていたセルを取りたいのであれば、Selectionではなく予約語の方のActiveCellで取得できます。

'Dim Sheet1 As Worksheet '廃止 'Dim activeCell As Range '廃止 Dim shtPaste As Worksheet Dim rngPaste As Range '(中略) 'Set Sheet1 = ActiveSheet Set shtPaste = ActiveSheet 'On Error Resume Next 'Set activeCell = Selection 'On Error GoTo 0 Set rngPaste = ActiveCell 'If activeCell Is Nothing Then If rngPaste Is Nothing Then MsgBox "セルが選択されていないため処理を継続できません", vbExclamation + vbOKOnly, "処理失敗" Exit Sub End If '(中略) 'Sheet1.Unprotect shtPaste.Unprotect With csvSheet.UsedRange 'csvSheet.Range(csvSheet.Cells(IIf(NEED_HEADER, 1, 2), 1), .Cells(.Cells.Count)).Copy activeCell csvSheet.Range(csvSheet.Cells(IIf(NEED_HEADER, 1, 2), 1), .Cells(.Cells.Count)).Copy rngPaste End With

根本のエラー原因にはまだたどり着いていませんが、ひとまずお試しください。

投稿2018/01/11 07:01

編集2018/01/12 01:58
jawa

総合スコア3013

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

15DB109_hotaka

2018/01/11 08:27

ご指摘ありがとうございました!安易な考えの質問申し訳ありません。勉強になりました、 今後気をつけます。 ご指摘いただいた箇所の修正いたしましたので、見ていただけたら幸いです。よろしくお願いします。
jawa

2018/01/11 09:01

今回の処理ではいくつかメッセージやダイアログが表示されるタイミングがあります。 Step1:確認MSG "選択されたセルにCSVデータをインポートしてよろしいですか?" Step2:失敗MSG "セルが選択されていないため処理を継続できません" Step3:ファイル指定ダイアログ Step4:失敗MSG "CSVファイルが選択されなかったので処理を終了します" Step5:失敗MSG "CSVファイルを開けなかったので処理を終了します" このうちStep1とStep3は必ず表示されるはずです。 今回、エラーが発生するまでに表示されるのはStep1の確認メッセージだけでしょうか?
15DB109_hotaka

2018/01/11 09:27

はい、確認MSGのみ表示され、インポートしますか?に対して はい をクリックすると エラーになります!
jawa

2018/01/12 02:00

回答に追記しました。 まだ根本原因にはたどり着いていませんが、変数名の変更など、まずはお試しください。
15DB109_hotaka

2018/01/12 04:00

ありがとうございます! 修正し試してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問