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

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

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

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

Q&A

解決済

3回答

184閲覧

各分類に分ける処理について

Karaage_0630

総合スコア5

VBA

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

0グッド

0クリップ

投稿2019/09/10 07:36

前提・実現したいこと

実現したいこと

下記の記述で「成績リスト.txt」のレコード(行)を取得しています。
実現したいことは各行の情報を★補足の項目に分類する方法です。

前提
成績リスト.txt内は下記のような情報が入っています
★補足、左から日付(YYYYMMDD),学生番号(5桁0埋),名前(文字列),英語(点数),数学(点数)
値は都度変わる(月1回)

20190801,00001,Aさん,85,100
20190801,00002,Bさん,70,1
20190801,00003,Cさん,100,10


該当のソースコード

VBA

1 2 3Option Explicit 4 5  Sub 成績レコード分類() 6 7 Dim レコード As String 8 9 Open ("成績リスト.txt") For Input As #1 10 11 Do Until EOF(1) 12 Line Input #1, レコード 13 MsgBox レコード 14 Loop 15 Close #1 16 17  End Sub 18

試したこと

Split関数を使い1行ずつ分ける

Dim tmp As Variant tmp = Split("20190801,00001,Aさん,85,100", ",")

      ・


行がたくさんあるので1行ずつ設定するのが大変また、値が都度変わるため固定で設定できない

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

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

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

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

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

guest

回答3

0

ソースコードを見るとファイルから読み込んでいるようですので…
それなら最初からテーブルとして読み込んだほうが簡単なような気がします。

WorkBooks.openText Filename:="成績リスト.txt",DataType:=xlDelimited,Comma:=True

投稿2019/09/11 01:32

h.horikoshi

総合スコア505

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

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

0

ベストアンサー

分割した後、どうしたいのでしょうか。
それにもよると思いますが、いちおうメッセージボックスに表示する場合のコード例

VBA

1 2 Dim aryRec 3 Do Until EOF(1) 4 Line Input #1, レコード 5 aryRec = Split(レコード, ",") 6 MsgBox "日付:" & aryRec(0) 7 MsgBox "学生番号:" & aryRec(1) 8 MsgBox "名前:" & aryRec(2) 9 MsgBox "英語:" & aryRec(3) 10 MsgBox "数学:" & aryRec(4) 11 Loop 12

投稿2019/09/10 10:28

hatena19

総合スコア33699

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

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

Karaage_0630

2019/09/11 04:50

各項目ごとに分割した後は、 分割した項目(学籍番号(例:00001))を使ってエクセルブックの中から学籍番号(例:00001)を検索して、 一致した学生番号がいた場合、対象の学籍番号の各項目に値を付け加え、 また一致しない場合は、最終行に各項目の値を追加するようにしようと思ってます。
hatena19

2019/09/11 04:58

そういうことなら、上記の回答のコードの Msgbox の部分を、 そういう処理になるように変更すればいいでしょう。
Karaage_0630

2019/09/11 05:11

回答ありがとうございます。 最初にいただいた回答を参考に学習致します。 すみません記載漏れがありました。 正しくはこのプロシージャではレコードの読み込み、読み込んだデータを分割して分割したものを他のプロシージャに渡してそこで 上記の各項目ごとに分割した後は~になります。なのでこのプロシージャでは分割した後の処理としては値を渡すが正しかったです。
hatena19

2019/09/11 05:34

いったんバリアント配列に格納して、aryRec(0) aryRec(1) で各列の値を取得できることが理解できれば応用できますよね。 それでやってみて行き詰ったらまた質問されたらいいかと思います。
Karaage_0630

2019/09/18 05:16

返信遅くなり申し訳ありません。 テキストファイルの「成績リスト」の各項目を分けて各列の値を格納し別のプロシージャに渡すところはできた のですが、 エクセルの「テストシート」からA列にある「学籍番号」を検索し、 一致していた場合、対象のC列の英語に値を足しこみ、 一致していない場合、最終行に、各分類(学籍番号、名前、英語、数学)の値を設定する記述にしたいのです が、 下記の記述でうまく行きません。 Function 成績レコード分類() Dim テストシート As Worksheet Dim レコード As String Dim 学籍番号 As String Dim 名前 As String Dim 英語 As Long Dim 数学 As Long Set テストシート = Workbooks("テストファイル").Worksheets("シート1") Open 成績リスト For Input As #1 Dim aryRec As Variant Do Until EOF(1) Line Input #1, レコード MsgBox レコード aryRec = Split(レコード, ",") MsgBox "日付:" & aryRec(0) MsgBox "学籍番号:" & aryRec(1) 学籍番号 = aryRec(1) MsgBox "名前:" & aryRec(2) 名前 = aryRec(2) MsgBox "英語:" & aryRec(3) 英語 = aryRec(3) MsgBox "数学:" & aryRec(4) 数学 = aryRec(4) Call 設定処理(テストシート, 学籍番号, 名前, 英語, 数学) Loop Close #1 Function 設定処理(ByRef テストシート As Worksheet, ByVal 学籍番号 As String, ByVal 名前 As String, ByVal 英語 As Long, ByVal 数学 As Long) Dim i As Integer    i = 1 '条件式:A〇セルが空白じゃない場合 Do While テストシート.Range("A" & i) <> "" 'A〇セルが空白じゃない場合に繰り返す処理 '学籍番号が一致する場合 If テストシート.Range("A" & i).Find(学籍番号) Then テストシート.Range("C" & i) = 英語 i = i + 1 Else '学籍番号が一致しなかった場合   テストシート.Range("A" & i) = 学籍番号   テストシート.Range("B" & i) = 名前   テストシート.Range("C" & i) = 英語   テストシート.Range("D" & i) = 数学   i = i + 1 End If Loop End Function
Karaage_0630

2019/09/18 05:17

「テストシート」 A列     B    C    D 学籍番号  名前 英語 数学 00001 あ    0    0 00002 い    0    0 00003   う    0    0 00004   え    0    0 00005   お    0    0 ・ ・ ・ ・
hatena19

2019/09/18 06:22

この質問の関連ではありますが、新規の質問内容になりますので、新規に質問を立ててください。
Karaage_0630

2019/09/18 07:09

わかりました。 ありがとうございます。
guest

0

こんな感じじゃないかと思います。

VBA

1 Dim tmp As Variant, i As Integer 2 Dim w日付, w学生番号, w名前, w英語, w数学 3 4 i = 0 5 For Each tmp In Split(レコード, ",") 6 i = i + 1 7 Select Case i 8 Case 1: w日付 = tmp 9 Case 2: w学生番号 = tmp 10 Case 3: w名前 = tmp 11 Case 4: w英語 = tmp 12 Case 5: w数学 = tmp 13 End Select 14 Next

投稿2019/09/10 07:53

sazi

総合スコア25173

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問