Đăng ký học Excel, VBA và phân tích số liệu cùng GPE tháng 1/2018 - TPHCM

Mua sách "VBA trong Excel - Cải thiện và tăng tốc" tái bản

tạo file txt bằng VBA

Thảo luận trong 'Khu vực đăng bài chung' bắt đầu bởi Jokerfly, 11 Tháng hai 2018.

  1. Jokerfly

    Jokerfly Thành viên mới

    cho mình hỏi có mình đang có dữ liệu trên 1 sheet excel mình mún tạo code tự tạo 1 file txt và lưu dữ liệu của sheet đó vào file txt vừa tạo.
    mọi người giúp mình với
     
  2. Jokerfly

    Jokerfly Thành viên mới

    mình mò ra code rồi nhưng vứng cái file lưu ra không phải định dạng UTF-8 . mọi người giúp với

    Sub Export()
    Dim arr, I As Long
    Dim strPath As String
    strPath = Application.GetSaveAsFilename(FileFilter:= _
    "Text Files (*.txt), *.txt", Title:="Save Location")
    If strPath <> "False" Then
    Open strPath For Output As #1
    arr = Range("A1:G" & [A100].End(xlUp).Row)
    For I = 1 To UBound(arr)
    Print #1, arr(I, 1) & vbTab & arr(I, 2) & vbTab & arr(I, 3) & vbTab & arr(I, 4) & vbTab & arr(I, 5) & vbTab & arr(I, 6) & vbTab & arr(I, 7)
    Next I
    Close #1
    End If
    End Sub
     
  3. batman1

    batman1 Thành viên thường trực

    1. Định dạng bắt buộc phải UTF-8? Unicode không chấp nhận? Nếu thế thì phải chuyển từ unicode sang UTF-8.
    2. Code của bạn thậm chí khi có vd. tiếng Việt thì sau khi ghi mất hết dấu
     
  4. giaiphap

    giaiphap .::(^_^)::.

    Bạn có thể dùng tạm code này. Việc còn lại là bạn chế biến nhé.
    Mã:
    Private Sub Export()
        Dim fso As Object, MyFile  As Object
        Dim FileName As String, I As Long
        Set fso = CreateObject("Scripting.FileSystemObject")
        FileName = "C:\Text.txt"
        Set MyFile = fso.CreateTextFile(FileName, True, True)
        MyFile.Write "Gia ð" & ChrW(236) & "nh gi" & ChrW(7843) & "i pháp Excel"
        MyFile.Close
    End Sub
    
     
  5. Jokerfly

    Jokerfly Thành viên mới

    1. nếu là Unicode vẫn được không nhất thiết là UTF-8
    2. Mình dùng cho tính chất công việc nên không sử dụng tiếng Việt nên không sợ vứng vấn đề này
    mình có xem tìm mãi k ra cách chuyển định dạng.
     
  6. batman1

    batman1 Thành viên thường trực

    Unicode thì sửa tí tẹo
    Mã:
    Sub Export()
    Dim arr, i As Long
    Dim strPath As String, s As String, m() As Byte
        strPath = Application.GetSaveAsFilename(FileFilter:= _
        "Text Files (*.txt), *.txt", Title:="Save Location")
        If strPath <> "False" Then
            arr = Range("A1:G" & [A100].End(xlUp).Row)
            For i = 1 To UBound(arr)
                s = s & IIf(i > 1, vbCrLf, "") & arr(i, 1) & vbTab & arr(i, 2) & vbTab & arr(i, 3) & vbTab & arr(i, 4) & vbTab & arr(i, 5) & vbTab & arr(i, 6) & vbTab & arr(i, 7)
            Next i
            m = s
            Open strPath For Binary As #1
            Put #1, , m
            Close #1
        End If
    End Sub
    
     
    befaintJokerfly thích bài viết này.
  7. Jokerfly

    Jokerfly Thành viên mới

    cảm ơn bạn rất nhiều . mình chưa hiểu đoạn code bạn thêm vào. bạn có thể vui lòng giải thích giúp mình dc k.
     
  8. batman1

    batman1 Thành viên thường trực

    Thì bạn so sánh 2 code thì thấy khác biệt thôi.
    Trong vòng lặp For code nối các mục thành 1 chuỗi duy nhất s.
    Bất kể cái gì trong bộ nhớ thực ra cũng chỉ là một chuỗi bai. Mỗi chuỗi văn bản được Excel "giữ" trong bộ nhớ ở dạng unicode - dạng các bai đại diện cho chuỗi unicode.
    Khi bạn có
    Mã:
    Dim s As string
    
    thì thực ra chỉ là đặt hàng 4 bai ở "chỗ đó chỗ đó" để ghi địa chỉ hiện hành của chuỗi s vào đấy. Tức:
    1. Ở đâu đó * trong RAM Excel chi ra 4 bai.
    2. Khi nhập giá trị vào s thì Excel sẽ ghi đủ n bai vào đâu đó ** trong RAM, n bai này là dạng của chuỗi unicode trong bộ nhớ. vd. chuỗi "ab". "a" và "b" có mã là 97 = &H61, 98 = &H62. Ở ** sẽ có 4 bai &H61, &H0, &H62, &H0
    3. địa chỉ ** sẽ được ghi vào 4 bai ở *
    Tức ở địa chỉ * trong bộ nhớ sẽ lưu địa chỉ hiện hành của chuỗi, tức **, ở trong bộ nhớ.
    Điạ chỉ * có thể đọc ra bằng hàm VarPtr, địa chỉ ** có thể đọc ra bằng hàm StrPtr
    Mã:
    Sub test()
    Dim s As String
        Debug.Print "Dia chi * = " & VarPtr(s)
    '    chua nhap gia tri, trong bo nho chua co chuoi s
        Debug.Print "Dia chi ** = " & StrPtr(s)
        s = "ab"
    '    trong bo nho da co chuoi
        Debug.Print "Dia chi ** = " & StrPtr(s)
    End Sub
    
    Dòng
    Mã:
    m = s
    
    là đưa tất cả các bai trong bộ nhớ tính từ địa chỉ ** vào mảng m. Chú ý là m được khai báo là mảng bai. Thế thôi.

    Sau đó ghi chuỗi bai trong m vào tập tin - ghi mã của các ký tự. Mở tập tin bất kỳ bằng Hex Editor thì nó hiển thị chính những mã của các ký tự. Tức những bai sẽ được nạp vào bộ nhớ khi đọc tập tin vào bộ nhớ.

    Tập tin được mở Fors Binary thay cho OutPut, và dùng Put thay cho Print
     
    Jokerflybefaint thích bài viết này.
  9. truongvu317

    truongvu317 Thành viên chính thức

    Uổi, có thể thể gán chuỗi tới mảng Byte, nhưng sao lại không gán được tới các loại mảng Long... anh nhỉ?
     
  10. batman1

    batman1 Thành viên thường trực

    Bạn viết thư hỏi anh Bill xem.

    Mà bạn định gán mảng mã các ký tự của chuỗi vào mảng Long để làm gì? Và sau khi gán thì ý nghĩa của mỗi Long ấy là gì?
     
    truongvu317 thích bài này.
  11. truongvu317

    truongvu317 Thành viên chính thức

    Em không biết email của anh ý, Chỉ là gán vào mảng byte thì không bị sao, các loại mảng khác nó bị lỗi, lỗi cú pháp luôn ý. Nếu chẳng may gắn được vào mảng Long thì 2 ký tự ta được một Long.
     
  12. truongvu317

    truongvu317 Thành viên chính thức

    Quên, định hỏi là gán vào mảng số nguyên, nhưng viết là in tơ gơ nó dài hơn là long. HỊ hị hị
     

Chia sẻ trang này