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

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

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

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

Q&A

2回答

991閲覧

テキストファイルの任意の文字列に挟まれた数値データ(カンマ区切り)を配列に入れる。

退会済みユーザー

退会済みユーザー

総合スコア0

VBA

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

0グッド

0クリップ

投稿2021/09/24 11:02

編集2021/09/24 11:05

前提・実現したいこと

フォルダ内にあるテキストファイルを上から順番に開き
1行目から読み込み、任意の文字列を含む行と更に別の任意の文字列に挟まれた数値データ(カンマ区切り)を
三次元配列に入れたいです。

例として、

sample1.txt

2,4,2,5
2,2,2,2
A
1,4,5,5,7,,,
2,3,5,7,4,,,
2,4,4,8,7,,,
2,3,5,7,3,,,
2,4,1,0,7,,,
B
0,0,3,,
0,1,4,,
0,3,2,,
0,5,3,,
C
1011,1,1,1,0,0,0,,,,
1012,1,1,1,0,0,0,,,,
1013,1,1,1,0,0,0,,,,
1014,1,1,1,0,0,0,,,,
X
1,1,1
1,1,1
1,1,1

sample2.txt
sample3.txt

上記のようなテキストファイルがあったときに
1.AとBの間の数値データをカンマで区切り、arrayAに入れる。
2.BとCの間の数値データをカンマで区切り、arrayBに入れる。
2.CとXの間の数値データをカンマで区切り、arrayCに入れる。
4.X以降は不要
5.どのファイルもA,B,CおよびXの文字列があり、1行あたりの要素数は同じです。

条件として、
1.それぞれの数値データの行数は不定です。
2.三次元配列array~(i,j,k)としたとき、
i = 読込んだファイルの順番
j = 行数
k = 要素数
としたいです。
3.配列の最小値は0ではなく1から始めたいです。

なお、読み込むファイルの数はfile_num、読み込むファイル名はsample_FileName(i)にそれぞれ格納しています。

一部を削っているかつ不完全なため、お見苦しいかと存じますが、
下記に現在作成中のコードを記載いたしますので、何卒お力添えを頂けますよう、
よろしくお願いいたします。

該当のソースコード

Sub input(file_num,sample_FileName) Dim intFF As Integer 'FreeFile値 Dim myRec As String '読み込んだレコード内容 Dim myAry As Variant  'レコードを分割したデータ Dim i As Long For i = 1 To file_num intFF = FreeFile On Error GoTo err_on 'ファイルが見つからないときの処理 Open sample_FileName(i) For Input As #intFF On Error GoTo 0 Do Until EOF(intFF) Line Input #intFF, myRec myAry = Split(myRec, ",") Dim data_index As String Dim j As Long Select Case myAry(0) 'データ判定 Case "A":     data_index = "A": j = 1 Case "B":     data_index = "B": j = 1 Case "C":     data_index = "C": j = 1 Case Val(myAry(0)) = 0: data_index = "X" End Select Select Case data_index Case "A" j = j + 1 Case "B" j = j + 1 Case "C" j = j + 1 End Select Loop Close #intFF Next i err_on: MsgBox " 指定したデータがありません。" Close Application.StatusBar = "エラー終了しました。  " End End Sub

補足情報(FW/ツールのバージョンなど)

Excelバージョン:2013

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

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

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

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

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

guest

回答2

0

動作確認してませんが、こんな感じでどうでしょうか。

VBA

1Sub sample(file_num, sample_FileName) 2 3 On Error GoTo err_on 'ファイルが見つからないときの処理 4 5 Dim dicA As Scripting.Dictionary, dicB As Scripting.Dictionary, dicC As Scripting.Dictionary 6 7 Set dicA = CreateObject("Scripting.Dictionary") 8 Set dicB = CreateObject("Scripting.Dictionary") 9 Set dicC = CreateObject("Scripting.Dictionary") 10 11 12 Dim intFF As Integer 'FreeFile値 13 Dim myRec As String '読み込んだレコード内容 14 Dim myAry As Variant 'レコードを分割したデータ 15 Dim i As Long 16 17 Dim abc, cntA, cntB, cntC 18 19 For i = 1 To file_num 20 21 abc = "" 22 cntA = 0 23 cntB = 0 24 cntC = 0 25 26 Open sample_FileName(i) For Input As #intFF 27 Do Until EOF(intFF) 28 Line Input #intFF, myRec 29 30 Select Case myRec 31 Case "A", "B", "C" 32 abc = myRec 33 Case "X" 34 Exit Do 35 Case Else 36 myAry = Split(myRec, ",") 37 Select Case abc 38 Case "A" 39 cntA = cntA + 1 40 dicA.Add i & " " & cntA, myAry 41 Case "B" 42 cntB = cntB + 1 43 dicB.Add i & " " & cntB, myAry 44 Case "C" 45 cntC = cntC + 1 46 dicC.Add i & " " & cntC, myAry 47 End Select 48 End Select 49 Loop 50 Close #intFF 51 Dim maxA, maxB, maxC 52 If cntA > maxA Then maxA = cntA 53 If cntB > maxB Then maxB = cntB 54 If cntC > maxC Then maxC = cntC 55 Next 56 57 ReDim arrayA(1 To file_num, 1 To maxA, 1 To UBound(myAry) + 1) 58 ReDim arrayB(1 To file_num, 1 To maxB, 1 To UBound(myAry) + 1) 59 ReDim arrayC(1 To file_num, 1 To maxC, 1 To UBound(myAry) + 1) 60 61 Dim k, j, v 62 For Each k In dicA.Keys 63 v = dicA(k) 64 For j = 0 To UBound(v) 65 arrayA(Split(k)(0), Split(k)(1), j + 1) = v(j) 66 Next 67 Next 68 For Each k In dicB.Keys 69 v = dicB(k) 70 For j = 0 To UBound(v) 71 arrayB(Split(k)(0), Split(k)(1), j + 1) = v(j) 72 Next 73 Next 74 For Each k In dicC.Keys 75 v = dicC(k) 76 For j = 0 To UBound(v) 77 arrayC(Split(k)(0), Split(k)(1), j + 1) = v(j) 78 Next 79 Next 80 81err_on: 82 83 MsgBox " 指定したデータがありません。" 84 Close 85 Application.StatusBar = "エラー終了しました。  " 86 87 End 88 89End Sub

投稿2021/09/25 02:40

jinoji

総合スコア4592

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

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

0

ファイルを読むループの中身としては、

vba

1If 英字の行である Then 2 どの英字かを変数に保存しておく 3 データ用の「行数」を初期値1にする 4Else '数値の行である 5 保存された英字を見てその英字に対応する変数にデータを保存する 6 「行数」を+1する 7End If

i = 読込んだファイルの順番

というのが何のことやら説明がないので、上記では考慮していません。

投稿2021/09/24 13:24

otn

総合スコア85901

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

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

退会済みユーザー

退会済みユーザー

2021/09/24 23:34

言葉足らずで申し訳ございません。 便宜的にテキストファイルをsample1、sample2としていますが、その順番にファイルを読み込むと思っていただければ幸いです。 なので、sample_FileName(i)={sample1.txt,sample2.txt,sample3.txt}(実際はフルパスで入っています)のような配列になっています。
otn

2021/09/25 00:57

なるほど。ロジックには特に影響しないと言うことですね。 では、回答の通りです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問