Excel (VBA)

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

 
(Windows 10全般 : Excel 2013)
「複数のcsvファイルを取り込みたい」続き
投稿日時: 20/06/11 12:02:12
投稿者: vaioyuki

「複数のcsvファイルを取り込みたい」
https://www.moug.net/faq/viewtopic.php?t=79452&sid=e5d9d864ec02731edc6d296095edd546
 
いつもお世話になります。
上記でお世話になったものです。
 
今はアドバイスをもとに、フォームで参照したパスを下記のように取り込むようにしました。
(長々と書くとわかりにくいと思うので端折りましたが、同じ作業を繰り返しています。)
 
 

Option Explicit

Public strFilePath1 As String 'ユーザ.csvパス名
Public strFilePath2 As String 'ロール.csvパス名
Public strFilePath3 As String '所属.csvパス名
Public strFilePath4 As String 'ユーザ権限.csvパス名

Dim f As Variant, a As Variant
Dim i As Long, j As Long
Dim BUF As String

Dim wsUser As Worksheet, wsRole As Worksheet, wsDpt As Worksheet, wsGrp As Worksheet

Private Sub Bt0_Click()
Set wsUser = Worksheets("ユーザ")
Set wsRole = Worksheets("ロール")
Set wsDpt = Worksheets("所属")
Set wsGrp = Worksheets("ユーザ権限")

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

With wsUser 'ユーザシート

    i = .Range("A1").CurrentRegion.Rows.Count
    
    Open strFilePath1 For Input As #1 'ユーザ.csvパス名を開く
        Do Until EOF(1)
            i = i + 1 '2行目から開始
            Line Input #1, BUF
            a = Split(BUF, ",")

            For j = 0 To UBound(a)
                .Cells(i, j + 1) = a(j)
            Next j
        Loop
    Close #1
    
    .Cells(5, 4) = WorksheetFunction.CountA("D6:D" & i)

End With

With wsRole 'ロールシート

'ユーザシートに同じ

End With

With wsDpt '所属シート

'ユーザシートに同じ

End With

With wsGrp 'ユーザ権限シート

'ユーザシートに同じ

End With

Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic

MsgBox "処理完了"

End Sub

Private Sub Bt1_Click()

strFilePath1 = Application.GetOpenFilename(FileFilter:="CSVファイル,*.csv") 'ファイルを開く
txt1 = strFilePath1 'テキストにパス表示

    If Dir(strFilePath1) <> "ユーザ.csv" Then '開いたファイルがユーザ.csvでなかったら
        MsgBox "ファイルが違います。「ユーザ.csv」を選択してください。"
    End If
End Sub

Private Sub Bt2_Click()

'Bt1に同じ

End Sub

Private Sub Bt3_Click()

'Bt1に同じ

End Sub

Private Sub Bt4_Click()

'Bt1に同じ

End Sub


 
 
こちらのCSVファイルは0落ちしないように貼付先のExcelは全て文字列に設定しています。
それは0落ちもせずに大丈夫なのですが、それが原因かどうかわかりませんが下記コードでエラーというか計算をしてくれません。
 
.Cells(5, 4) = WorksheetFunction.CountA("D6:D" & i)

 
表記では1行しか書いてませんが実際にはすべての列でカウントしています。
このカウントが空白までも数えます。
中に空白は入っていません。
なぜかセルをdeleteすると数は減ります。
データには「●」であったり数値であったり文字であったりします。
 
ちなみに手作業でデータをインポートしたときは空白はカウントされませんでした。
文字列に何か関係しているのでしょうか???
 
よろしくお願いします。
 

回答
投稿日時: 20/06/11 12:47:23
投稿者: WinArrow
投稿者のウェブサイトに移動

ただ、エラーではなく
エラーのコードなり、メッセージがあるはず
 
ステップ実行すれば、原因がわかると思います。
 
蛇足ですが、無駄なコードが多々見受けられます。
 
もっと、シンプルにした方がよいでしょう。

投稿日時: 20/06/11 13:06:17
投稿者: vaioyuki

コメントありがとうございます。
 
すいません。
エラーメッセージは出ずにきちんと計算されているようですが、
なぜか何も入力されていないものもカウントされます。
なので全て同じ数字になります。
読み込みも全てエラーなく入力されています。
空白もスペースが入っているわけではありません。
先ほど書いたように、deleteすると数がカウントする数が減ります。

回答
投稿日時: 20/06/11 13:17:50
投稿者: WinArrow
投稿者のウェブサイトに移動

>貼付先のExcelは全て文字列に設定しています。
 
>0落ち
もわかりませんが、
文字列に設定しているからでは?

投稿日時: 20/06/11 13:25:37
投稿者: vaioyuki

ありがとうございます。
 
文字列にしていないと、
「000001」 ⇒ 「1」
になってしまいますので全て文字列にしています。
 
しかし、
外部データからの取り込みで読み込むときちんと計算されます。
元々のシートも全て文字列に設定していますが、
外部データの取り込み時にも文字列に変換しています。

投稿日時: 20/06/11 14:20:22
投稿者: vaioyuki

With wsKihon '基本シート

    i = .Range("A1").CurrentRegion.Rows.Count
    
    Open strFilePath1 For Input As #1 '基本.csvパス名を開く
        Do Until EOF(1)
            i = i + 1 '2行目から開始
            Line Input #1, BUF
            a = Split(BUF, ",")

            For j = 0 To UBound(a)
                .Range(.Cells(i, 1), .Cells(i, UBound(a) + 1)) = a
'                .Cells(i, j + 1) = a(j)
            Next j
        Loop
    Close #1

End With

 
 
コードを上記に変えたらちゃんと計算してくれました!!
ありがとうございました。(^−^)