Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


6741 / 13644 ツリー ←次へ | 前へ→

【43367】CSVに書き込みをする際のスペースの除... 超初心者 06/10/11(水) 20:45 質問[未読]
【43368】Re:CSVに書き込みをする際のスペースの... ichinose 06/10/11(水) 21:39 発言[未読]
【43371】Re:CSVに書き込みをする際のスペースの... 超初心者 06/10/11(水) 22:38 質問[未読]
【43374】Re:CSVに書き込みをする際のスペースの... ichinose 06/10/12(木) 6:50 発言[未読]
【43376】Re:CSVに書き込みをする際のスペースの... [名前なし] 06/10/12(木) 10:55 お礼[未読]
【43382】Re:CSVに書き込みをする際のスペースの... ハチ 06/10/12(木) 15:22 お礼[未読]
【43404】Re:CSVに書き込みをする際のスペースの... 超初心者 06/10/13(金) 10:48 質問[未読]
【43415】Re:CSVに書き込みをする際のスペースの... 超初心者 06/10/13(金) 16:39 質問[未読]
【43417】Re:CSVに書き込みをする際のスペースの... ichinose 06/10/13(金) 18:12 発言[未読]
【43421】Re:CSVに書き込みをする際のスペースの... 超初心者 06/10/13(金) 20:27 お礼[未読]

【43367】CSVに書き込みをする際のスペースの除...
質問  超初心者  - 06/10/11(水) 20:45 -

引用なし
パスワード
   下記の記述でCSVに書き込みをすると、全角文字の場合は例えば、「文字,文字」となるのですが、半角文字の場合は例えば、「 1 , 2 , 3 ,」のように半角文字の左右にスペースがついてしまいます。色々と元のデータの書式とか調べてみましたが、どうも記述文に原因があるようですが一向にわかりません。スペースを取り除いて「1,2,3,」のようにするにはどのような方法がありますでしょうか?宜しくお願いします。

  Dim myPath As String
  Dim N As Integer
  Dim j As Integer
  Dim LastRow As Long
  Dim LastColumn As Integer
  
  myPath = ThisWorkbook.Path & "C:\test.csv"
  N = FreeFile
  
  Open "C:\test.csv" For Output As #N
  
    With Worksheets("sheet1")
      LastColumn = .Cells(1, Columns.Count).End(xlToLeft).Column
      Print #N, .Cells(1, 1).Value;
      For j = 2 To LastColumn
        Print #N, ","; .Cells(1, j).Value;
      Next
      Print #N, ""
    End With
  Close #N

【43368】Re:CSVに書き込みをする際のスペース...
発言  ichinose  - 06/10/11(水) 21:39 -

引用なし
パスワード
   ▼超初心者 さん:
こんばんは。

>下記の記述でCSVに書き込みをすると、全角文字の場合は例えば、「文字,文字」となるのですが、半角文字の場合は例えば、「 1 , 2 , 3 ,」のように半角文字の左右にスペースがついてしまいます。
これは、そうなりますよ!!
半角の数字の時ですね?
数値を 例えば

Print #N, 4; 5

のようにした場合は4と5の前後に空白が埋められます。
そうしないと読み込む時に読み込めなくなってしまいますから・・・。
(この意味は考えてみてください)
まっ、仕様と解釈してください。

簡単なのはTrim関数でも付けとけばOKです。
>
>  Dim myPath As String
>  Dim N As Integer
>  Dim j As Integer
>  Dim LastRow As Long
>  Dim LastColumn As Integer
>  
>  myPath = ThisWorkbook.Path & "C:\test.csv"
>  N = FreeFile
>  
>  Open "C:\test.csv" For Output As #N
>  
>    With Worksheets("sheet1")
>      LastColumn = .Cells(1, Columns.Count).End(xlToLeft).Column
      Print #N, Trim(.Cells(1, 1).Value);
      For j = 2 To LastColumn
        Print #N, ","; Trim(.Cells(1, j).Value);
      Next
>      Print #N, ""
>    End With
>  Close #N

ですが、私はよくこういうコードを書きます。

