Nhờ giúp đỡ code VBA đọc file txt từng dòng vào excel

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

phunguyen281

Thành viên mới
Tham gia
8/10/12
Bài viết
9
Được thích
-6
Mình có file input.txt:
11/1000
035/500
35/1500
Tức trước dấu / là mã sản phẩm, còn sau / là giá sản phẩm
Khi mình đọc file và chuyển vào excel thì "035" tự chuyển thành "35". Nhờ mọi người trợ giúp
Mình đang khai báo mảng Dim arr() as String, arr = split(content,"/")
Sau đó dùng vòng lặp for ghi giá trị
Cells.value = arr(0)
Cells.value = arr(1)
 
Sao bác không copy paste rồi text to columns cho đơn giản, việc gì mà phải tự làm khó mình thế
 
Upvote 0
Mình có file input.txt:
11/1000
035/500
35/1500
Tức trước dấu / là mã sản phẩm, còn sau / là giá sản phẩm
Khi mình đọc file và chuyển vào excel thì "035" tự chuyển thành "35". Nhờ mọi người trợ giúp
Mình đang khai báo mảng Dim arr() as String, arr = split(content,"/")
Sau đó dùng vòng lặp for ghi giá trị
Cells.value = arr(0)
Cells.value = arr(1)
Đặt mã sp mà dùng toàn số thì có ngày không gặp vấn đề này thì vấn đề khác. Đây là 1 điển hình.
 
Upvote 0
Đã vậy lại còn dùng cả dấu "/" nữa chứ.
Dấu "/" là dấu phân biệt các cột trong file text. Còn việc đặt mã toàn số thì không có gì sai trong CSDL, có khi truy vấn còn nhanh hơn mã kết hợp. Vấn đề ở đây của chủ thớt là đặt mã kiểu số mà định dạnh Text mới ghê, "035" khác với "35".
 
Upvote 0
Mình có file input.txt:
11/1000
035/500
35/1500
Tức trước dấu / là mã sản phẩm, còn sau / là giá sản phẩm
Khi mình đọc file và chuyển vào excel thì "035" tự chuyển thành "35". Nhờ mọi người trợ giúp
Mình đang khai báo mảng Dim arr() as String, arr = split(content,"/")
Sau đó dùng vòng lặp for ghi giá trị
Cells.value = arr(0)
Cells.value = arr(1)
Tôi thử theo cách của bạn thì kết quả vẫn có số 0 ở đầu như bình thường.
Bài đã được tự động gộp:

Dấu "/" là dấu phân biệt các cột trong file text. Còn việc đặt mã toàn số thì không có gì sai trong CSDL, có khi truy vấn còn nhanh hơn mã kết hợp. Vấn đề ở đây của chủ thớt là đặt mã kiểu số mà định dạnh Text mới ghê, "035" khác với "35".
Tôi đâu nói đặt mã như vậy là sai. Chỉ là sẽ gặp vấn đề trong 1 số trường hợp, như khi ô có mã được định dạng là number hay general thì không Vlookup được
 
Lần chỉnh sửa cuối:
Upvote 0
Tôi thử theo cách của bạn thì kết quả vẫn có số 0 ở đầu như bình thường.
Bài đã được tự động gộp:


Tôi đâu nói đặt mã như vậy là sai. Chỉ là sẽ gặp vấn đề trong 1 số trường hợp, như khi ô có mã được định dạng là number hay general thì không Vlookup được
Nhờ bạn xem giúp code, vấn đề sử dụng lệnh nào để lấy được cái chuỗi
Mã:
Sub readFileExample2()
    Dim fileName As String
    Dim content As String
    Dim textRow As String
    Dim arr() As String
    Dim i As Long
    
    fileName = "D:\input.txt"
    ' open file
    Open fileName For Input As #1
    sohang = 1
    ' read line by line
    Do While Not EOF(1)
       Line Input #1, textRow
       content = content & textRow & vbCrLf
       arr = Split(content, "/")
       For i = 0 To UBound(arr)
       Cells(sohang, "B").Value = arr(0)
       Cells(sohang, "C").Value = arr(1)
       Next i
       sohang = sohang + 1
       content = ""
       arr = ""
    Loop
    ' close file
    Close #1
End Sub
 
