エクセル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

このQ&Aに関連する最新のQ&A

A 回答 (5件)

サンプルを作りました。



ファイル名などを固定にしていますが、そこら辺は読み替えてください。
それと毎回読んだデータをすぐに書きに行っていたので、一行ずつ書き込むように変更しています。
大きな違いは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)は何のためにやっていてどんな働きがあるので
しょうか?

補足日時:2001/10/25 10:58
    • good
    • 0

補足です。

(StrConvについて)

VBで文字列をそのままLen関数にかけると、文字数が返ってきます。LenBだと文字数の2倍の値が返ってきます。

一度
Dim wkByte() as Byte
と宣言して
wkByte = "あいbうcえお" '←半角と全角の混合
として、実行してみてください。
wkByteは1文字につき、配列2個を使用する変数になっています。このときは0~13までの配列要素をもった配列になってると思います。
配列要素偶数番目には0以外の数字が入っているはずです。配列要素奇数番目には、0が入っていたり入っていなかったりすると思います。
それがポイントです。
奇数番目に0が入っているのは、その直前の配列要素の値で文字を表現していることになります。

その0の値を無視してカウントさせる処理をStrConvでやってると思っていただければ結構です。
    • good
    • 0
この回答へのお礼

丁寧に教えていただいてありがとうございます。

まだ完全には理解できていませんが、少しイメージできました。

今回は非常に助かりました。ありがとうございました。

お礼日時:2001/10/25 13:14

そうですね。

#2 は文字数なのでNGです。_(* *)_
 wkStr = fixStr(sData, CLng(FixByte    (nColumNumb)), " ")
でやらないといけません。
    • good
    • 0