Sub main()
  Dim myPath As String
  Dim N As Integer
  Dim myarray As Variant
  myPath = ThisWorkbook.Path & "\test.csv"
  N = FreeFile
  Open myPath For Output As #N
  With Worksheets("sheet1")
    myarray = Application.Transpose(Application.Transpose( _
         .Range(.Cells(1, 1), .Cells(1, .Columns.Count).End(xlToLeft)).Value))
    End With
  Print #N, Join(myarray, ",")
  Close #N
End Sub

【43371】Re:CSVに書き込みをする際のスペース...
質問  超初心者  - 06/10/11(水) 22:38 -

引用なし
パスワード
   早速ありがとうございます。
教えていただいた記述では、確かにスペースが取り除かれていましたが、それを単純に繰り返したら、当然でしょうがエラーが出ました。
以下同じように、test3 から test6 としても駄目ですね? 行いたい処理のイメージを下記に記しましたが、対応方法がわかりませんので教えていただければ幸いです。宜しくお願いします。

With Worksheets("test1")
    myarray = Application.Transpose(Application.Transpose( _
         .Range(.Cells(1, 1), .Cells(1, .Columns.Count).End(xlToLeft)).Value))
    End With
  Print #N, Join(myarray, ",")
With Worksheets("test2")
    myarray = Application.Transpose(Application.Transpose( _
         .Range(.Cells(1, 1), .Cells(1, .Columns.Count).End(xlToLeft)).Value))
    End With
  Print #N, Join(myarray, ",")    ← エラー箇所


下記の6シートのデータ位置は
test1  A1からG1にデータ
test2  A1にデータ
test3  B1にデータ
test4  A1からG1にデータ
test5  A1にデータ
test6  A1からAM1にデータ

CSVのイメージは(例)
1,2,3,あ,い,6,7
あ,
,3
1,2,3,あ,い,6,7
1,2,3,あ,・・・・・・2

記述した下記の構文は、当然にスペースがつきます・

  Dim myPath As String
  Dim N As Integer
  Dim j As Integer
  Dim LastRow As Long
  Dim LastColumn As Integer
  
  myPath = ThisWorkbook.Path & "C:\test.csv"
  N = FreeFile
  
  Open "test.csv" For Output As #N
  
    With Worksheets("test1")
      LastColumn = .Cells(1, Columns.Count).End(xlToLeft).Column
      Print #N, .Cells(1, 1).Value;
      For j = 2 To LastColumn
        Print #N, ","; .Cells(1, j).Value;
      Next
      Print #N, ""
    End With
  
以下、test2 から test5 があります。
  
    With Worksheets("test6")
    LastRow = .Cells(Rows.Count, 1).End(xlUp).Row
    For i = 1 To LastRow
      Print #N, .Cells(i, 1).Value;
      For j = 2 To 39
        Print #N, ","; .Cells(i, j).Value;
      Next
      Print #N, ""
    Next
  End With
  
  Close #N

【43374】Re:CSVに書き込みをする際のスペース...
発言  ichinose  - 06/10/12(木) 6:50 -

引用なし
パスワード
   ▼超初心者 さん:
おはようございます。

>
>With Worksheets("test1")
>    myarray = Application.Transpose(Application.Transpose( _
>         .Range(.Cells(1, 1), .Cells(1, .Columns.Count).End(xlToLeft)).Value))
>    End With
>  Print #N, Join(myarray, ",")
>With Worksheets("test2")
>    myarray = Application.Transpose(Application.Transpose( _
>         .Range(.Cells(1, 1), .Cells(1, .Columns.Count).End(xlToLeft)).Value))
>    End With
>  Print #N, Join(myarray, ",")    ← エラー箇所
このエラーの詳細も次回からは記述してください。
「型が一致しません」ではありませんでしたか?