Upvote 0
...
Nhờ bạn xem giúp code, vấn đề sử dụng lệnh nào để lấy được cái chuỗi
...
Code đã sửa -
LƯU Ý: Các cell ở cột B (nơi chép mã số) phải được định dạng kiểu Text trước khi chạy code
Rich (BB code):
Sub readFileExample2()
    Dim fileName As String
    Dim textRow As String
    Dim arr() As String
    Dim i As Long, sohang As Long

    fileName = "D:\input.txt"
    ' open file
    Open fileName For Input As #1
    sohang = 1
    ' read line by line
    Do While Not EOF(1)
        Line Input #1, textRow
        arr = Split(textRow, "/")
        For i = 0 To UBound(arr)
            Cells(sohang, "B").Value = arr(0)
            Cells(sohang, "C").Value = arr(1)
        Next i
        sohang = sohang + 1
    Loop
    Close #1
End Sub
 
Upvote 0
Đụng Tây con, chuyến này phê nhỉ. -0-0-0-
Bàn phím hư nên ghi không dấu sợ không hiểu nên ghi tiếng anh đó, nhân tiện bạn cho mình hỏi về hàm sumif(), hoặc hàm cộng tổng trong trường hợp này
ví dụ mình có file đầu vào là
911/20
11/50
556/20
32/10
35/10
509/400
11/500
35/500
843/200
517/150
032/1000
035/1200
035/150
Sau khi nhập vào excel:
B C
35 10
35 500
035 1200
035 150
..... .....
Mình muốn cộng mã 35: giá trị sẽ là 510
Còn mã 035: giá trị sẽ là 1350 ,
Hàm sumif có thể giải quyết được không? Hay phải dùng hàm khác vậy?
Bài đã được tự động gộp:

Code đã sửa -
LƯU Ý: Các cell ở cột B (nơi chép mã số) phải được định dạng kiểu Text trước khi chạy code
Rich (BB code):
Sub readFileExample2()
    Dim fileName As String
    Dim textRow As String
    Dim arr() As String
    Dim i As Long, sohang As Long

    fileName = "D:\input.txt"
    ' open file
    Open fileName For Input As #1
    sohang = 1
    ' read line by line
    Do While Not EOF(1)
        Line Input #1, textRow
        arr = Split(textRow, "/")
        For i = 0 To UBound(arr)
            Cells(sohang, "B").Value = arr(0)
            Cells(sohang, "C").Value = arr(1)
        Next i
        sohang = sohang + 1
    Loop
    Close #1
End Sub

Bàn phím hư nên ghi không dấu sợ không hiểu nên ghi tiếng anh đó, nhân tiện bạn cho mình hỏi về hàm sumif(), hoặc hàm cộng tổng trong trường hợp này
ví dụ mình có file đầu vào là
911/20
11/50
556/20
32/10
35/10
509/400
11/500
35/500
843/200
517/150
032/1000
035/1200
035/150
Sau khi nhập vào excel:
B C
35 10
35 500
035 1200
035 150
..... .....
Mình muốn cộng mã 35: giá trị sẽ là 510
Còn mã 035: giá trị sẽ là 1350 ,
Hàm sumif có thể giải quyết được không? Hay phải dùng hàm khác vậy?
 
Upvote 0
Bàn phím hư nên ghi không dấu sợ không hiểu nên ghi tiếng anh đó, nhân tiện bạn cho mình hỏi về hàm sumif(), hoặc hàm cộng tổng trong trường hợp này
ví dụ mình có file đầu vào là
911/20
11/50
556/20
32/10
35/10
509/400
11/500
35/500
843/200
517/150
032/1000
035/1200
035/150
Sau khi nhập vào excel:
B C
35 10
35 500
035 1200
035 150
..... .....
Mình muốn cộng mã 35: giá trị sẽ là 510
Còn mã 035: giá trị sẽ là 1350 ,
Hàm sumif có thể giải quyết được không? Hay phải dùng hàm khác vậy?
Bài đã được tự động gộp:



