
エクセル2000で、シートをテキストファイル
(prnファイル)に落とすVBAを作っています。
現在、以下のようなコード(OK Webで教えていただいた
方法)で、スペース区切りでA5からC10までをテキスト
ファイルに落とす、というような方法を使っています。
ここから、A列は100バイト、B列は150バイト、
C列は50バイトというように列の長さを固定して
テキストファイルに落とすようにしたいのですが、
どのようにすればよろしいのでしょうか?
以下はプログラムで使っている変数名です。
・sMyFilenameは出力するファイル名
・lRowNumbは5行目から10行目までを指定。
・nColumNumbはA列からX列までを指定。
nFrn = FreeFile(0)
Open sMyFilename For Output As #nFrn
For lRowNumb = 5 To 10
For nColumNumb = 1 To 3
sData = .Cells(lRowNumb, nColumNumb).Value
If nColumNumb < 3 Then
Print #nFrn, sData & " ";
Else
Print #nFrn, sData
End If
Next nColumNumb
Next lRowNumb
Close #nFrn
No.1ベストアンサー
- 回答日時:
サンプルを作りました。
ファイル名などを固定にしていますが、そこら辺は読み替えてください。
それと毎回読んだデータをすぐに書きに行っていたので、一行ずつ書き込むように変更しています。
大きな違いはfixStrというオリジナル関数を追加しています。
この関数で、固定長の文字列として取得できます。
VBでは文字長に関係するときは
StrConv("文字列", vbFromUnicode)
というのをよく使います。
Sub Main()
Dim nFrn As Long
Dim lRowNumb As Long
Dim nColumNumb As Long
Dim sData As String
Dim FixByte As Variant '固定長バイト数をあらわす配列
Dim strOutPut As String '出力する文字列
Dim wkStr As String 'ワークの文字列
'各列のバイト数をセット(配列0の要素にダミーの値をセット)
FixByte = Array(0, 100, 150, 50)
nFrn = FreeFile(0)
Open "c:\1.txt" For Output As #nFrn
For lRowNumb = 5 To 10
'出力文字の初期化
strOutPut = ""
For nColumNumb = 1 To 3
'とりあえず書かれている内容を取得
sData = Cells(lRowNumb, nColumNumb).Value
'固定長のバイト数で調整を行う、ダミーの文字列として、" "スペースを使用
wkStr = fixStr(sData, CLng(FixByte(nColumNumb)), " ")
'文字列の連結を行う
strOutPut = strOutPut & wkStr
Next nColumNumb
'文字列の出力
Print #nFrn, strOutPut
Next lRowNumb
Close #nFrn
End Sub
'文字数をパラメータの文字列で調整して返す関数
'引数1.調整される文字列
'引数2.バイト長
'引数3.固定長の調整文字
Private Function fixStr(inStrings As String, inLength As Long, inDmyStr As String) As String
Dim wkStr As String 'ワークの文字列
'引数の文字列に、引数の長さの分だけのv調整文字を追加して一時記憶
wkStr = inStrings & String(inLength, inDmyStr)
'FromUnicodeに変換
wkStr = StrConv(wkStr, vbFromUnicode)
'左からinLength分の文字を取得
wkStr = LeftB(wkStr, inLength)
'Unicodeに変換して返す
fixStr = StrConv(wkStr, vbUnicode)
End Function
この回答への補足
丁寧な回答ありがとうございます。
おかげさまで目的のプログラムは作れたのですが、
プログラムの一部で分からないことがあり、
できれば教えていただけないでしょうか?
・fixStrメソッドを呼び出した時のsDataがK
・CLng(FixByte(nColumNumb))が5
だった場合、
(1)'引数の文字列に、引数の長さの分だけの
調整文字を追加して一時記憶
wkStr = inStrings & String(inLength,
inDmyStr)
でwkStrはKに5個のスペースがついた状態になるんだろう
というのは分かるのですが、(←間違っていたら教えて
ください)
次の
(2)FromUnicodeに変換 して
(3)inLength(5個)分の文字を取得
(4)Unicodeに変換
というのがよく分からず、実際にこのプログラムをコピー
して変数の動きを見てみたのですが、分かりません
でした。
(2)と(4)は何のためにやっていてどんな働きがあるので
しょうか?
No.5
- 回答日時:
補足です。
(StrConvについて)VBで文字列をそのままLen関数にかけると、文字数が返ってきます。LenBだと文字数の2倍の値が返ってきます。
一度
Dim wkByte() as Byte
と宣言して
wkByte = "あいbうcえお" '←半角と全角の混合
として、実行してみてください。
wkByteは1文字につき、配列2個を使用する変数になっています。このときは0~13までの配列要素をもった配列になってると思います。
配列要素偶数番目には0以外の数字が入っているはずです。配列要素奇数番目には、0が入っていたり入っていなかったりすると思います。
それがポイントです。
奇数番目に0が入っているのは、その直前の配列要素の値で文字を表現していることになります。
その0の値を無視してカウントさせる処理をStrConvでやってると思っていただければ結構です。
丁寧に教えていただいてありがとうございます。
まだ完全には理解できていませんが、少しイメージできました。
今回は非常に助かりました。ありがとうございました。
No.4
- 回答日時:
そうですね。
#2 は文字数なのでNGです。_(* *)_wkStr = fixStr(sData, CLng(FixByte (nColumNumb)), " ")
でやらないといけません。
No.3
- 回答日時:
urkさん(#2)への補足です。
>sData = Left(sData, DLen)
>sData = sData & Space(DLen - Len(sData))
この部分はバイト数ではなく、文字数で行っています。
sDataに全角文字がないときはOKですが、もしあるのであればNGです。
No.2
- 回答日時:
ワウ もうサンプルがありましたか
私もサンプル作ってみました。
ちょっと列でのデータ長処理泥臭くやってみました。
#1の方が汎用的でスマートですね。
Sub test1()
Dim sData As String
Dim DLen As Long '列でのデータ長さ
Const sMyFilename As String = "C:\My Documents\OKWeb\test1.txt"
nFrn = FreeFile(0)
Open sMyFilename For Output As #nFrn
For lRowNumb = 5 To 10
For nColumNumb = 1 To 3
'とりあえずデータ取得
sData = Cells(lRowNumb, nColumNumb).Value
Select Case nColumNumb
Case 1 '1列目
DLen = 100 'byte
sData = Left(sData, DLen)
sData = sData & Space(DLen - Len(sData))
Case 2 '2列目
DLen = 150 'Byte
sData = Left(sData, DLen)
sData = sData & Space(DLen - Len(sData))
Case 3 '3列目
DLen = 50 'Byte
sData = Left(sData, DLen)
sData = sData & Space(DLen - Len(sData))
Case Else
MsgBox (" Error")
Exit Sub
End Select
Print #nFrn, sData; '改行しない
Next nColumNumb
Print #nFrn, "" 'ここで改行
Next lRowNumb
Close #nFrn
End Sub
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
今、見られている記事はコレ!
-
弁護士が解説!あなたの声を行政に届ける「パブリックコメント」制度のすべて
社会に対する意見や不満、疑問。それを発信する場所は、SNSやブログ、そしてニュースサイトのコメント欄など多岐にわたる。教えて!gooでも「ヤフコメ民について」というタイトルのトピックがあり、この投稿の通り、...
-
弁護士が語る「合法と違法を分けるオンラインカジノのシンプルな線引き」
「お金を賭けたら違法です」ーーこう答えたのは富士見坂法律事務所の井上義之弁護士。オンラインカジノが違法となるかどうかの基準は、このように非常にシンプルである。しかし2025年にはいって、違法賭博事件が相次...
-
釣りと密漁の違いは?知らなかったでは済まされない?事前にできることは?
知らなかったでは済まされないのが法律の世界であるが、全てを知ってから何かをするには少々手間がかかるし、最悪始めることすらできずに終わってしまうこともあり得る。教えてgooでも「釣りと密漁の境目はどこです...
-
カスハラとクレームの違いは?カスハラの法的責任は?企業がとるべき対応は?
東京都が、客からの迷惑行為などを称した「カスタマーハラスメント」、いわゆる「カスハラ」の防止を目的とした条例を、全国で初めて成立させた。条例に罰則はなく、2025年4月1日から施行される。 この動きは自治体...
-
なぜ批判コメントをするの?その心理と向き合い方をカウンセラーにきいた!
今や生活に必要不可欠となったインターネット。手軽に情報を得られるだけでなく、ネットを介したコミュニケーションも一般的となった。それと同時に顕在化しているのが、他者に対する辛らつな意見だ。ネットニュース...
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C#でstringをポインタとして渡す
-
c#で他のアプリの文字入力フォ...
-
TCL言語で文字列検索方法を教え...
-
CSVファイルの「”」について
-
nullと""、\\0とEOFの違いにつ...
-
C++で入力した文字列から数字を...
-
シリアル通信で0x00を送信した...
-
関数から配列を返すには?
-
char*を初期化したいのですが
-
VBAのプログラムで、DIAG = 1# ...
-
配列を使わずに、変数名を動的...
-
init関数の意味
-
配列の要素数に変数を入れたい...
-
c言語で任意のファイルから読み...
-
配列をEraseしてもメモリが開放...
-
CStringからchar*への型変換に...
-
qsortについて
-
C言語のポインタに直接アドレス...
-
【速いブラインドタッチ】手を...
-
文字列str内の全ての数字を...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
nullと""、\\0とEOFの違いにつ...
-
%dなどの違い
-
WSH(VBS)でJSONの文字列を読み...
-
シリアル通信で0x00を送信した...
-
C++で入力した文字列から数字を...
-
プログラムによく出てくるst...
-
TCL言語で文字列検索方法を教え...
-
16進数を2文字ずつ配列に格納し...
-
C#でstringをポインタとして渡す
-
VB6.0でのバイナリデータの扱い...
-
c#で他のアプリの文字入力フォ...
-
バイナリファイル中の日本語文...
-
VBA-DLLの引数受け渡しについて
-
構造体→文字列→構造体 をする方法
-
_tcscpy_s(wcscpy_s)の第二引数...
-
アルファベットの出て来た回数
-
char型配列の最大要素数
-
引用符と二重引用符
-
Excelシートを固定長のテキスト...
-
binaryに対して正規表現を適用...
おすすめ情報