Excel VBA質問箱 IV

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

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


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

【21684】csvからエクセルファイルへの貼り付けについて Aiz 05/1/26(水) 19:08 質問[未読]
【21686】Re:csvからエクセルファイルへの貼り付けについて りすりす 05/1/26(水) 20:59 発言[未読]
【21689】Re:csvからエクセルファイルへの貼り付けについて Aiz 05/1/26(水) 21:46 発言[未読]
【21688】Re:csvからエクセルファイルへの貼り付けについて ichinose 05/1/26(水) 21:36 発言[未読]
【21699】解決 Aiz 05/1/27(木) 14:03 お礼[未読]

【21684】csvからエクセルファイルへの貼り付けについて
質問  Aiz  - 05/1/26(水) 19:08 -

引用なし
パスワード
   お世話になります。
csvファイルを読み込んで、エクセルファイルに貼り付ける処理で疑問ができましたので、質問します。
まずデータから
Aという処理を行うときに出力されるH.csvには4つのタイプが存在します。
(1)東京    現像
(2)東京       ←後ろが空白
(3)      現像  ←前が空白
(4)         ←どちらも空白

ソースはこちらで...↓
Const csv1 = "H.csv"
Const csv2 = "B.csv"

Sub Auto_Open()
  Dim fname As String
  Dim fno As Integer
  Dim col(0 To 18) As Variant
  Dim i As Integer
  Dim sts As String
  
  'ファイル名
  fname1 = ActiveWorkbook.Path & "\" & csv1
  fname2 = ActiveWorkbook.Path & "\" & csv2
  
  'CSVファイルの内容を貼り付ける(ヘッダ部)
  fno = FreeFile
  On Error GoTo file_not_found
  Open fname1 For Input As #fno
  On Error GoTo 0
  If EOF(fno) = False Then
    '一旦String型で受けてVariant型に入れなおす
    For i = 0 To 1
      Input #fno, sts
      col(i) = sts
    Next
    
    Range(Cells(2, 19), Cells(2, 20)).Value = col
  End If
  Close #fno
  
(中略)
  
  Exit Sub
  
End Sub

現状のソースでは(1)の場合は処理が正常に行われるのですが、(2)、(3)、(4)の場合「ファイルにこれ以上データがありません」というエラーが表示されます。
これはAの処理の場合でして、Bの処理では最初からH.csvに1つしかデータがないものもあります。
  
  If EOF(fno) = False Then
    '一旦String型で受けてVariant型に入れなおす
    Input #fno, sts
    col(0) = sts
    
    Cells(2, 6).Value = col(0)
  End If

Bのようにデータが1つしか存在しない処理の場合は↑のような書き方で処理が行われる(値が入っていないときもエクセルファイルには空白のままで出力してくれる)のですが、Aの処理がどうしてもわかりません。
お手数ですが、どなたかお力を貸してください。

【21686】Re:csvからエクセルファイルへの貼り付けについて
発言  りすりす  - 05/1/26(水) 20:59 -

引用なし
パスワード
   ▼Aiz さん:
>お世話になります。
>csvファイルを読み込んで、エクセルファイルに貼り付ける処理で疑問ができましたので、質問します。
>まずデータから
>Aという処理を行うときに出力されるH.csvには4つのタイプが存在します。
>(1)東京    現像
>(2)東京       ←後ろが空白
>(3)      現像  ←前が空白
>(4)         ←どちらも空白


csvファイルは、コンマで ,  区切られたデータですので
空白を区切りとするのなら
それようの処理をしないといけないと思いますよ。

Splitを 参照ください。

【21688】Re:csvからエクセルファイルへの貼り付けについて
発言  ichinose  - 05/1/26(水) 21:36 -

引用なし
パスワード
   ▼Aiz さん:
こんばんは。

>お世話になります。
>csvファイルを読み込んで、エクセルファイルに貼り付ける処理で疑問ができましたので、質問します。
>まずデータから
>Aという処理を行うときに出力されるH.csvには4つのタイプが存在します。
csvファイルというのですから、本来は(メモ帳等で開くと)、
>(1)東京    現像
↑ 東京,現像
>(2)東京     ←後ろが空白
↑ 東京,
>(3)      現像  ←前が空白
↑ ,現像
>(4)         ←どちらも空白
↑  , 

となっているはずなんですが・・・。
メモ帳等を使用して開いて確認して下さい。
で、(2)、(3)、(4)で「ファイルにこれ以上データがありません」というエラーが発生する
ことから想像すると、
(2)は、東京
(3)は、現像
(4)は、空白
となっていることが考えられますが・・・・。

これ、H.cvsというファイルは、Excelでcsv形式で保存しているのですか?

例えば、
    A     B
1 (未入力)   現像

というセルB1のみにデータ設定されたシートをCSV形式で保存しても
 ,現像
とはなりません。

現像

となってしまいます。

解決方法としては、
ひとつは、
 読込を
 Openステートメントでオープン
 Inputステートメントで読込
という手順で行っていますよね。
 csvの作成も
 OPENステートメントでオープン
 Print # ステートメントで書き込み(カンマ区切りで)

というようにご自分でCVS形式のファイルを作成する方法。

もうひとつは、

    A     B
1 (未入力)   現像
2  END     END

というように2行目(データの最終行)にダミーのデータを入れておいて
Excelでcsv形式で保存する。

