【本日のミッション】
Excel VBA で、csvファイルを開く時に「Excel は ‘購入履歴.csv’ が SYLK ファイルであることを確認しましたが、読み込むことができません。ファイルにエラーが含まれるか、SYLK ファイル形式でない可能性があります。異なるファイル形式でそのファイルを開くには、[OK]をクリックしてください。」というエラーが出た。このエラーを回避せよ。
目次
ミッションの概要
Excel VBA で、csvファイルを開く時に「Excel は ‘購入履歴.csv’ が SYLK ファイルであることを確認しましたが、読み込むことができません。ファイルにエラーが含まれるか、SYLK ファイル形式でない可能性があります。異なるファイル形式でそのファイルを開くには、[OK]をクリックしてください。」というエラーが出た。このエラーを回避せよ、というのが今回のミッションです。
問題となったのは、こんなcsvファイルです。Excelで開こうとするVBA(下記ページ参照)の途中でエラーが表示されました。
参考:Excel VBAダイアログボックスで選択したcsvファイルをエクセルブックとして開いて取込(「,」「”」対応)
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
<OK>ボタンをクリックしたら、ファイルは開いたのですが・・・
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
できることなら、エラー画面は出てきて欲しくないですよね。
プロシージャ
今回エラーを回避するために、下記ページのコードに赤字部分を追加しております。
参考:Excel VBAダイアログボックスで選択したcsvファイルをエクセルブックとして開いて取込(「,」「”」対応)
Sub CSV取込1()
'【変数】
Dim fn As Variant '取込ファイル名
Dim ws As Worksheet 'データ貼付用シート(このブックのsheet1)
Dim ws_d As Worksheet 'データ取込シート
Dim ary_d As Variant 'データ取込用配列
Dim e_row_d As Long 'データ取込シート 最終行
Dim e_col_d As Long 'データ取込シート 最終列
'■画面更新STOP
Application.ScreenUpdating = False
'■変数セット
Set ws = ThisWorkbook.Worksheets("Sheet1") 'データ貼付用シート(このブックのsheet1)
'■ファイルの選択
fn = Application.GetOpenFilename(FileFilter:="CSVファイル(*.csv),*.csv")
'■ファイル選択の確認
If fn = False Then
Exit Sub 'ファイル選択されていなかったら終了
End If
'■選択したファイルを開く
Application.DisplayAlerts = False
Workbooks.Open Filename:=fn
Application.DisplayAlerts = True
Set ws_d = ActiveSheet 'データ取込シート
'■最終行・最終列の取得
e_row_d = ws_d.Cells(ws_d.Rows.Count, 1).End(xlUp).Row 'データ取込シート 最終行
e_col_d = ws_d.Cells(3, ws_d.Columns.Count).End(xlToLeft).Column 'データ取込シート 最終列
'■データ取込シート→配列ary_d
ary_d = ws_d.Range(ws_d.Cells(1, 1), ws_d.Cells(e_row_d, e_col_d))
'■配列ary_d→データ貼付用シート(このブックのsheet1)
ws.Range(ws.Cells(1, 1), ws.Cells(e_row_d, e_col_d)) = ary_d
'■ファイルを閉じる
ActiveWorkbook.Close SaveChanges:=False
'■画面更新STOP解除
Application.ScreenUpdating = True
End Sub
SYLKファイルとは
SYLKファイルは、表計算ソフトの表データなどを格納することができる、データ交換フォーマットのひとつで、ファイルの最初の行は「ID」から始まります。
「Excel は ‘〇〇〇.csv’ が SYLK ファイルであることを確認しましたが、読み込むことができません。ファイルにエラーが含まれるか、SYLK ファイル形式でない可能性があります。異なるファイル形式でそのファイルを開くには、[OK]をクリックしてください。」エラーの原因
今回開いたcsvファイルは、先頭の文字が「ID」です。
Excelはファイルの先頭文字が「ID」から始まっているということで、このファイルは「SYLKファイルだ!」と誤認識してエラーを表示させています。
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
Application.DisplayAlerts プロパティ
このプロパティを「False」にした場合、マクロの実行中に特定の警告やメッセージを表示しません。
Application.DisplayAlerts = False
今回はエラーの元となる「Workbooks.Open Filename:=fn」の前に、このコードを追加しています。エラー回避後は「True」に戻しておきます。
Application.DisplayAlerts = False Workbooks.Open Filename:=fn Application.DisplayAlerts = True
【参考】
指定したフォルダ内のファイル名全てを取得(Excel VBA)
変数でよく使われる「buf」「tmp」の意味
Dir関数が取得するファイルの順番
指定したフォルダ内のフォルダ名全てをGetAttrを使って「エラー53 ファイルが見つかりません。」を出さずに取得(Excel VBA)
GetAttrとは?「= vbDirectory」ではなく「And vbDirectory」となるビット演算の疑問
フォルダ名だけを取得したい時に出てくる 「.」 と 「..」 とは?
指定したフォルダ内とサブフォルダ内全てのファイル名を取得(Excel VBA)
CreateObject(“Scripting.FileSystemObject”) を使ってサブフォルダを取得
再帰処理とは?フォルダ内とサブフォルダ内全てのファイル名を取得(Excel VBA)
指定したフォルダ内のサブフォルダのフォルダ名を全部取得(Excel VBA)
再帰処理とは?フォルダ内のサブフォルダのフォルダ名を全部取得(Excel VBA)
参照渡し「ByRef」と値渡し「ByVal」の違い(Excel VBA)
ファイルのフルパスからファイル名のみを取得 InStrRev関数(Excel VBA)
指定したフォルダの全ての階層のフォルダ名・サブフォルダ名・ファイル名を取得(Excel VBA)
FileSystemObjectとは?CreateObject 関数 FolderExists・GetFolderの使い方
FileSystemObject CreateObject関数を使う方法・ 参照設定を使う方法 違いを理解してエラー防止
再帰処理とは?指定したフォルダの全ての階層のフォルダ名・サブフォルダ名・ファイル名を取得(Excel VBA)
ファイルのフルパスからファイル名のみを取得 Split関数(Excel VBA)
Callステートメントとは 引数 括弧()の使い方(Excel VBA)
指定したフォルダ内から「特定の文字を含まないファイル名」を取得(Excel VBA)
ワイルドカードとは。使い方いろいろ。(Excel)
Dir関数の使い方。ファイル名やフォルダ名の取得方法。(Excel VBA)
指定したフォルダのファイル名を取得し、そのファイル名を一括で変換(Excel VBA)
Excel起動時に「コンパイルエラー」。64ビット システムで Declareステートメントに、PtrSafe属性を設定(Excel VBA )
「ファイルを開く」ダイアログボックス から ファイル名を取得(Excel VBA)
「ファイルを開く」ダイアログボックス から 複数 ファイル名を取得(Excel VBA)
指定フォルダ内のサブフォルダ全てをフォルダ構成のみ(空フォルダ)を別フォルダにコピー(Excel VBA)
再帰処理とは?指定フォルダ内のサブフォルダ全てをフォルダ構成のみ(空フォルダ)を別フォルダにコピー(Excel VBA)
エクセル ファイルのフルパスから拡張子のみを取得 Split関数(Excel VBA)
エクセル ファイルのフルパスから拡張子のみを取得 InStr関数(Excel VBA)
Excel VBAダイアログボックスで選択したcsvファイルをエクセルブックとして開いて取込(「,」「”」非対応)
Excel VBAダイアログボックスで選択したcsvファイルをテキストファイルとして取込(ゼロ落ち・日付変換対応)
Excel VBAダイアログボックスで選択したcsvをテキストファイルとして取込(「,」「”」ゼロ落ち・日付変換対応)
Excel は〇〇が SYLK ファイルであることを確認しましたが、読み込むことができません。のエラーを回避(VBA)