VBA100本ノック 65本目を動画で解説しています。Excelの神髄さんの模範解答はコチラ
問題
#VBA100本ノック65本目
固定長データの出力です。
「フォーマット」シートに従い、2行目以降をテキスト出力してください。
文字形態は、N:右詰め0埋め、C:左詰め半角スペース埋め。
項目間区切りなしで連続で出力
※シートは任意
※本題ではないので出力ファイル及び文字コードは任意



解答
Sub テキストファイルに文字を出力する()
Dim tName As String
tName = ThisWorkbook.Path & "\test.txt"
Dim 出力文字 As String
Dim i As Long, j As Long
Dim データ形態 As String, 文字数 As Long
For i = 2 To 4 '最終行まで
For j = 1 To 9 '最終列まで
データ形態 = Cells(9, j).Value
文字数 = Cells(10, j).Value
出力文字 = 出力文字 & 固定長データに変換(Cells(i, j).Value, データ形態, 文字数)
Next j
出力文字 = 出力文字 & vbLf
Next i
Debug.Print 出力文字
Open tName For Output As #1
Print #1, 出力文字
Close #1
End Sub
Function 固定長データに変換(出力文字 As String, データ形態 As String, 文字数 As Long) As String
If データ形態 = "N" Then '先頭に0
固定長データに変換 = Right("00000000000000000" & 出力文字, 文字数)
Else '語尾に半角スペース
固定長データに変換 = Left(出力文字 & " ", 文字数)
End If
End Function
■考え方・流れ
0:00 冒頭・問題確認
2:31 テキストファイルを出力する方法
4:01 全てのデータを(そのまま)出力する
5:44 固定長データに変換する

銀行とかでよく見る感じの
データですかね?

僕は一度も見たことない!

そうですか…
テキストファイルを出力する方法
さて!じゃあまずは…
テキストファイルに文字を出力する方法の復習からだ!
これは…いつにやったかもう覚えてねえww
復習だからパパっと済ますぞ!

実行結果↓

全てのデータを(そのまま)出力する
よし!そしたらお次!
一旦は…固定長とかそんなんは抜きにして!
全部のデータをそのまんま抜き出してみるぞ!!

「出力文字」って変数を作って…
行列ループしながら&で繋いでいく!!これだけ!

あ、さすがに改行(vbLf)だけは入れとこ…

実行結果↓

固定長データに変換する
よし!最後に!!
固定長データへ変換して終わっちゃうぞ!
と、その前に…、
「フォーマット」シートから行列入れ替えてもってきてるぞwww
え?VBA書く前に別シートからコピペするなんてルール違反??
そんなルールあったかな…w

よし!じゃあ…
考えないといけないことが多いんだけど…
9行目がNかCで条件分岐しないといけない!
10行目の数値に合わせないといけない!!
だからいったん、これらを格納するために変数を作ったよ。
データ形態(NかC)
文字数(数値)
って感じ

よし!お次は、
文字と、データ形態と、文字数によって処理を分岐してくれるようなファンクションを自分で作っていくぞ!!

じゃ、ファンクションの中身なんだけど…
データ形態がNかCによって条件分岐するコードにしていくぞ!!
Nの場合はちょっと(だいぶ)強引だけど、こんな感じ!


逆に、このファンクションさえ出来てしまえば、
後はループの中で引数をぶっこんで呼び出してあげるだけでOKだね!!

実行結果↓

とま、こんなところかな!

お疲れさまま!

お疲れさまでした!
あとがたり
おはこんばんちは。uぷ主です。
65本目、固定長データに変換する問題でした…
銀行?通帳?でみたことあるな~~
こんな感じの処理してるのかな?知らんけど…
あ、そういや○○○銀行ってなんか大変なことなってたけど
どうなったんやろ…
やっぱこういう色んな複雑な処理が影響してるんかな…
その辺の知識がないから全然わからんw
ま、最近は何も聞かないから一応うまくいってんのかな?(適当)
何事も、ずっとうまく動かし続けるって大変ですよね~~
コメント