urkさん(#2)への補足です。



>sData = Left(sData, DLen)
>sData = sData & Space(DLen - Len(sData))
この部分はバイト数ではなく、文字数で行っています。
sDataに全角文字がないときはOKですが、もしあるのであればNGです。
    • good
    • 0

ワウ もうサンプルがありましたか


私もサンプル作ってみました。
ちょっと列でのデータ長処理泥臭くやってみました。
#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
    • good
    • 0
この回答へのお礼

今回は半角文字のみだったので、SpaceとLenも使わせていただきました。回答ありがとうございました。非常に助かりました

お礼日時:2001/10/25 13:22

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q「酎」の部首について。

漢字検定2級の、練習問題20の2をやっていました。

そして、「酎」の部首と部首名を書き出す問題で、
それで酎の問に私は、

  寸(部首)、すん(部首名)

と解答しました。
そして答え合わせをしたところ、
この酎の部首は「酉(とりへん)」が正解でした・・

寸(すん)だと思ったのですが、酎のような部首が2つくっついてる漢字には、優先する部首があるのでしょうか?
部首のシステムがあまり分かりません><
ご回答よろしくお願いします!

Aベストアンサー

辞書によってその漢字の成り立ちや解字には異説が混在している場合もありますので、漢検を目指す目的であれば、やはり「漢検 漢字辞典」に当られてはいかがでしょう。
この辞書では部首索引の欄で例えば「寸」に当ると最初に別枠に他の部首である漢字が列記されており大変便利です。(例えば「付→人」「肘→肉」「討→言」「奪→大」など。)

ここから、二つの部首の組み合わせとしての会意文字と見た場合でも、「寸」の方は「肘」の省画の略字であり、「酉(酒つぼ)」+「肘(ひきしぼる)」の意味であり、しかも一般的には形声文字と見做して主要な意符(義符)は「酉」であり、「肘」が省画された「寸」の方は「チュウ」という音符(声符)と解して意符「酉」の部首に組み入れられているということでしょう。
面白いのは肝心の「酒」が「酉」の部首になく「サンズイ」に入っている辞書もあるなど、解字にも変遷や辞書それぞれのポリシーの相違が見受けられることです。(例:「岩波漢語辞典」)

とまれ、「漢検 漢字辞典」では部首は「酉(日暦(ひよみ)のとり)」の3画になっています。
単に「酉(とり)」では「鳥(とり)」「隹(ふるとり)」と混同しやすいことからでしょう。
他の辞書では「ひよみ(暦)のとり」(「岩波漢語辞典」)、「日読(ひよみ)のとり」(「大字典」)と、同訓でも当てられた漢字はそれぞれ異なっています。
「酉(さけ)扁(へん)」とする通称もありますが、本来は酒壺や徳利の形からの象形文字なので「さけづくり」とか「さけのとり」と呼ぶ辞書もあるようです。

ことほど左様で、試験には試験向きの辞書が欠かせない現状なのかも知れません。

辞書によってその漢字の成り立ちや解字には異説が混在している場合もありますので、漢検を目指す目的であれば、やはり「漢検 漢字辞典」に当られてはいかがでしょう。
この辞書では部首索引の欄で例えば「寸」に当ると最初に別枠に他の部首である漢字が列記されており大変便利です。(例えば「付→人」「肘→肉」「討→言」「奪→大」など。)

ここから、二つの部首の組み合わせとしての会意文字と見た場合でも、「寸」の方は「肘」の省画の略字であり、「酉(酒つぼ)」+「肘(ひきしぼる)」の意味であり、しかも...続きを読む

Q以下のFor Nextで「Nextに対するForがありません」とコンパ

以下のFor Nextで「Nextに対するForがありません」とコンパイルエラーが出ます。どこが悪いのか教えてください。

Sub 品番検索()
'
' Macro1 Macro
'
Application.Goto Reference:="Macro1"
'
Dim hinban As String
Dim y, n
y = 16
hinban = InputBox("品番を入力してください。", "品番入力", "ABC-123")
For n = 2 To 200
A0 = Worksheets("履歴RW").Cells(2, n)
A1 = Worksheets("履歴RW").Cells(2, n + 1)
A2 = Worksheets("履歴RW").Cells(2, n + 2)
A3 = Worksheets("履歴RW").Cells(2, n + 3)
A4 = Worksheets("履歴RW").Cells(2, n + 4)
A5 = Worksheets("履歴RW").Cells(2, n + 5)
A6 = Worksheets("履歴RW").Cells(2, n + 6)
A7 = Worksheets("履歴RW").Cells(2, n + 7)
A8 = Worksheets("履歴RW").Cells(2, n + 8)
A9 = Worksheets("履歴RW").Cells(2, n + 9)
If hinban = A0 Then
Worksheets("発注FM").Cells(y, 2) = A0
Worksheets("発注FM").Cells(y, 3) = A1
Worksheets("発注FM").Cells(y, 4) = A2
Worksheets("発注FM").Cells(y, 5) = A3
Worksheets("発注FM").Cells(y, 6) = A4
Worksheets("発注FM").Cells(y, 7) = A5
Worksheets("発注FM").Cells(y, 8) = A6
Worksheets("発注FM").Cells(y, 9) = A7
Worksheets("発注FM").Cells(y, 10) = A8
Worksheets("発注FM").Cells(y, 11) = A9
y = y + 1
Else
Next
End Sub

以下のFor Nextで「Nextに対するForがありません」とコンパイルエラーが出ます。どこが悪いのか教えてください。

Sub 品番検索()
'
' Macro1 Macro
'
Application.Goto Reference:="Macro1"
'
Dim hinban As String
Dim y, n
y = 16
hinban = InputBox("品番を入力してください。", "品番入力", "ABC-123")
For n = 2 To 200
A0 = Worksheets("履歴RW").Cells(2, n)
A1 = Worksheets("履歴RW").Cells(2, n + 1)
A2 = Worksheets("履歴RW").Cells(2, n + 2)
...続きを読む

Aベストアンサー

「Else」を「End If」に変える。

Q音符が部首になっている漢字

形声文字では、意符が部首になるのが原則のようですが、原則があれば例外もあるだろうと思います。
つまり、音符が部首とされている漢字、です。

たまたま「錦」を見つけました。
手持ちの漢和辞典(2種)では、いずれも部首が「金へん」の形声(会意形声)文字であり、「キン」という音は部首の「金」から来ている、とあります。
だとすると音符が部首になっているわけです。

こういう漢字、多分他にもあるだろうと思うのですが、ご存知の方はご教示下さい。

なお、同じ漢字でも辞書によって部首が違う場合があること、部首の分け方は絶対ではないことは承知しておりますので、その点のご指摘は無用です。

よろしくお願いします。

Aベストアンサー

「碩」は[頁]が義符、[石]が声符
「到」は[至]が義符、[刀]が声符
「賊」は[戈]が義符、[則]が声符
「修」は[彡]が義符、[攸]が声符

「甥」は[男]が義符、[生]が声符
「舅」は[男]が義符、[臼]が声符
齊部の字はすべて[齊]が声符。
「齊」を亠部に収容して、それぞれを本来の義符の部に振り分けるのが妥当な処置だったでしょう。

Q条件付きコンパイル: #IF 1 Then と #IF 0 Then

条件付コンパイルで、
『#If 1 Then』と『#If 0 Then』の条件の違いを教えてください。


『#If ○○○=1 Then』などの場合はわかるのですが、
単に『#If 1 Then』の場合は何をもって真となるのでしょうか?

よろしくお願いいたします。

Aベストアンサー

条件式は、強制的に「True」又は「False」に解釈されます。

で、「数値」を「True」又は「False」に解釈する場合、
「0」は「False」、「0以外」は「True」になります。
(http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/script56/html/vsfctcbool.asp)

つまり、
『#If 1 Then』は、「必ずTrue」=常に有効
『#If 0 Then』は、「必ずFalse」=常に無効
に成ります。

Q漢字の部首について

漢字の宿題をしていて分からないところがあったので質問しました
部首・部首名は分かっているのですが、どの部分が部首なのか分からない漢字がありました
その漢字のどの部分が部首なのか教えてください!!

『甚』部首:甘(「甘」の部分がどこにあるのか分かりません)
『炎』部首:火(上か下、どちらが部首か分かりません)
『褒』部首:衣(「衣」が分かれていていまいち分かりません)

解答よろしくお願いします

Aベストアンサー

甚 : 下の 匹 という部分を外してみると、甘 という文字になります。甘 という文字の二本の縦棒を少し下に伸ばして、その下に 匹 という文字をくっつけると 甚 という文字になります。

炎 : なるほど、上下とも 火 ですね。でも、あえてどちらが部首になるのかというと、私は下の部分だと思います。災 や 灸 のような文字を見ると、下の部分を部首として取っています。まず 火 があり、その 火 の上に燃え上がると 炎 になるのでしょう。

褒 : 哀 や 表 という文字と似た形です。褒 の場合は 保 という漢字の下にある部分が 衣 です。衣という文字の場合には上の部分がありますが、あれは人の首のあたりを意味して、その下が衣服のえりもとを表すそうです。漢字によっては、首の部分が略されて衣服のえりもとを表す部分だけの形になっています。

Qテキストボックスの番号を使ったFor~Next文について

宜しくお願い致します。
エクセルのマクロのフォーム上にtextbox1~textbox10を作成してあります。
これら全てがきちんと入力されているかどうかを調べる命令を書きたいと思っております。
どのようにすればよろしいのでしょうか?

【エラー表示される私の考え】
For i = 1 To 10
If TextBox("& i & ").Value = "" Then
MsgBox ("データを再度入力してください。")
Exit Sub
End If
Next i

if文のところでエラーが出ます。textboxの表示方法がまずいと思うのですが、どうすればよいのかわかりません。ご指導の程宜しくお願い致します。

なお、For~Next文を使わない方法でも構いません。

Aベストアンサー

こんにちは。

Excelの場合コントロール配列は使えません。

TextBoxがTextBox1~TextBox10という名前であれば

Dim i As Integer
For i = 1 To 10
If Me.Controls("TextBox" & i).Value = "" Then
MsgBox ("データを再度入力してください。")
Exit Sub
End If
Next

TextBoxの名前を変更している場合は

Dim myctrl As Control
For Each myctrl In Controls
If TypeName(myctrl) = "TextBox" And myctrl.Value = "" Then
MsgBox ("データを再度入力してください。")
Exit Sub
End If
Next

でどうでしょうか。

Q部首名

中学の子供が利用するのですが・・・
部首名が載っているサイトってありますでしょうか?
例えば、湯で検索したら、部首は「さんずい」で、読みは「ゆ」と出てくるような・・・
いろいろ調べてみたのですが、部首は出てきても、その部首の読みがわからなかったりで、いまいち納得のいくサイトがないので、あれば教えてください。

Aベストアンサー

部首名のサイトなら、こちらがいいかもしれません。

http://dearbooks.cafe.coocan.jp/kotoba03.html

Qテキストボックスの数値をFor~Nextで1個飛びに計算して合計を出したい

VS.NET2003使用者です。
ExcelのVBAより最近転向しました。

タイトルの通り、テキストボックスに入力されている数値を1
個飛びに計算したいのですが、うまく行きません。
テキストボックスはTextBox1~Textbox80まであります。
1個ずつ数値に変換して足して行けば、問題なく計算は出来ます。

出来ればシンプルに行きたいので、For~Nextで出来ないか試しました。
Dim N, STL, TTL As Integer
 For N = 1 To 79 Step 2
  STL = CInt(Me.Controls("textbox" & N).Text())
 TTL = TTL + STL
Next

結果が以下の通りです。
'System.InvalidCastException' のハンドルされていない例外が microsoft.visualbasic.dll で発生しました。
追加情報 : 文字列 "textbox1" から型 'Integer' へのキャストが有効ではありません。

色々検索してみましたが、これといった回答がヒットしません。
この方法は不可能なのでしょうか。

VS.NET2003使用者です。
ExcelのVBAより最近転向しました。

タイトルの通り、テキストボックスに入力されている数値を1
個飛びに計算したいのですが、うまく行きません。
テキストボックスはTextBox1~Textbox80まであります。
1個ずつ数値に変換して足して行けば、問題なく計算は出来ます。

出来ればシンプルに行きたいので、For~Nextで出来ないか試しました。
Dim N, STL, TTL As Integer
 For N = 1 To 79 Step 2
  STL = CInt(Me.Controls("textbox" & N).Text())
 TTL = TTL + STL...続きを読む

Aベストアンサー

> VS.NET2003使用者です。
ですか・・・

VB.NET2003の場合、「Controlsコレクション」で、「コントロール名」は使えないはずです。
#「Integer型のIndex指定のみ」

「Control.ControlCollection.Item プロパティ」
(http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/cpref/html/frlrfsystemwindowsformscontrolcontrolcollectionclassitemtopic.asp)

VB2005なら、コントロール名が使用可能なんですが・・・
「Control.ControlCollection.Item プロパティ」(.NET Framework 2.0)
(http://msdn2.microsoft.com/ja-jp/library/system.windows.forms.control.controlcollection.item(VS.80).aspx)

と言うことで、別の方法を使ってください。
#例えば、自分でCollectionや配列を準備して設定するとか・・・

> VS.NET2003使用者です。
ですか・・・

VB.NET2003の場合、「Controlsコレクション」で、「コントロール名」は使えないはずです。
#「Integer型のIndex指定のみ」

「Control.ControlCollection.Item プロパティ」
(http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/cpref/html/frlrfsystemwindowsformscontrolcontrolcollectionclassitemtopic.asp)

VB2005なら、コントロール名が使用可能なんですが・・・
「Control.ControlCollection.Item プロパティ」(.NET Framework 2.0...続きを読む

Q部首を教えてください

手元に辞書がなく、ネットで部首の検索をしましたが良いサイトが見つからなかったので教えてください。

共通する部首、及び部首名を教えてください。

1.可 永(はねぼう でしょうか)
2.者 君(ノ の でしょうか)
3.彦 豆
4.央 免

Aベストアンサー

>「次の二つの漢字について(A)共通する部分(部首)を補い、(B)補った部首の名称を書け。」


であれば、

(1)「さんずい」を補って「河」と「泳」

(2)「おおざと」を補って「都」と「郡」

(3)「いちのかい(おおがい)」を補って「顔」と「頭」

の要領でしょう。

(4)はすぐにはわかりませんが、考えてみます。

QFor next使う場合、next iはできない?

vbsでFor next使う場合、next iはできないのですか?

for i = 1 to 2
msgbox ""
next i

をすると
"ステートメントの末尾が不正です"800A401
になります。

しかし
for i = 1 to 2
msgbox ""
next
にすると、問題ないです。

VBAではnext iでも実行できるけどVBSではだめなのでしょうか?
理由を教えてください。

Aベストアンサー

Excel2003(Office2003)は持ち合わせていないので、2002の場合なら・・
VBE上で
for i = 1 to 2
msgbox ""
next i
となっていたら、for の所にカーソルを持って行って、F1 キーを押せば
該当すると思われるものがピックアップされます。
あるいは、For まで打ち込んで、F1 とか
イミディエイトウィンドウ(Ctrl + G で出現)で、For まで打ち込んで、F1 とか
2002なら
---------------------
For キーワード
キーワード For は、次の構文で使用します。
For...Next ステートメント
For Each...Next ステートメント
Open ステートメント
-------------------------
となりますので、For Each...Next ステートメント をクリックすると
前回回答のがでます。
たしか、2002の場合はVBAのヘルプはインストール時のオプション扱いだった記憶・・
2003は分かりません。
蛇足ですがOffice2010のVBAのヘルプは今までで一番使いやすいです。
ところが2013では
『以前のバージョンの Office に付属していた開発者用リファレンス ヘルプ ファイルは、セットアップから削除され、
Microsoft Developer Network (MSDN) で参照できるようになります。』
だとさ (-"-)
http://technet.microsoft.com/ja-jp/library/cc178954%28v=office.15%29

VBSのヘルプは、ここから
http://www.microsoft.com/ja-jp/download/details.aspx?id=1406
scd56jp.exe をダウンロードして
実行するとインストール先を聞いてきます。OSがWinXPなら既定のフォルダは
C:\Program Files\Microsoft Windows Script\ScriptDocs
ですので、そこから script56.chm だけをお好きな所にコピーします。
他のものに用は無いので、コントロールパネルからアンインストールしてください。
または解凍ソフトをインストールして
http://win.just4fun.biz/WSH/WSH%E3%81%AE%E3%83%98%E3%83%AB%E3%83%97%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E5%85%A5%E6%89%8B%E6%96%B9%E6%B3%95.html
にて。

Excel2003(Office2003)は持ち合わせていないので、2002の場合なら・・
VBE上で
for i = 1 to 2
msgbox ""
next i
となっていたら、for の所にカーソルを持って行って、F1 キーを押せば
該当すると思われるものがピックアップされます。
あるいは、For まで打ち込んで、F1 とか
イミディエイトウィンドウ(Ctrl + G で出現)で、For まで打ち込んで、F1 とか
2002なら
---------------------
For キーワード
キーワード For は、次の構文で使用します。
For...Next ステートメント
For Each...Next ステートメント
...続きを読む


人気Q&Aランキング

おすすめ情報