-
三流君の
[コンビニ系HPへ]
[VBA系HPへ]
[ASP系HPへ]
[愚痴系HPへ]
CSVから固定長(普通の)に変換
/*
* 4.CSVから固定長(普通の)に変換 楽して、、、
*/
CSVから固定長(普通の)に変換
かぁ、、、
Excelの機能で、できないかなぁ、、、
チョット、やってみますか。
まず、Excelを起動して、
ファイル開くのテキストファイル、、、
ファイル名を指定して、
おっと、次は、カンマやタブなどの区切り文字、、
を選択して、、
区切り文字の種類をカンマにレ(チェック)を付けて、
文字列にして、取り込み、、、完了。
あとは、固定長で、テキストを保存すれば、OKかな。。。
あれ、、名前を付けて保存に、固定長テキストファイルが無い???
えっ、なんで???Excelの機能にないの?
(↑、、これ、Ken3のマチガイかもしれないので、要調査です、、)
/*
* 5.しかたない、、、自分で作ろう、、、
*/
自分で、作ることにします。
Accessのテーブルに入れれば、なんかできそうな気がする
けど、Excel VBAでカッコわるく作ります。
(とりあえず、固定で、汎用性の無いプログラムで、、、)
マクロ記録で、途中まで作ります。。。
オイオイ、そんなんで、いいの?
まぁまぁ、、、途中までは、適当に、、最後の味付けだけ、
今回は、がんばります。
ツール、マクロ記録を選択。
先ほどの手順で、テキストファイルを読み込みます。
ALT+F11を押すと、
すると、下記のようなモジュールができてます。
*あいかわらず、Excel君すごいような、、
バカ正直なようなコード書いてくれます
(ほんと、助かります、三流の私は、、、)
Sub Macro1()
'
' Macro1 Macro
'
'
Workbooks.OpenText FileName:="D:\034\Sample.txt", 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, 5), Array(5, 2), _
Array(6, 2))
End Sub
まぁ、意味わかんないけど、これで、CSVがExcelになります。
あとは、このコードに肉づけして、、、
Sub Macro1()
Dim strINFname As String
Dim strOUTFname As String
Dim nYLINE As Integer
Dim x As Integer
Dim OUT_FNO%
Dim nOUTSIZE(10) As Integer '10もいらないでしょ、、、
Dim strOUTBUF 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
'入力ファイルを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, 5), 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 = LeftB(Cells(nYLINE, x), nOUTSIZE(x))
Print #OUT_FNO, strOUTBUF; '←を付けると改行されない
Next x
Print #OUT_FNO, "" '改行のみする
nYLINE = nYLINE + 1 '忘れないようにカウントアップ
Wend
Close #OUT_FNO ' ファイルを閉じます。
'結果をメモ帳表示
Shell "notepad.exe " & strOUTFname, vbNormalFocus
End Sub
こんな感じで、、、、
あれ、、、うまく行かない、、、
今日は、あきらめます(すみません)
strOUTBUF = LeftB(Cells(nYLINE, x), nOUTSIZE(x))
これが、おかしいみたいですが、、、
私なりの答え(再度の味付け)を下記に記載します。
*まだ、変換サイズなどを外部に出すなど、してませんが、、
'--------
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
'--------------------------------------
ありがたいですね、、、ホント。
サンプル→034.LZH 13KB
をダウンロードして、見てください。
Excel97 VBA csvtotxt.xls バグ付きが入っています
元データです

まず、Excelを起動して、
ファイル開くのテキストファイル、、、


ファイル名を指定して、
おっと、次は、カンマやタブなどの区切り文字、、
を選択して、、

区切り文字の種類をカンマにレ(チェック)を付けて、

文字列にして、

取り込み、、、完了。

あとは、固定長で、テキストを保存すれば、OKかな。。。

あれ、、名前を付けて保存に、固定長テキストファイルが無い???
えっ、なんで???Excelの機能にないの?
(↑、、これ、Ken3のマチガイかもしれないので、要調査です、、)
マクロ記録で、途中まで作ります。。。
オイオイ、そんなんで、いいの?
まぁまぁ、、、途中までは、適当に、、最後の味付けだけ、
今回は、がんばります。
ツール、マクロ記録を選択。
先ほどの手順で、テキストファイルを読み込みます。



ALT+F11を押すと、
すると、下記のようなモジュールができてます。
*あいかわらず、Excel君すごいような、、
バカ正直なようなコード書いてくれます
(ほんと、助かります、三流の私は、、、)

作成したマクロをボタンへ登録、、する方法
まず、ツールバー、フォームを表示します

次に、ボタンを選択します