この場合、
1行目は、
,現像
となります。

なんて方法が思いつきましたが・・・・。
検討してみて下さい。


>
>ソースはこちらで...↓
>Const csv1 = "H.csv"
>Const csv2 = "B.csv"
>
>Sub Auto_Open()
>  Dim fname As String
>  Dim fno As Integer
>  Dim col(0 To 18) As Variant
>  Dim i As Integer
>  Dim sts As String
>  
>  'ファイル名
>  fname1 = ActiveWorkbook.Path & "\" & csv1
>  fname2 = ActiveWorkbook.Path & "\" & csv2
>  
>  'CSVファイルの内容を貼り付ける(ヘッダ部)
>  fno = FreeFile
>  On Error GoTo file_not_found
>  Open fname1 For Input As #fno
>  On Error GoTo 0
>  If EOF(fno) = False Then
>    '一旦String型で受けてVariant型に入れなおす
>    For i = 0 To 1
>      Input #fno, sts
>      col(i) = sts
>    Next
>    
>    Range(Cells(2, 19), Cells(2, 20)).Value = col
>  End If
>  Close #fno
>  
>(中略)
>  
>  Exit Sub
>  
>End Sub
>
>現状のソースでは(1)の場合は処理が正常に行われるのですが、(2)、(3)、(4)の場合「ファイルにこれ以上データがありません」というエラーが表示されます。
>これはAの処理の場合でして、Bの処理では最初からH.csvに1つしかデータがないものもあります。
>  
>  If EOF(fno) = False Then
>    '一旦String型で受けてVariant型に入れなおす
>    Input #fno, sts
>    col(0) = sts
>    
>    Cells(2, 6).Value = col(0)
>  End If
>
>Bのようにデータが1つしか存在しない処理の場合は↑のような書き方で処理が行われる(値が入っていないときもエクセルファイルには空白のままで出力してくれる)のですが、Aの処理がどうしてもわかりません。
>お手数ですが、どなたかお力を貸してください。

【21689】Re:csvからエクセルファイルへの貼り付けについて
発言  Aiz  - 05/1/26(水) 21:46 -

引用なし
パスワード
   ▼りすりす さん:
レスありがとうございます。

>>(1)東京    現像
>>(2)東京       ←後ろが空白
>>(3)      現像  ←前が空白
>>(4)         ←どちらも空白

このcsvファイルはAccessVBAで操作して作ったファイルでして、エクセルで開くとセルごとに区切られてますが、テキストエディタで開くと(1)でしたら「東京,現像」となってます。
(2)、(3)、(4)もそれぞれ「東京,」「,現像」「,」としたいのですが、出力するときに空白の状態だとカンマで区切られないみたいです。それで今のソースだとデータがないとエラーがでてしまうみたいです。
ためしに「東京, 」とカンマの後にスペースを入れて
If EOF(fno) = False Then
    '一旦String型で受けてVariant型に入れなおす
      Input #fno, sts, sts2
      col(0) = sts
      col(1) = sts2
    Range(Cells(2, 19), Cells(2, 20)).Value = col
  End If
こういう感じに書き直してみたら出力されました。
AccessVBAで操作しているんですが、csvを作るときにスペースを入れるようにすれば大丈夫な気がしてきました。
今自宅なので確認できませんが、明日試してみます。
そのときに正式なお礼をしますので、よろしくです。
レスありがとうございます。

【21699】解決
お礼  Aiz  - 05/1/27(木) 14:03 -

引用なし
パスワード
   無事解決いたしました。
助言してくださった方々ありがとうございます。

結論をいえばCSVの作り方が悪かったみたいです。

こんな感じにしてみました
エクセルを操作するAccessVBAでのソースです。

  'csvファイル作成(ヘッダ部)
  intFNO = FreeFile()
  Open getCsvDirectoryH() & "H.csv" For Output As #intFNO
  
  '事業所コードがNullか""のチェック
  If IsNull(varCode) Or varCode = "" Then
    '事業所コードがNullと""のとき空白で出力
    strBuff = ""
    Print #intFNO, strBuff
    
    '商品種別コードがNullか""のチェック
    If IsNull(varCode2) Or varCode2 = "" Then
      '商品種別コードがNullと""のとき空白で出力
      strBuff2 = ""
      Print #intFNO, strBuff2
    Else
(中略)      
    End If
  Else
    '商品種別コードがNullか""のチェック
    If IsNull(varCode2) Or varCode2 = "" Then
(中略)
    Else
      '事業所コードと商品種別コードが入力されている場合
      Set RS = CurrentDb.OpenRecordset("select * from V商品 where 事業所コード = " & varCode & " and 商品種別コード = " & varCode2 & " ")
      RS.MoveFirst
      
      If RS.RecordCount > 0 Then
        strBuff = RS.Fields("事業所名")
        strBuff2 = RS.Fields("商品種別名")
      Else
        strBuff = ""
        strBuff2 = ""
      End If
      Print #intFNO, strBuff
      Print #intFNO, strBuff2
      RS.Close
    End If
  End If
  Close #intFNO

エラーが出ていた原因は、Nullや空白の場合、Print #intFNOだけしか書いてなかったので、Nullや空白のときはstrBuff = ""と入力するようにしました。
これで(1)(2)(3)(4)の全パターンに対応できました。
(↑のソースでは(2)(3)のパターン省きましたが^^;)

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

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