>
>下記の6シートのデータ位置は
>test1  A1からG1にデータ
>test2  A1にデータ
>test3  B1にデータ
>test4  A1からG1にデータ
>test5  A1にデータ
>test6  A1からAM1にデータ
>
>CSVのイメージは(例)
>1,2,3,あ,い,6,7
>あ,
>,3
>1,2,3,あ,い,6,7
>1,2,3,あ,・・・・・・2
今回は、↑この記述があったので何となく、原因がわかりましたけど、
ひとつでも情報は多いほうが良いですよ!!
でも、この記述(入力データと出力データの記述)をされたことが
質問内容を非常に分かりやすくしていますよ!!
私は、こういう記述は良いと思いますけどね。


'=================================
Sub main2()
  Dim idx As Long
  Dim myPath As String
  Dim N As Integer
  Dim myarray As Variant
  myPath = ThisWorkbook.Path & "\test.csv"
  N = FreeFile
  Open myPath For Output As #N
  For idx = 1 To 6
    With Worksheets("test" & idx)
     myarray = Application.Transpose(Application.Transpose( _
           .Range(.Cells(1, 1), .Cells(1, .Columns.Count).End(xlToLeft)).Value))
     End With
    If TypeName(myarray) <> "Variant()" Then
     '配列でない場合、強制的に配列を作成する
     myarray = Array(myarray)
     End If
    Print #N, Join(myarray, ",")
    Next
  Close #N
End Sub

これで試してみてください。

【43376】Re:CSVに書き込みをする際のスペース...
お礼  [名前なし]  - 06/10/12(木) 10:55 -

引用なし
パスワード
   ▼ichinose さん:
▼ichinose さん:
おはようございます。試してみたところ、うまくいきました。大変にありがとうございます。構文は、まださっぱりわかりませんが、ひとつひとつこれから調べてみるつもりです。凄いですね・・・・。

【43382】Re:CSVに書き込みをする際のスペース...
お礼  ハチ  - 06/10/12(木) 15:22 -

引用なし
パスワード
   ▼ichinose さん:
>myarray = Application.Transpose(Application.Transpose( _
>.Range(.Cells(1, 1), .Cells(1, .Columns.Count).End(xlToLeft)).Value))

こちらの質問の内容とは関係ありませんが。

Application.Transposeを2回重ねることで、
行方向のRangeのデータを1次配列に入れることができるんですね!
普通にRangeのデータを取得しようとすると2次配列になってしまい
ループを回して1セルづつ入れていたので、勉強になりました^^

【43404】Re:CSVに書き込みをする際のスペース...
質問  超初心者  - 06/10/13(金) 10:48 -

引用なし
パスワード
   ▼ichinose さん:
度々すみません。質問する時にひとつ間違っていました。下記の「test6  A1からAM1にデータ」と書きましたが、実際には列数はA〜AM列に限定してデータはあるのですが、データ行は不確定です。1行に場合も有りますし、50行になる場合もあります。
「With Worksheets("test" & idx)
     myarray = Application.Transpose(Application.Transpose( _
           .Range(.Cells(1, 1), .Cells(1, .Columns.Count).End(xlToLeft)).Value))
     End With」の最後の「Cells(1,」の部分はどのように変数を組み合わせて記述すればいいのでしょうか?本当に申し訳ありません。ちなみに、A列は、どの行も数値(22007041)が必ず入力されています。宜しくお願いいたします。 


>>下記の6シートのデータ位置は
>>test1  A1からG1にデータ
>>test2  A1にデータ
>>test3  B1にデータ
>>test4  A1からG1にデータ
>>test5  A1にデータ
>>test6  A1からAM1にデータ
>>
>>CSVのイメージは(例)
>>1,2,3,あ,い,6,7
>>あ,
>>,3
>>1,2,3,あ,い,6,7
>>1,2,3,あ,・・・・・・2
>
>
>'=================================
>Sub main2()
>  Dim idx As Long
>  Dim myPath As String
>  Dim N As Integer
>  Dim myarray As Variant
>  myPath = ThisWorkbook.Path & "\test.csv"
>  N = FreeFile
>  Open myPath For Output As #N
>  For idx = 1 To 6
>    With Worksheets("test" & idx)
>     myarray = Application.Transpose(Application.Transpose( _
>           .Range(.Cells(1, 1), .Cells(1, .Columns.Count).End(xlToLeft)).Value))
>     End With
>    If TypeName(myarray) <> "Variant()" Then
>     '配列でない場合、強制的に配列を作成する
>     myarray = Array(myarray)
>     End If
>    Print #N, Join(myarray, ",")
>    Next
>  Close #N
>End Sub
>
>これで試してみてください。

【43415】Re:CSVに書き込みをする際のスペース...
質問  超初心者  - 06/10/13(金) 16:39 -

引用なし
パスワード
   ▼超初心者 さん:
▼ichinose さん:

下のような感じでよろしいでしょうか?よろしくお願いします。

Sub main2()

  Dim idx As Long
  Dim myPath As String
  Dim N As Integer
  Dim myarray As Variant
  myPath = ThisWorkbook.Path & "\test.csv"
  N = FreeFile
  Open myPath For Output As #N
  For idx = 1 To 5
    With Worksheets("test" & idx)
     
          myarray = Application.Transpose(Application.Transpose( _
           .Range(.Cells(1, 1), .Cells(1, .Columns.Count).End(xlToLeft)).Value))
     End With
    If TypeName(myarray) <> "Variant()" Then
     '配列でない場合、強制的に配列を作成する
     myarray = Array(myarray)
     End If
    Print #N, Join(myarray, ",")
    Next
k = 1
    Do While Cells(k, 1) > "1"
   
    With Worksheets("test6")
          myarray = Application.Transpose(Application.Transpose( _
           .Range(.Cells(k, 1), .Cells(k, .Columns.Count).End(xlToLeft)).Value))
     End With
    If TypeName(myarray) <> "Variant()" Then
     '配列でない場合、強制的に配列を作成する
     myarray = Array(myarray)
     End If
    Print #N, Join(myarray, ",")
    k = k + 1
  Loop


  Close #N

   Call 社保提出FD作成メッセージ

End Sub

【43417】Re:CSVに書き込みをする際のスペース...
発言  ichinose  - 06/10/13(金) 18:12 -

引用なし
パスワード
   ▼超初心者 さん:
こんばんは。

>下のような感じでよろしいでしょうか?よろしくお願いします。
良いと思いますよ!!
>
>Sub main2()
>
>  Dim idx As Long
>  Dim myPath As String
>  Dim N As Integer
>  Dim myarray As Variant
>  myPath = ThisWorkbook.Path & "\test.csv"
>  N = FreeFile
>  Open myPath For Output As #N
>  For idx = 1 To 5
>    With Worksheets("test" & idx)
>     
>          myarray = Application.Transpose(Application.Transpose( _
>           .Range(.Cells(1, 1), .Cells(1, .Columns.Count).End(xlToLeft)).Value))
>     End With
>    If TypeName(myarray) <> "Variant()" Then
>     '配列でない場合、強制的に配列を作成する
>     myarray = Array(myarray)
>     End If
>    Print #N, Join(myarray, ",")
>    Next
   k = 1
  Do until Cells(k, 1).value=""
'よくこういう条件でループさせますけどね
'Valueというプロパティは付けるようにしてください
'ここでは、付けている方が圧倒的に多いですよ!!
>   
>    With Worksheets("test6")
>          myarray = Application.Transpose(Application.Transpose( _
>           .Range(.Cells(k, 1), .Cells(k, .Columns.Count).End(xlToLeft)).Value))
>     End With
>    If TypeName(myarray) <> "Variant()" Then
>     '配列でない場合、強制的に配列を作成する
>     myarray = Array(myarray)
>     End If
>    Print #N, Join(myarray, ",")
>    k = k + 1
>  Loop
>
>
>  Close #N
>
>   Call 社保提出FD作成メッセージ
>
>End Sub

【43421】Re:CSVに書き込みをする際のスペース...
お礼  超初心者  - 06/10/13(金) 20:27 -

引用なし
パスワード
   ▼ichinose さん:

わかりました。大変にありがとうございます。これからもよろしくお願いします。

6741 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free