シートにボタンを貼ると、登録マクロが選択できます

...
■番外編 愚痴系で書いてた今日の一品 (短いサブ関数など)
2000/05/13 SQL Count関数を使ってみる
2000/05/11 Access97 標準関数Midなどが使えない
2000/05/09 SendObjectのエンコード
2000/05/08 クエリーで〜以外とは
2000/04/27 Imagingコントロールを使ってみた
2000/04/25 Excel97 VBA イベントなど
2000/04/24 Access97で複数のプリンタを切替えて使用
2000/04/20 書式付きエクスポート DoCmd.OutputToで、できます
2000/04/19 Access97でExcel形式へExport時に書式設定を行いたい
2000/04/13 Access97でOutlook97/98とリンクする方法
2000/04/13 VBA Nameステートメント
2000/04/04 Accessでキー取得
2000/04/04 AccessでFile参照ダイアログ?
2000/04/03 縦書用数値変換改良
2000/04/01 Access Err テーブルを消したい
2000/03/31 縦書き数値、どうしてますか?
2000/03/29 VBA 手抜きで、処理後、explorerを開く
2000/03/28 Access --> Word へデータ
2000/03/24 名前一覧Excelの機能で、同じことできました
2000/03/23 Excel97 VBA セルに付けた名前一覧を作成する
2000/03/21 Excel セルに名前付け
2000/02/25 iniFileを読む GetPrivateProfileString
2000/02/15 Excel VBA Rangeオブジェクトとサンプル
2000/02/14 Access97 SizeMode/OLEサイズ で画像調整
2000/02/10 Access97 Pictureプロパティとサンプル
2000/02/09 Access97 集計クエリーで重複値をハジク
2000/02/07 Access97 サブフォームへ値をセット
2000/02/04 Access97 コントロールソース、チョットした使用法
2000/02/01 Access97 フォームフッター
2000/01/18 Access97 now()関数で有効期限処理、、、
_/_/
_/_/
_/_/
_/_/
_/_/
三流君のHP主な飛び先
人気ページ/アクセスランキング
↑一週間の訪問者数と人気のページを表示してます
その他、宣伝ページです
・[
アンケート/ポイント]などで月500円を必死に稼いでます(笑)
・[
SOHO/在宅プログラマー/派遣]の話題、Webエントリー後の反応など
・[
出会い系]のお話、自分で出会い系のシステム作れないか?探ったお話
・[
ネットで小金を稼げるか?]実験中だが成果は無し
※あとは、[パソコン関係の書籍]や[ゲームソフト]、
[パソコンパーツ]
をバナーから売ろうとするけど、
なかなかうまくはいかないよね(笑)
|
←パソコンの技術系の書籍を探しているなら
コンピュータ関連の出版社33社(アスキー、インプレス等)が共同運営するコンピュータの本・専門店
※種類が豊富で探し易い※在庫ありが48時間以内発送
|
プログラム系、流れや基本系?
[No.4 プログラムって?流れって?]
[No.5 変数・乱数・定数]
[No.8 配列とArray関数]
[No.9 If文で範囲のチェック]
[No.10 Select Case XX To XX と Is >= XX]
[No.11 InputBox関数で簡単な値を受け取る]
[No.12 入力結果の判断いろいろ]
[No.19 Exit Subで途中退場する]
[No.20 配列変数ですっきりと?(2次元配列)]
[No.21 変数の型を意識する]
[No.22 関数って?Subプロシージャを呼ぶ]
[No.23 値を返すユーザー関数、Function関数]
[No.24 関数のパターンを少し]
[No.35 イベント処理について]
[No.36 オブジェクトのプロパティについて]
[No.37 オブジェクトのメソッドについて]
[No.45 歌詞の表記を参考に関数を作成]
[No.73 オブジェクトのループはFor Each In でループさせる]
VBA関数
[No.3 Dir関数でファイルの存在をチェックする]
[No.17 Val関数で文字列を数値に変換してみた]
[No.18 文字列を数値に変換、CIntで変換]
[No.38 キャラクタコード?って何? Chr関数、Asc関数]
[No.39 StrConv関数で半角を全角文字にしてみた]
[No.40 Len関数で遊ぶ、遊ばれる]
[No.72 文字列を日付型に変換、Cdateへの値の渡し方いろいろ?]
[No.77 Not演算子で細工する、プログラムはパズルのように...]
Excel関係
[No.28 Excelのグラフをgifへ変換 .Exportメソッド使用]
[No.43 セルのB3を参照するには?]
[No.44 Cells(257)とCells(2,1)の関係]
[No.49 Excel Rows(n).Select で行選択]
[No.47 Excel Application.GetOpenFilenameでファイル名取得]
[No.60 Cancel=Trueの使い方(例題:Excel 右クリック禁止)]
[No.51 Excel Range オブジェクトを使う]
[No.86 Excel 起動オプションのお話(引数的なラブレターを渡したい)]
Excel UserForm
[No.30 Excel UserForm テキストボックスのイベント]
[No.32 Excel UserForm_KeyDownイベント発生条件]
[No.34 ┌ ─ ┐│└ ┘を使って、文字列を囲ってみたい]
[No.42 ExcelのForm シートと連動させる]
[No.46 カウンタで先頭行チェック、空白で終わりの判断]
[No.61 Excel Form 閉じる方法 Unload Me]
[No.63 Excel UserForm で データ・フォームの機能を真似てみる]
[No.68 Excel Formで値を設定、標準モジュールで使用したい]
[No.84 Excel UserFormでコンボボックスを使用してみた]
Access 関係
[No.1 いきなりサンプルじゃぁねぇ、、文句の一つ言いたいよ]
[No.75 空のMDBを作成後、DoCmd.CopyObjectでテーブルコピー]
[No.85 Access クエリーで演算フィールドを使ってみる]
Access フォーム
[No.41 AccessのForm .Pictureプロパティで画像参照]
[No.62 Access フォームでパスワード入力(入力後*****表示)]
[No.65 Access Form TextBoxの.SelLength .SelStartプロパティ]
[No.66 Access ユーザーマスターのチェックとメニュー切り替え]
[No.67 Access Formを隠す Me.Visible = False (Closeとの違い)]
[No.69 Access コンボボックスを自動で開きたい]
Access レポート
[No.74 Access 列型レポートの左端に印刷したい]
[No.76 Access レポート Me.NextRecord = Falseで移動を止める]
Access から Excel 連携
[No.2 AccessからExcel出力]
[No.7 MDBと同フォルダのExcelファイルを開く]
[No.13 Excel セルに名前を付けてみる]
[No.14 Excel 隣のシートを参照して逃げる]
[No.48 AccessからExcelブックを開き、書式設定を行う]
[No.54 AccessからExcel開いて、処理終了後に閉じたい]
[No.58 Access クエリーを Excel既存シートへ エクスポート]
[No.59 Excelのマクロ付きフォーマットを壊されないように]
[No.64 AccessからExcelファイルを開いて・印刷して・閉じたい]
Excel から Access 連携
[No.15 ExcelからAccessのフォームを開いてみました]
[No.16 ExcelからAccessのモジュールを呼んでみました]
テキストファイル処理
[No.27 テキストファイル処理 ファイルへの書き込み]
[No.29 テキストファイル処理 ファイルからの読み込み]
[No.31 Write #で ””を付けた書き込み]
[No.33 FreeFile関数で空いてるファイル番号を返す方法]
インターネットエクスプローラーの操作(InternetExplorer.application)
[No.50 IE起動 CreateObject("InternetExplorer.application")]
[No.52 InternetExplorer.application .document.body.innerText]
[No.53 文字列を探す、InStr関数の使い方]
[No.70 InternetExplorer.application .document.all(0).innerHTML]
[No.71 IE操作 リンク先を取出す .Document.links(i).href]
Outlookを操作する
[No.55 Outlookを操作してメールを送りたい]
[No.56 Outlookから複数のアドレスにBCC送信]
[No.57 Outlook メールアイテムの形式でハマる]
[No.78 Outlookでファイルを添付するには?.Attachments.Add]
FTPの設定ファイルを作成してみた
[No.25 コマンドラインのFTPを使ってみた]
[No.26 FTP -n オプションとuserコマンド]
Excel HTML表作成ツールもどき
[No.80 Excelのセル範囲をHTMLの表(.html)にしてみる]
[No.81 セルの右寄せ、中央寄せをHTMLの表にしてみる]
[No.82 背景色、フォントカラーをHTMLの表にしてみる]
[No.83 改行LFを<BR>などHtml用にエンコードして書き込む]
その他
[No.6 ファイルの起動場所を知る方法]
[No.79 SJIS--JISコードの文字列を作成したい]
...
挨拶
最後まで読んでいただき、どうもです。
失敗続きのAB型の変わり者 三流プログラマー Ken3です。
[Excel/Access VBA],[
ASP(Active Server Pages)]の解説
[
プログラマーの愚痴]、[
元コンビニ店長時代の話]
をネタにしてHP作成、メルマガ書いてます。
最近、[初心者にやさしいプログラム]の解説と[
ネットで稼ぐ小悪テク]の解説を始めようかなぁと思ってます。
...