Board logo

標題: [發問] 有關CSV檔的問題(已解決) [打印本頁]

作者: icestormer    時間: 2012-4-19 10:27     標題: 有關CSV檔的問題(已解決)

本帖最後由 icestormer 於 2012-4-27 10:00 編輯

'將工作表的內容儲存為CSV格式檔案
Sub WriteCsv()
    Dim myTxtFile As String, myFNo As Integer
    Dim myLastRow As Long, i As Long
      
    Application.ScreenUpdating = False
   
    myTxtFile = ActiveWorkbook.Path & "\Numazu.csv"
   
    Worksheets("郵遞區號2").Activate
    myLastRow = Range("A1").CurrentRegion.Rows.Count
   
    myFNo = FreeFile
    Open myTxtFile For Output As #myFNo
   
                     For i = 1 To myLastRow
                                                   Write #myFNo, Cells(i, 1), Cells(i, 2), Cells(i, 3), _
                                                                                    Cells(i, 4), Cells(i, 5), Cells(i, 6)
                    Next  

                     Close #myFNo            
    MsgBox "「郵遞區號2」工作表內的資料將建立為「Numazu.csv」檔案。"
End Sub
=========================================================================
請問 紅字部份程式碼 有沒有什麼法子可以使用雙迴圈且可以正確顯示成如下述的樣子?

如果資料是長這樣:
A              B            C              D
-----------------------------------------
都市     支局      區號     5碼區號
高雄     高2        200        20058
-----------------------------------------
能否用雙迴圈方式 ,讀取資料後>開打CSV檔 ,資料還是會保持上述的形態??

我自己用雙迴圈不管怎試都會變成
A           B         C                D
--------------------------------------
都市
支局
區號
5碼區號
高雄
高2
200
20058


由於資料可能多達 2 3X個以上 如果不能使用雙迴圈..就得像範列中那一樣要寫入幾個資料就得手動寫幾個CELLS才行了  不知有沒有其它更高的方式也能達成?
作者: c_c_lai    時間: 2012-4-19 10:58

回復 1# icestormer
問題是出在 Write 上, 當它寫完一筆,就自動送出一個 LineFeed/Carriage Reutn (0D/0A)
我不熟悉 VBA 的 Write 的尾端能否有 ";" 的 表達方式。
作者: icestormer    時間: 2012-4-19 11:07

回復 2# c_c_lai


  謝 所以你的意思是 由於 沒有斷行 才會導致全部資料變成同一列??
作者: c_c_lai    時間: 2012-4-19 11:28

回復 3# icestormer
For i = 1 To myLastRow
    Write #myFNo, Cells(i, 1), Cells(i, 2), Cells(i, 3), _
           Cells(i, 4), Cells(i, 5), Cells(i, 6)
Next  

執行後會是如下結果:
-----------------------------------------
都市     支局      區號     5碼區號
高雄     高2        200        20058
-----------------------------------------

如果改寫成雙迴圈模式:

For i = 1 To myLastRow
    For j = 1 To 6
        Write #myFNo, Cells(i, j)
    Next j
Next i

其結果會是:
--------------------------------------
都市
支局
區號
5碼區號
高雄
高2
200
20058
--------------------------------------

您可以試試能否 (VBA) 使用 Write #myFNo, Cells(i, j) ; 的方式撰寫,
j 迴圈結束後,接著再送出一個 Line Feed (\n)
(這是 C 語言的寫法,不知 VBA 可行否?)。
作者: chen_cook    時間: 2012-4-19 14:55

回復 1# icestormer


    不好意思,真的看不懂你要什麼,若是單純轉存.csv檔,在excel中另存成為.csv就好了不是嗎??
作者: chen_cook    時間: 2012-4-19 15:02

For i = 1 To myLastRow
                                                  ' Write #myFNo, Cells(i, 1), Cells(i, 2), Cells(i, 3), _
                                                                                    Cells(i, 4), Cells(i, 5), Cells(i, 6)
                                                  Write #myFNo, Cells(i, 1) &"," & Cells(i, 2) &"," & Cells(i, 3) &"," & _
                                                                                    Cells(i, 4) &"," & Cells(i, 5) &"," & Cells(i, 6)

                    Next  
還是因csv是採","為分界 ,與它有關嗎??
作者: icestormer    時間: 2012-4-19 19:42

For i = 1 To myLastRow
                                                  ' Write #myFNo, Cells(i, 1 ...
chen_cook 發表於 2012-4-19 15:02



    ' Write #myFNo, Cells(i, 1), Cells(i, 2), Cells(i, 3), _
                                                                                    Cells(i, 4), Cells(i, 5), Cells(i, 6)
                                                  Write #myFNo, Cells(i, 1) &"," & Cells(i, 2) &"," & Cells(i, 3) &"," & _
                                                                                    Cells(i, 4) &"," & Cells(i, 5) &"," & Cells(i, 6)

目前就是想把EXCEL中的資料轉存成CSV檔 這動作也沒有問題 例如 資料行有100行我就得設 cells(i,1)~~~cells(i,100) 我想採雙迴圈或陣列還是有其它高明的方法 不用從1設到100
遇到的問題是 如果我採用雙迴圈 就會導致我開頭說的那行 全部資料都變成同一列了...
作者: Hsieh    時間: 2012-4-19 20:06

回復 7# icestormer
  1. Sub nn()
  2. CSVText = ThisWorkbook.Path & "\MyCSV.csv"
  3. ar = Range("A1").CurrentRegion.Value
  4. Open CSVText For Output As #1
  5. For i = 1 To UBound(ar, 1)
  6. mystr = Join(Application.Index(ar, i), ",")
  7. Print #1, mystr
  8. Next
  9. Close #1
  10. End Sub
複製代碼

作者: icestormer    時間: 2012-4-19 22:51

本帖最後由 icestormer 於 2012-4-19 23:04 編輯

回復 8# Hsieh


感謝 版主  那程式碼可以順利執行 ^^

另外想請問 大家 另一個問題 如果我想設計一個密碼更新的巨集 ,也都會成功執行完成(有更新成功),
但我發現 好像必需要把密碼的值存在工作表上的儲存格上,並存檔後 才能有作用
不然只要我關掉程式 就=沒更新了 還是 原本 就是要把密碼儲存在某一個工作表上了?




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)