Bàn phím hư nên ghi không dấu sợ không hiểu nên ghi tiếng anh đó, nhân tiện bạn cho mình hỏi về hàm sumif(), hoặc hàm cộng tổng trong trường hợp này
ví dụ mình có file đầu vào là
911/20
11/50
556/20
32/10
35/10
509/400
11/500
35/500
843/200
517/150
032/1000
035/1200
035/150
Sau khi nhập vào excel:
B C
35 10
35 500
035 1200
035 150
..... .....
Mình muốn cộng mã 35: giá trị sẽ là 510
Còn mã 035: giá trị sẽ là 1350 ,
Hàm sumif có thể giải quyết được không? Hay phải dùng hàm khác vậy?
Tôi nghĩ 2 chuỗi 035 với 35 với Excel là khác nhau. Mà sao chuyện đơn giản thế sao bạn không tự thử mà cũng đi hỏi nhỉ? Như thế sao tiến bộ được.
 
Upvote 0
Dấu "/" là dấu phân biệt các cột trong file text. Còn việc đặt mã toàn số thì không có gì sai trong CSDL, có khi truy vấn còn nhanh hơn mã kết hợp. Vấn đề ở đây của chủ thớt là đặt mã kiểu số mà định dạnh Text mới ghê, "035" khác với "35".
1. KHông sai nhưng không ai làm vậy cả. Người đặt mã số luôn luôn có một tiêu chuẩn.
Ví dụ, mã số sinh viên
Trường thường có quy định 2 chữ số đầu là năm đăng ký học đầu tiên (vd 95, 05, 15...). 2 chữ số kế chỉ phân khoa khi đăng ký làn đầu tiên (dẫu sau này chuyển khoa, vẫn không đổi). Số chữ số còn lại tùy theo độ lớn của trường. Nếu mõi năm dự kiến tối đa dưới 10000 sinh viên mới thì chọn 4 chữ số (0001-9999)

2. Tốc độ truy vấn tùy theo loại CSDL, vùng số (gọi là điểm mượt, sweet spot), và cách admin tuned nó.
Điển hình, nếu bạn dùng Dictionary trong VBA thì cũng biết khi nạp key, có một vùng số mà nó chạy chậm hơn loại key string (cũng các số ấy, chuyển thành string)
 
Upvote 0
Với mình thì mã nên có độ dài bằng nhau (Số kí số bằng nhau) & không bao giờ xài những con số không ở đầu mã, mà là :
9935
9035
9901
. . . .

Ví dụ:
23090700123
23100800321
. . . .
 
Upvote 0
Tôi nghĩ 2 chuỗi 035 với 35 với Excel là khác nhau. Mà sao chuyện đơn giản thế sao bạn không tự thử mà cũng đi hỏi nhỉ? Như thế sao tiến bộ được.
Mình thử rồi nó vẫn ra kết quả sai:
035 giống như 35 đều có giá trị tổng là 1860
Bài đã được tự động gộp:

Mình thử rồi nó vẫn ra kết quả sai:
035 giống như 35 đều có giá trị tổng là 1860
Tôi nghĩ 2 chuỗi 035 với 35 với Excel là khác nhau. Mà sao chuyện đơn giản thế sao bạn không tự thử mà cũng đi hỏi nhỉ? Như thế sao tiến bộ được.
Mình sử dụng hàm exact() kiểm tra 2 chuỗi vẫn khác nhau, bỏ vào sumif thì nó cộng tất cả lại luôn
 
Lần chỉnh sửa cuối:
Upvote 0
Ông bà ta nói:
"TRÁNH VOI CHẢ XẤU MẶT NÀO!"​

Trong Excel,con voi trong câu trên là những con số không đáng nguyền rũa mà bạn đang thích xài!


Mình đã nhắc nhiều lần rằng luật giao thông không cấm bước xuống lòng đường;
Nhưng anh đi bộ 1 chân trên vỉa hè, 1 chân dưới lòng đường, thử xem!
 
Lần chỉnh sửa cuối:
Upvote 0
Ông bà ta nói:
"TRÁNH VOI CHẢ XẤU MẶT NÀO!"​

Trong Excel,con voi trong câu trên là những con số không đáng nguyền rũa mà bạn đang thích xài!


Mình đã nhắc nhiều lần rằng luật giao thông không cấm bước xuống lòng đường;
Nhưng anh đi bộ 1 chân trên vỉa hè, 1 chân dưới lòng đường, thử xem!
Mã không phải tự mình đặt, có trước đó rồi, giờ chỉ tìm giải pháp thôi!
 
