<Excel97 VBA CSVから固定長 読者からアドバイス〜>
目次
1.はじめの挨拶
2.読者より、アドバイス 関数分割について
3.読者より、アドバイス 自作関数作ってみました
4.質問コーナー?
5.おわりの挨拶
----------------------------------------------------------------------------
/*
* 1.こんにちは
*/
こんにちは。
今回は、前回の積み残し、
Excel97 VBA CSVから固定長
です。読者より2・3ヒントをいただきました。
なぜか、FTPの調子が悪いので、HPは、更新していません
(今回、画像付き、サンプルありませんが、、、)
えっ、画像はいつも見てないって、、そんなこと言わないで、、
見てくださいよ。
(ホントのところは、どうなんだろう?)
/*
* 2.読者より、アドバイス 関数分割について
*/
転載不可、ken3の言葉で書いてください
と書かれたメールでアドバイスをいただきました。
ア.関数は、分割してください。
前回のサンプル、1つのモジュールに詰込んでました。
ファイル名作成・処理・結果をメモ帳で表示。
これだと、1つ1つがわかりにくいみたいなので、
今回、メイン部分と呼び出し側の2つに分けました。
幕ノ内弁当で、おかずのエリアを分けた。。
シャケがおいしければ、シャケだけ抜いて、
シャケ弁当を作りやすいように、
1つ1つの単位に分けるって、大切かもしれません。
*アドバイス、どうもです。
マズイ組み合わせがあったら、そこだけ修正、、後々の流用ですね。
イ.Strconvで変換後処理してみては?
文字コードでバイト数がわからないなら、
strconvで変換後処理してみては?
と、アドバイス含めて、いただきました。
(回答をズバリ書いてくれないのが、ホントはやさしい師匠?)
私なりの答え(再度の味付け)を下記に記載します。
*まだ、変換サイズなどを外部に出すなど、してませんが、、
'--------
Sub TEST_MAIN()
Dim strINFname As String
Dim strOUTFname As String
' csvtotxt.xls のパスを使用して、INファイル、Outファイルの
'ファイル名を作成する
strINFname = ActiveWorkbook.Path & "\Sample.txt"
strOUTFname = ActiveWorkbook.Path & "\out.txt"
'お行儀良く、入力ファイルがアルか、チェックしますか、、、
If Len(Dir(strINFname) & "") = 0 Then
MsgBox strINFname & "ファイルが見つかれません"
Exit Sub 'モジュールを抜ける
End If
'サンプルモジュールをコールする
Call Excel97_CSVtoTXT(strINFname, strOUTFname)
'結果をメモ帳表示
Shell "notepad.exe " & strOUTFname, vbNormalFocus
End Sub
'サンプルモジュール
'固定処理が多いので流用・汎用性が無い、なぁ。。
'サイズを(も)引数で渡したり、工夫しないと、、
Sub Excel97_CSVtoTXT(strINFname As String, strOUTFname As String)
Dim nYLINE As Integer
Dim x As Integer
Dim OUT_FNO%
Dim nOUTSIZE(10) As Integer '10もいらないでしょ、、、
Dim strOUTBUF As String
'入力ファイルをCSVで開く ↓変数に変更
Workbooks.OpenText FileName:=strINFname, StartRow:=1, DataType:= _
xlDelimited, TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, _
Tab:=False, Semicolon:=False, Comma:=True, Space:=False, Other:=False _
, FieldInfo:=Array(Array(1, 2), Array(2, 2), Array(3, 2), Array(4, 2), Array(5, 2), _
Array(6, 2))
'出力テキストファイルを作成する
'シーケンシャル ライト モードで開きます
OUT_FNO = FreeFile
Open strOUTFname For Output As #OUT_FNO
'出力先のサイズを代入
'サンプルデータは会員番号1(8桁)、漢字氏名(20桁)、ローマ字
'(18桁)、生年月日(10桁)、会員番号2(10桁)、暗証番号
'(3桁)で構成されています。
nOUTSIZE(1) = 8
nOUTSIZE(2) = 20
nOUTSIZE(3) = 18
nOUTSIZE(4) = 10
nOUTSIZE(5) = 10
nOUTSIZE(6) = 3
'データが無くなるまでループ(A列が空白になるまで)
'おいおい、データが1行しかなかったら、どうなるの?<<<知らない、、
nYLINE = 2 'タイトルを抜かし、2行目から、スタート
While Len(Cells(nYLINE, 1) & "") <> 0
For x = 1 To 6 'AからF列まで処理
strOUTBUF = Cells(nYLINE, x)
'XXバイトに満たない場合、空白を後ろに詰めています
strOUTBUF = LeftB(StrConv(strOUTBUF & Space(nOUTSIZE(x)), vbFromUnicode), nOUTSIZE(x))
strOUTBUF = StrConv(strOUTBUF, vbUnicode)
'データ書きこみ
Print #OUT_FNO, strOUTBUF; '←を付けると改行されない
Next x
Print #OUT_FNO, "" '改行のみする
nYLINE = nYLINE + 1 '忘れないようにカウントアップ
Wend
Close #OUT_FNO ' ファイルを閉じます。
End Sub
'--------
こんな感じです。
/*
* 3.読者より、アドバイス 自作関数作ってみました
*/
無いものは、自分で作ろうって、こころ、忘れてた、、、
読者からいただいた、固定長、右スペース埋め関数です。。
'----------------------------------------
Public Function SetKoteicho(input_str As String, length As Integer) As String
Dim check_char As Integer 'Asc関数で全角かどうか調べる文字の位置
Dim sjis_length As Integer 'シフトJIS換算の文字数
Dim sjis_code As Integer '文字コード(シフトJIS)
Dim output_str As String '固定長に変換した文字列
sjis_length = 0
check_char = 1
Do
sjis_code = Asc(Mid(input_str, check_char, 1))
'文字コードから全角文字か半角文字かを調べる
If sjis_code > 256 Or sjis_code < 0 Then
'全角文字
sjis_length = sjis_length + 2
Else
'半角文字
sjis_length = sjis_length + 1
End If
check_char = check_char + 1
Loop While (check_char <= Len(input_str))
'必要なだけスペースを加える
output_str = input_str & Space$(length - sjis_length)
SetKoteicho = output_str
End Function
'--------------------------------------
'下記のようにコールすると、使用できます
For x = 1 To 6 'AからF列まで処理
'感謝して、関数を使用する、、、
strOUTBUF = SetKoteicho(Cells(nYLINE, x), nOUTSIZE(x))
'-----------↑^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Print #OUT_FNO, strOUTBUF; '←を付けると改行されない
Next x
'--------------------------------------
ありがたいですね、、、ホント。
/*
* 4.質問コーナー?
*/
----------
>VBでVoice Clockを作ってみたいのですが...
>簡単な方法が有りますか。
>朝、昼、夕方の三回だけしゃべってくれればいいのですが。
----------
タイマーイベントのネタで使用かなぁ、、、
ネタようにメモメモ。
/*
* 5.終わりの挨拶
*/
今回、読者任せでした(厨房を貸して、料理作ってもらった?)
年末ですね、、、来年は構想を考えて、
少しは、講座らしくしようかなぁ?
では、また。 三流PG Ken3でした。
ここまで、読んでいただきどうもです。ここから下は、三流君のホームページの紹介・案内です
目的の情報が見つかったか?少々心配しつつ、、、
項目別に本音?それとも建て前?的な記事をまとめました。
|
気になったジャンル↓を選択してください。 |
Blogとリンク:[三流君の作業日記]/ [愚痴(Bookmark)]/ [広告Blog(Bookmark)]