Nối chuỗi với mảng

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

Sói1102

Thành viên mới
Tham gia
19/12/18
Bài viết
9
Được thích
1
Em chào mọi người!
Em muốn nối dữ liệu với code này nhưng sai ở đâu nhỉ
Nhờ mọi người sửa giúp em với ạ!!!
Mã:
Sub NoiChuoi()
Dim i&, c&, lr&, j&, n&
Dim Arr(), sArr
sArr = Range("A1:B25").Value
ReDim Arr(1 To UBound(sArr, 1), 1 To 1)
Range("H:H").ClearContents
For j = 1 To UBound(sArr, 2)
    For i = 1 To UBound(sArr, 1)
                    c = c + 1
                    Arr(c, 1) = sArr(j, 2) & sArr(i, 1)
    Next
Next
Range("H1").Resize(c) = Arr
End Sub
 

File đính kèm

  • Book1.xlsm
    51.8 KB · Đọc: 14
Lần chỉnh sửa cuối:
Mình đang làm việc với ChatGPT tiện thể hỏi luôn giúp bạn, bạn xem thử:

Sub NoiChuoi()
Dim i As Long, c As Long, lr As Long, j As Long, n As Long
Dim Arr() As Variant, sArr As Variant
sArr = Range("A1:B25").Value
ReDim Arr(1 To UBound(sArr, 1) * UBound(sArr, 2), 1 To 1)
Range("H:H").ClearContents
c = 0
For i = 1 To UBound(sArr, 1)
For j = 1 To UBound(sArr, 2)
If Len(sArr(j, 2)) > 0 And Len(sArr(i, 1)) > 0 Then
c = c + 1
Arr(c, 1) = sArr(j, 2) & sArr(i, 1)
End If
Next j
Next i
Range("H1").Resize(c) = Arr
End Sub

Nguyên nhân bắt bệnh code của bạn:
1. Biến c được sử dụng để theo dõi số lượng phần tử trong mảng Arr, nhưng không được khởi tạo với giá trị ban đầu, do đó nếu Arr rỗng, lệnh Range("H1").Resize(c) = Arr sẽ không thực hiện gì cả. Bạn có thể khởi tạo c = 0 trước khi bắt đầu vòng lặp.

2. Vì mảng sArr có kích thước 25x2, nên trong vòng lặp, chỉ nên lặp đến giá trị UBound(sArr, 1) hoặc 25, chứ không phải UBound(sArr, 2).

3. Khi nối chuỗi sArr(j, 2) & sArr(i, 1), có thể xảy ra tình huống nếu cột A hoặc cột B có giá trị rỗng, thì kết quả sẽ không như mong đợi. Bạn có thể kiểm tra điều kiện If Len(sArr(j, 2)) > 0 And Len(sArr(i, 1)) > 0 Then để chỉ nối chuỗi khi giá trị không rỗng.
 
Upvote 0
PHP:
Sub NoiChuoi()
Dim i&, c&, lr&, j&, n&
Dim Arr(), sArr
sArr = Range("A1:B25").Value
ReDim Arr(1 To 100000, 1 To 1)' sua dong nay
Range("H:H").ClearContents
For j = 1 To UBound(sArr) ' sua dong nay
    For i = 1 To UBound(sArr)' sua dong nay
                    c = c + 1
                    Arr(c, 1) = sArr(j, 2) & sArr(i, 1)
    Next
Next
Range("H1").Resize(c, 1) = Arr' sua dong nay
End Sub
 
Upvote 0
PHP:
Sub NoiChuoi()
Dim i&, c&, lr&, j&, n&
Dim Arr(), sArr
sArr = Range("A1:B25").Value
ReDim Arr(1 To 100000, 1 To 1)' sua dong nay
Range("H:H").ClearContents
For j = 1 To UBound(sArr) ' sua dong nay
    For i = 1 To UBound(sArr)' sua dong nay
                    c = c + 1
                    Arr(c, 1) = sArr(j, 2) & sArr(i, 1)
    Next
Next
Range("H1").Resize(c, 1) = Arr' sua dong nay
End Sub
Cảm ơn anh,đúng ý em rồi
 
Upvote 0
Mình đang làm việc với ChatGPT tiện thể hỏi luôn giúp bạn, bạn xem thử:

Sub NoiChuoi()
Dim i As Long, c As Long, lr As Long, j As Long, n As Long
Dim Arr() As Variant, sArr As Variant
sArr = Range("A1:B25").Value
ReDim Arr(1 To UBound(sArr, 1) * UBound(sArr, 2), 1 To 1)
Range("H:H").ClearContents
c = 0
For i = 1 To UBound(sArr, 1)
For j = 1 To UBound(sArr, 2)
If Len(sArr(j, 2)) > 0 And Len(sArr(i, 1)) > 0 Then
c = c + 1
Arr(c, 1) = sArr(j, 2) & sArr(i, 1)
End If
Next j
Next i
Range("H1").Resize(c) = Arr
End Sub

Nguyên nhân bắt bệnh code của bạn:
1. Biến c được sử dụng để theo dõi số lượng phần tử trong mảng Arr, nhưng không được khởi tạo với giá trị ban đầu, do đó nếu Arr rỗng, lệnh Range("H1").Resize(c) = Arr sẽ không thực hiện gì cả. Bạn có thể khởi tạo c = 0 trước khi bắt đầu vòng lặp.

2. Vì mảng sArr có kích thước 25x2, nên trong vòng lặp, chỉ nên lặp đến giá trị UBound(sArr, 1) hoặc 25, chứ không phải UBound(sArr, 2).

3. Khi nối chuỗi sArr(j, 2) & sArr(i, 1), có thể xảy ra tình huống nếu cột A hoặc cột B có giá trị rỗng, thì kết quả sẽ không như mong đợi. Bạn có thể kiểm tra điều kiện If Len(sArr(j, 2)) > 0 And Len(sArr(i, 1)) > 0 Then để chỉ nối chuỗi khi giá trị không rỗng.
ChatGPT chỉ dẫn dỏm.

1. Biến c được khai báo là Long, VBA tự động khởi tạo trị ban đầu là 0. Chỉ những kiểu phức tạp và Variant mới không có mặc định trị khởi đầu.

2. Khi hai vòng lặp lồng nhau thì vòng trong có gì chỉ cần tính một lần nên tính bên ngoài. Để tránh vòng ngoài buộc con toán ấy phải tính đi tính lại nhiều lần
For i = 1 To UBound(sArr, 1)
For j = 1 To UBound(sArr, 2) ' con toán UBound(sArr, 2) này sẽ được tính tất cả UBound(sArr, 1) lần

3. Ô rỗng (empty) gặp toán tử & sẽ bị ép kiểu thành "". Cứ ghép thoải mái.
 
Upvote 0
ChatGPT chỉ dẫn dỏm.

1. Biến c được khai báo là Long, VBA tự động khởi tạo trị ban đầu là 0. Chỉ những kiểu phức tạp và Variant mới không có mặc định trị khởi đầu.

2. Khi hai vòng lặp lồng nhau thì vòng trong có gì chỉ cần tính một lần nên tính bên ngoài. Để tránh vòng ngoài buộc con toán ấy phải tính đi tính lại nhiều lần
For i = 1 To UBound(sArr, 1)
For j = 1 To UBound(sArr, 2) ' con toán UBound(sArr, 2) này sẽ được tính tất cả UBound(sArr, 1) lần

3. Ô rỗng (empty) gặp toán tử & sẽ bị ép kiểu thành "". Cứ ghép thoải mái.
(1) -> Chắc nó tưởng đây là code trong VB.net. Biến không được khởi tạo thì vb.net cự liền.
 
Upvote 0
Web KT

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

Back
Top Bottom