Upvote 0
Mã không phải tự mình đặt, có trước đó rồi, giờ chỉ tìm giải pháp thôi!
Tôi nhớ rằng với CSDL quan hệ, 2 bảng dạng 1 - nhiều thì đổi mã số ở bảng 1 thì bảng nhiều sẽ tự thay đổi. Còn với Excel, muốn đổi thì viết code vba để đổi tí là xong. Vấn đề là người dùng có muốn đổi hay không thôi.
 
Upvote 0
Tôi nhớ rằng với CSDL quan hệ, 2 bảng dạng 1 - nhiều thì đổi mã số ở bảng 1 thì bảng nhiều sẽ tự thay đổi. Còn với Excel, muốn đổi thì viết code vba để đổi tí là xong. Vấn đề là người dùng có muốn đổi hay không thôi.
Bạn nhớ sai rồi. CSDL LH nếu thiết kế đúng thì khong có cái gì tự thay đổi theo cái gì cả. Mục đích của LH là vậy.
Quan hệ 1-N cũng giống như một bảng tra (bên 1) và bảng chi tiết (bên N) vậy.. Và phép tra cũng gần như VLookup.
Việc thiết kê để khi một chi tiết bên A tự động gây thay đổi bên B là thiết kế kém, hoặc là cách bắt buôc để tăng tốc cho các loại CSDL rẻ tiền.(như Access). Trường hợp này, người ta đăt mấy cái triggers (tương tự hàm bắt sự kiện của Excel) . Các triggers này gọi hàm chỉnh sửa dữ liệu trông các bảng liên hệ. Ngày xưa, những cái này gọi là "Transaction Trigger Event".
Nói cách khác, một CSDL LH thiết kế hoàn chỉnh thì nó phải đạt iys nhất là chuẩn vậc 3. Tuy nhiên, độ chuẩn cao dồng thời sẽ gây chậm cho viếc tra cứu. Vì vậy, ở các CSDL nhỏ, và ở máy chủ yếu, người ta bắt buộc phải hy sinh chuẩn để tăng tốc. Việc chỉnh sửa dữ liệu một bảng gây thay đổi trong bảng khác là một hình thức hy sinh chuẩn.
 
Upvote 0
Bạn nhớ sai rồi. CSDL LH nếu thiết kế đúng thì khong có cái gì tự thay đổi theo cái gì cả. Mục đích của LH là vậy.
Quan hệ 1-N cũng giống như một bảng tra (bên 1) và bảng chi tiết (bên N) vậy.. Và phép tra cũng gần như VLookup.
Việc thiết kê để khi một chi tiết bên A tự động gây thay đổi bên B là thiết kế kém, hoặc là cách bắt buôc để tăng tốc cho các loại CSDL rẻ tiền.(như Access). Trường hợp này, người ta đăt mấy cái triggers (tương tự hàm bắt sự kiện của Excel) . Các triggers này gọi hàm chỉnh sửa dữ liệu trông các bảng liên hệ. Ngày xưa, những cái này gọi là "Transaction Trigger Event".
Nói cách khác, một CSDL LH thiết kế hoàn chỉnh thì nó phải đạt iys nhất là chuẩn vậc 3. Tuy nhiên, độ chuẩn cao dồng thời sẽ gây chậm cho viếc tra cứu. Vì vậy, ở các CSDL nhỏ, và ở máy chủ yếu, người ta bắt buộc phải hy sinh chuẩn để tăng tốc. Việc chỉnh sửa dữ liệu một bảng gây thay đổi trong bảng khác là một hình thức hy sinh chuẩn.
À, tôi nhớ nhầm: với Access nếu khi đặt quan hệ giữa 2 bảng thì có tùy chọn khi thay đổi bảng 1 thì bảng nhiều thay đổi theo. Không chọn thì thôi.
 
Upvote 0
Tôi nhớ rằng với CSDL quan hệ, 2 bảng dạng 1 - nhiều thì đổi mã số ở bảng 1 thì bảng nhiều sẽ tự thay đổi. Còn với Excel, muốn đổi thì viết code vba để đổi tí là xong. Vấn đề là người dùng có muốn đổi hay không thôi.
Mã này cố định không đổi được, mình có cách nào cộng tổng lại trong excel được không vậy? Code VBA làm sao bạn gợi ý giúp với! Cảm ơn bạn!
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom