1986QV
Thành viên hoạt động



- Tham gia
- 15/5/12
- Bài viết
- 114
- Được thích
- 6
- Nghề nghiệp
- Kỹ sư



Em có bài toán tổng hợp hay ghép các dữ liệu rời thành dữ liệu chung. em có các giá trị rời ở sheet này ghép lại để giá trị ấy có ý nghĩa và được mô tả cụ thể như file ví dụ, mong các bác coi và cho em cái code.
Cảm ơn GPE và mọi người quan tâm giúp đỡ em!
Sub GHEP()
Dim DL1, DL2 As Variant, KQ()
DL1 = Sheet1.[A2:b9].Value
DL2 = Sheet2.[A2:b9].Value
ReDim KQ(1 To UBound(DL1) * UBound(DL1), 1 To 2)
For I = 1 To UBound(DL1)
For J = 1 To UBound(DL2)
K = K + 1
KQ(K, 1) = DL1(I, 1) & DL2(J, 1)
KQ(K, 2) = DL1(I, 2) & DL2(J, 2)
Next
Next
Sheet3.[A2:b1000].ClearContents
Sheet3.[A2].Resize(K, 2).Value = KQ
End Sub



thử vận may với code sau xem thế nào :Cảm ơn bác nha. nhưng chỉ đúng theo yêu cầu 1 là với 2 cột, với n cột dữ liệu 1 với n cột dữ liệu 2 thì chưa được bác ah! Bác nghiên cứu giúp em trường hợp này.
Cảm ơn bác, GPE!
Option Explicit
Private ArrDL1(), ArrDL2(), ArrTK()
'===============================================================
Sub Ghep()
'Sheet1 la DL1, sheet2 la DL2,sheet3 la sheetTK
On Error GoTo handle
ArrDL1 = Sheet1.Range("A2").CurrentRegion.Offset(1).Value
ArrDL2 = Sheet2.Range("A2").CurrentRegion.Offset(1).Value
ReDim ArrTK(1 To (UBound(ArrDL1, 1) - 1) * (UBound(ArrDL2, 1) - 1), 1 To UBound(ArrDL1, 2))
try (1)
With Sheet3
.Range("A2").CurrentRegion.Offset(1).ClearContents
.Range("A2").Resize(UBound(ArrTK, 1), UBound(ArrTK, 2)) = ArrTK
End With
handle:
If Err Then MsgBox Err.Description
End Sub
'=============================================================================
Sub try(iC As Long)
Dim iR&, tmp, jR&, i&
For iR = 1 To UBound(ArrDL1, 1)
tmp = ArrDL1(iR, iC)
If Len(tmp) Then
For i = 1 To UBound(ArrDL2, 1) - 1
jR = jR + 1
ArrTK(jR, iC) = tmp & ArrDL2(i, iC)
Next
End If
Next
If iC < UBound(ArrTK, 2) Then try (iC + 1)
End Sub
Cảm ơn bác nha. nhưng chỉ đúng theo yêu cầu 1 là với 2 cột, với n cột dữ liệu 1 với n cột dữ liệu 2 thì chưa được bác ah! Bác nghiên cứu giúp em trường hợp này.
Cảm ơn bác, GPE!



Ví dụ như sau bác này: Sheet 1 có 1000 cột mỗi cột có 500 hàng ghép với sheet 2 có 1000 cột mỗi cột 300 hàng như vậy 1000*1000 vậy mà bác.nếu có thêm một sheet nữa thì nó ghép ra sao?
tôi chưa hình dung ra, 1 giá trị ở sheet 1 ghép với 9 giá trị ở sheet 2 rồi 9 giá trị mới tạo thành này ghép với 9 giá trị của sheet 3,
như vậy với 1 giá trị ở shéet 1 tạo thành 9*9=27, nếu có tiếp sheet thứ 4 nó tiếp tục tăng thêm 9 lần nữa 9*27?
khó nhỉ? tôi chưa hình dung ra
Ví dụ như sau bác này: Sheet 1 có 1000 cột mỗi cột có 500 hàng ghép với sheet 2 có 1000 cột mỗi cột 300 hàng như vậy 1000*1000 vậy mà bác.
Sub GHEP()
Dim DL1, DL2 As Variant, KQ()
With Sheet1
DL1 = .[A2].Resize(.[a10000].End(3).Row, .[iv2].End(1).Column).Value
End With
With Sheet2
DL2 = .[A2].Resize(.[a10000].End(3).Row, .[iv2].End(1).Column).Value
End With
ReDim KQ(1 To UBound(DL1) * UBound(DL2), 1 To UBound(DL1, 2))
For I = 1 To UBound(DL1)
For J = 1 To UBound(DL2)
K = K + 1
For C = 1 To UBound(DL1, 2)
KQ(K, C) = DL1(I, C) & DL2(J, C)
Next
Next
Next
Sheet3.[A2:c1000].ClearContents
Sheet3.[A2].Resize(K, UBound(DL1, 2)).Value = KQ
End Sub






