Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10全般 : Excel 2016)
csvファイルの取り込みでの型の指定
投稿日時: 19/07/04 15:19:14
投稿者: miso
メールを送信

csvで読み込む時の型指定をvba修正ではなく、excelシート上で代入して変更したいです。
 ※直接入力するとマクロは問題なく動きます。
 
作業内容はA列に記載されているcsvファイル分、Listシート1枚にまとめる。
A2セル以降に取り込むcsvBook名
E1セルにfolderパス
E2セルに文字コード
E3セルに型   ←このセルを参照するようにしたいです。
E4セルにcsvの読み込む行数指定(csvファイルを数枚を1シートにまとめているため)
 
 

Sub Marge()
 Dim i As Long
 Dim lastFN As Long
 Dim B As Long
 Dim C As Variant
 
    On Error Resume Next
    Worksheets("List").Delete
    On Error GoTo 0
    
    Worksheets.Add
    ActiveSheet.Name = "List"
    Worksheets("TOP").Select

        B = Cells(Rows.Count, "F").End(xlUp).Row
        lastFN = Cells(Rows.Count, 1).End(xlUp).Row
    Dim csvPath As Variant
        For i = 7 To B
          C = C & Cells(i, "F") & ", "
        Next i
    Dim D As Variant
        D = Left(C, Len(C) - 2)
  
        Dim ii As Long, iii As Long
        ii = 1
        iii = 1
        For i = 2 To lastFN
        csvPath = Range("E1") & "\" & Cells(i, 1)
            Dim ws As Worksheet
            Set ws = Worksheets("List")
        
            Dim qt As QueryTable
            Set qt = ws.QueryTables.Add(Connection:="TEXT;" & csvPath, Destination:=ws.Cells(ii, 1))    'csv開く
            With qt
                .TextFilePlatform = Range("E2").Value       ' 文字コード
                .TextFileParseType = xlDelimited ' 区切り文字の形式
                .TextFileCommaDelimiter = True   ' カンマ区切り
                .RefreshStyle = xlOverwriteCells ' セルに上書き
                .TextFileStartRow = iii            ' 読み込む行数
                .TextFileColumnDataTypes = Array(2, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1)
                .Refresh                         ' データ表示
                .Delete                          ' csvの接続解除
            End With
            ii = ws.Cells(Rows.Count, 1).End(xlUp).Row
            iii = Range("E4").Value
        Next i
End Sub

 
下記2種類試しましたが、エラーがでました。他に方法はありませんでしょうか?
                .TextFileColumnDataTypes = Array(Range("E3"))
                      .TextFileColumnDataTypes = Array(D)

 
ネットで調べたのですが、対処方法が見つけられずお力をお借りしたいです。
宜しくお願い申し上げます。 miso

回答
投稿日時: 19/07/04 16:12:46
投稿者: WinArrow
投稿者のウェブサイトに移動

単に
>エラーが出ました。
  
   
だけでは、回答者には、貴方のPCの画面は見えないし、答えようがありません。
  
次の内容を掲示してみましょう
@エラーの出た場所
Aエラーのコード
Bエラーのメッセージ
CRange("E3")も値
D変数「D」の値

回答
投稿日時: 19/07/04 16:15:01
投稿者: sk

引用:
E3セルに型

引用:
.TextFileColumnDataTypes = Array(Range("E3"))

.TextFileColumnDataTypes = Split(Range("E3").Value, ",")
 
------------------------------------------------------------
 
雑に記述するなら上記のような感じになるのではないかと。

投稿日時: 19/07/04 17:28:18
投稿者: miso
メールを送信

WinArrowさん、ご指摘ありがとうございます。

引用:
@エラーの出た場所
Aエラーのコード
Bエラーのメッセージ
CRange("E3")も値
D変数「D」の値

@エラーの場所は以下
 .TextFileColumnDataTypes = Array(2, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1)
 この行をシート参照か変数にしたいです。
 .TextFileColumnDataTypes = Array(Range("E3"))
 .TextFileColumnDataTypes = Array(D)
A、Bエラー内容は2件とも【実行時エラー5 プロシージャの呼び出し、または引数が不正です。】
CE3セルの内容は【2,2,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1】をそのまま入れてます。
D変数Dの内容はループで【2,2,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1】を作り出してます。
 
skさん、ご返信ありがとうございます。
引用:
.TextFileColumnDataTypes = [color=blue]Split(Range("E3").Value, ",")

こちらも入れてみましたが【実行時エラー5 プロシージャの呼び出し、または引数が不正です。】が出てしまいました。

回答
投稿日時: 19/07/04 18:49:52
投稿者: sk

引用:
こちらも入れてみましたが【実行時エラー5 プロシージャの呼び出し、または引数が不正です。】が出てしまいました。

流石に回答が雑すぎました。失礼。
 
引用:
Dim i As Long
Dim lastFN As Long
Dim B As Long
Dim C As Variant

Dim i As Long
Dim lastFN As Long
Dim B As Long
Dim C As Variant
 
Const ImportColumnsCount = 21
 
Dim varArray As Variant
Dim varItem As Variant
Dim intDataTypes() As Integer
 
With Worksheets("TOP")
    varArray = Split(.Range("E3").Value, ",")
    If (UBound(varArray) <> ImportColumnsCount - 1) Then
        .Activate
        .Range("E3").Select
        MsgBox "データ型定義の設定が正しくありません。", vbCritical, "設定エラー"
        Exit Sub
    End If
    ReDim intDataTypes(LBound(varArray) To UBound(varArray))
    For i = LBound(varArray) To UBound(varArray)
        varItem = Trim(varArray(i))
        If Not IsNumeric(varItem) Then
            .Activate
            .Range("E3").Select
            MsgBox (i + 1) & "列目のデータ型定義の設定が正しくありません。", vbCritical, "設定エラー"
            Exit Sub
        End If
        intDataTypes(i) = CInt(varItem)
    Next
End With
 
引用:
.TextFileColumnDataTypes = Array(2, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1)

.TextFileColumnDataTypes = intDataTypes

投稿日時: 19/07/05 10:46:20
投稿者: miso
メールを送信

skさん、ご回答ありがとうございます。
できました!ただ同じ文字を入れればいいわけではないのですね。そしてシートから参照することも可能とわかりました、ありがとうございます。
またチェックまで追加して頂いて感謝しきれないです。ありがとうございました。  miso