アプリ版:「スタンプのみでお礼する」機能のリリースについて

EXCEL VBAでテキストファイルを読み込み、Spirit関数にて項目内容を書き出しています。

下記のコードの日付部分は1日~31日まで繰り返しになります。

Dim maxRow As Integer
Dim maxCol As Integer
Dim i As Long
Dim mytxtfile As String, myStr As String
Dim myRange As Range
Dim mySp() As String
Dim sh1 As Worksheet

On Error GoTo myError
mytxtfile = "D:\明細.TXT"

Set sh1 = Worksheets("元データ")
Set myRange = sh1.Range("A1")
sh1.Cells.Clear
Open mytxtfile For Input As #1
Do Until EOF(1)
Line Input #1, myStr
myRange.Offset(i, 0).Value = myStr
myStr = Replace(myStr, """", "")
mySp = Split(myStr, ",")

myRange.Offset(i, 1).Value = mySp(0) '卸名
myRange.Offset(i, 2).Value = mySp(1) 'コード
myRange.Offset(i, 3).Value = mySp(2) 'フラグ
myRange.Offset(i, 4).Value = mySp(6) '納品先
myRange.Offset(i, 5).Value = mySp(7) '店舗
myRange.Offset(i, 6).Value = mySp(23) '日付
---------ここから
myRange.Offset(i, 7).Value = mySp(26) '1日_金額A
myRange.Offset(i, 8).Value = mySp(27) '1日_金額B
myRange.Offset(i, 9).Value = mySp(34) '1日_金額C
--------ここまでが 1日分です。これが31日まで続きます。

i = i + 1
Loop
Close #1
'31日までのデータが無い場合のエラーを無視する(データが存在する日まで書き出す)
myError:
Resume Next
sh1.Range("A:A").Delete 'txt取込作業列を削除
End Sub

カンマ区切りの位置は、15ずつ増えますので
繰り返し処理したいのですが、うまくいきません。

最初は、金額A だけの書き出しだったため、
1行ずつ書いていたのですが、金額B、Cの列も必要になりました。
for next で すっきりした書き方を教えていただけないでしょうか?
宜しくお願い致します。

A 回答 (1件)

kochimaru06 さん


こんにちは。

以下、修正してみました。ご確認下さい。
※見やすくするため、勝手に命令を変更しました。

  Dim maxCol As Integer
  Dim I As Long
  Dim J As Long
  Dim mytxtfile As String, myStr As String
  Dim myRange As Range
  Dim mySp() As String
  Dim sh1 As Worksheet
  
  Set sh1 = Worksheets("元データ")
  Set myRange = sh1.Cells
  myRange.Clear
  Open mytxtfile For Input As #1
  Do Until EOF(1)
    Line Input #1, myStr
    I = I + 1
    myRange(I, "A") = myStr
    myStr = Replace(myStr, """", "")
    mySp = Split(myStr, ",")
  
    myRange(I, "B") = mySp(0) '卸名
    myRange(I, "C") = mySp(1) 'コード
    myRange(I, "D") = mySp(2) 'フラグ
    myRange(I, "E") = mySp(6) '納品先
    myRange(I, "F") = mySp(7) '店舗
    myRange(I, "G") = mySp(23) '日付
  
    For J = 0 To 30
      On Error Resume Next
      myRange(I, 8 + J * 3) = mySp(26 + J * 15) '1~31日_金額A
      myRange(I, 9 + J * 3) = mySp(27 + J * 15) '1~31日_金額B
      myRange(I, 10 + J * 3) = mySp(34 + J * 15) '1~31日_金額C
      On Error GoTo 0
    Next J
  Loop
  sh1.Range("A:A").Delete 'txt取込作業列を削除
End Sube
    • good
    • 0
この回答へのお礼

jcctairaさん、ありがとうございました。
希望どおりの結果が得られました。

EXCEL2003使用の為、元データが列のMAXを超えるので
A列に一旦入れて、Split関数を使用して書き出す方法を取りました。
色々と調べて参考にしたコードがDo Loop 使用だったのに、
For Nextで質問してしまい、回答をいただけないかもと不安でした。
(質問を書き直すことが出来なかったので…。)

myRange(I, 8 + J * 3) = mySp(26 + J * 15) '1~31日_金額A

J*3 J*15 の部分は、J*4 J*15 でも試して確認してみて、
何となく雰囲気がつかめた気がします。
繰り返し処理が、どうしても苦手で…。
避けれないことは分かっているので、少しずつでも理解できる様に頑張ります。

また、Cellsプロパティの列番号は、"A" の様にも指定できたのですね。
とても見やすいので、これからはこちらの方法を使用したいと思います。

本当にありがとうございました。

お礼日時:2014/03/12 23:58

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