đã thử code bài #4 tôi viết chưa ??em chạy rồi có những số và chữ như số 0 thì mất luôn nếu đứng ở đầu cột trong sheet 3 sau khi ghép, hai nữa bị lỗi khi nhân nếu cột 1 sheet 1 là 50 hàng nhân 20 hàng thuộc cột 1 sheet 2 cho ra 1000 nhưng đây cho ra ba ngàn mấy. bác coi xem có phải do code lỗi không giúp e.
thanks bác
em chạy rồi có những số và chữ như số 0 thì mất luôn nếu đứng ở đầu cột trong sheet 3 sau khi ghép, hai nữa bị lỗi khi nhân nếu cột 1 sheet 1 là 50 hàng nhân 20 hàng thuộc cột 1 sheet 2 cho ra 1000 nhưng đây cho ra ba ngàn mấy. bác coi xem có phải do code lỗi không giúp e.
thanks bác
Sub GHEP()
Dim DL1, DL2 As Variant, KQ()
With Sheet1
DL1 = .[A2].Resize(.[a10000].End(3).Row, .[iv2].End(1).Column).Value
End With
With Sheet2
DL2 = .[A2].Resize(.[a10000].End(3).Row, .[iv2].End(1).Column).Value
End With
ReDim KQ(1 To UBound(DL1) * UBound(DL2), 1 To UBound(DL1, 2))
For I = 1 To UBound(DL1) - 1
For J = 1 To UBound(DL2) - 1
K = K + 1
For C = 1 To UBound(DL1, 2)
KQ(K, C) = DL1(I, C) & DL2(J, C)
Next
Next
Next
With Sheet3.[A2].Resize(K, UBound(DL1, 2))
.ClearContents
.NumberFormat = "@"
.Value = KQ
End With
End Sub



tôi đọc tới đọc lùi hoài mà vẫn ko hiểu vì sao nó xác định dư một phần tử trong mảng?
thôi kệ đem trừ đi một vậy
Mã:Sub GHEP() Dim DL1, DL2 As Variant, KQ() With Sheet1 DL1 = .[A2].Resize(.[a10000].End(3).Row, .[iv2].End(1).Column).Value End With With Sheet2 DL2 = .[A2].Resize(.[a10000].End(3).Row, .[iv2].End(1).Column).Value End With ReDim KQ(1 To UBound(DL1) * UBound(DL2), 1 To UBound(DL1, 2)) For I = 1 To UBound(DL1) - 1 For J = 1 To UBound(DL2) - 1 K = K + 1 For C = 1 To UBound(DL1, 2) KQ(K, C) = DL1(I, C) & DL2(J, C) Next Next Next With Sheet3.[A2].Resize(K, UBound(DL1, 2)) .ClearContents .NumberFormat = "@" .Value = KQ End With End Sub



Em chỉ ví dụ thôi nha. chưa kéo hết. Mà code đã chạy sai đôi chỗ, bác xem giúp
ví như 10*20 thì được 200 dòng đầy thiếu gần 20 dòng bác ah!



Tôi biết ngay là file up khác file bạn gán code vào !những phần em bôi vàng là ví dụ thiếu. ở có 109 hàng *11 hàng =1199 nhưng đây có 1080 có nghĩa là thiếu ở điểm A. Bác coi xong chỉnh sửa giúp e.
Thanks bác
tôi đọc tới đọc lùi hoài mà vẫn ko hiểu vì sao nó xác định dư một phần tử trong mảng?
thôi kệ đem trừ đi một vậy
Mã:Sub GHEP() Dim DL1, DL2 As Variant, KQ() With Sheet1 DL1 = .[A2].Resize(.[a10000].End(3).Row, .[iv2].End(1).Column).Value[COLOR=#ff0000] ' tại vì bắt đầu ở dòng số 2[/COLOR] End With With Sheet2 DL2 = .[A2].Resize(.[a10000].End(3).Row, .[iv2].End(1).Column).Value End With ...
Em có bài toán tổng hợp hay ghép các dữ liệu rời thành dữ liệu chung. em có các giá trị rời ở sheet này ghép lại để giá trị ấy có ý nghĩa và được mô tả cụ thể như file ví dụ, mong các bác coi và cho em cái code.
Cảm ơn GPE và mọi người quan tâm giúp đỡ em!
chọn vùng A2:C15 sheet DLieu1 rồi run code saunếu code ấy gộp lại cho ra bài toán sau các bác xem giúp em trường này xem code chỉnh ra sao.
Sub gap()
Dim c As Range, d As Range, s As Range, a()
Set s = Selection
w = s.Columns.Count
For Each r In s.Rows
If Cells(r.Row, "E") = "" Then x = x & Cells(r.Row, "E") _
Else x = Cells(r.Row, "E")
Set c = Sheets("Dlieu2").Cells.Find(x)
h = c.MergeArea.Rows.Count
Set d = c.Offset(, -4).Resize(h, w)
ReDim a(1 To h, 1 To w)
For i = 1 To h
For j = 1 To w
a(i, j) = r.Cells(j) & d(i, j)
Next
Next
Sheets("Nhan").[E2].Offset(k).Resize(h, w) = a
k = k + h
Next
End Sub
Chạy code này xem kết quả ra saonếu code ấy gộp lại cho ra bài toán sau các bác xem giúp em trường này xem code chỉnh ra sao.
Public Sub GhepKyTu()
Dim DL1, DL2, KQ() As String, d As Long, r As Long, c As Long, i As Long
DL1 = Sheet1.Range("A2:C15")
DL2 = Sheet2.Range("A2:C15")
ReDim KQ(1 To UBound(DL1) * UBound(DL2), 1 To UBound(DL1, 2))
Sheet3.Range("E2:G" & UBound(KQ)).Clear
For c = 1 To UBound(DL1, 2)
i = 0
For d = 1 To UBound(DL1)
For r = 1 To UBound(DL2)
If (IsNumeric(DL1(d, c)) = True And IsNumeric(DL2(r, c)) = False) Or _
(IsNumeric(DL1(d, c)) = False And IsNumeric(DL2(r, c)) = True) Then
i = i + 1
KQ(i, c) = DL1(d, c) & DL2(r, c)
End If
Next r
Next d
Next c
Sheet3.Range("E2").Resize(UBound(KQ), UBound(KQ, 2)).Value = KQ
End Sub




Sub Main()
Dim data1(), data2()
Dim Res(1 To 65536, 1 To 3), Row As Long
data1 = [A2:C5].Value
data2 = [A6:C15].Value
Ghep data1, data2, Row, Res
Ghep data2, data1, Row, Res
[I2].Resize(Row, 3) = Res
End Sub
Function Ghep(Rng1(), Rng2(), Row As Long, Res())
Dim i As Long, j As Long, n As Byte
For i = 1 To UBound(Rng1)
For j = 1 To UBound(Rng2)
Row = Row + 1
For n = 1 To 3
Res(Row, n) = Rng1(i, n) & Rng2(j, n)
Next
Next
Next
End Function



Bác Quanghai1969 gán code vào gửi file giúp em! Em gán rồi mà chạy k được hay do em gán k đúng.Mình thấy 2 vùng dữ liệu chỉ đổi chỗ cho nhau nên code thế này. Nếu đúng là vậy thì chỉ cần dữ liệu của sheet Dulieu1
Và có thể điều chỉnh vùng dữ liệu của data1 và data2 là được
PHP:Sub Main() Dim data1(), data2() Dim Res(1 To 65536, 1 To 3), Row As Long data1 = [A2:C5].Value data2 = [A6:C15].Value Ghep data1, data2, Row, Res Ghep data2, data1, Row, Res [I2].Resize(Row, 3) = Res End Sub
PHP:Function Ghep(Rng1(), Rng2(), Row As Long, Res()) Dim i As Long, j As Long, n As Byte For i = 1 To UBound(Rng1) For j = 1 To UBound(Rng2) Row = Row + 1 For n = 1 To 3 Res(Row, n) = Rng1(i, n) & Rng2(j, n) Next Next Next End Function




Tính gởi file kèm theo khuyến mãi nhưng vì cái tiếng gọi là bác nên không gởi. Thề rồi. Ai gọi bác hay thầy thì tiễn chân hết.Bác Quanghai1969 gán code vào gửi file giúp em! Em gán rồi mà chạy k được hay do em gán k đúng.