- Tham gia
- 23/3/16
- Bài viết
- 705
- Được thích
- 52
1 cách:Chào cả nhà GPE !
Em cần 1 đoạn code để tách tên hàng và sau khi tách thì cộng dồn Số lượng và Thành Tiền lại . em đã tự nghĩ viết mãi không ra nay nhờ mọi người giúp đở để học hỏi. Xin chân thành cảm ơn !
Option Explicit
Sub TH()
Application.ScreenUpdating = False
abc
abc2
Application.ScreenUpdating = True
End Sub
Sub abc()
Dim a, b, c(1 To 10000, 1 To 1), i, j, k, LR
a = [B6:b8].Value
For i = 1 To UBound(a, 1)
b = Split(a(i, 1), ";")
For j = LBound(b) To UBound(b)
k = k + 1: c(k, 1) = b(j)
Next j
Next i
[C10].Resize(k) = c
Range("C10:C1000").SpecialCells(4).EntireRow.Delete
LR = Range("C" & Rows.Count).End(xlUp).Row
For i = 10 To LR
Range("F" & i - 4) = Split(Range("C" & i), "*")(0)
Range("G" & i - 4) = Split(Range("C" & i), "*")(1)
Range("H" & i - 4) = Split(Range("C" & i), "*")(2)
Next i
Columns(3).ClearContents
For i = 6 To Range("F" & Rows.Count).End(xlUp).Row
Cells(i, 9) = Cells(i, 8) * Cells(i, 7)
Next
End Sub
Sub abc2()
Dim i As Long, k As Long, T As Long
Dim InputData(), OutputData()
Dim Dic As Object
Set Dic = CreateObject("Scripting.dictionary")
InputData = Sheet1.Range("F6:I" & Sheet1.[F65000].End(xlUp).Row).Value
ReDim OutputData(1 To UBound(InputData), 1 To 4)
For i = 1 To UBound(InputData)
If Not Dic.exists(InputData(i, 1)) Then
k = k + 1
Dic(InputData(i, 1)) = k
OutputData(k, 1) = InputData(i, 1): OutputData(k, 2) = InputData(i, 2): OutputData(k, 4) = InputData(i, 4)
Else
T = Dic.Item(InputData(i, 1))
OutputData(T, 2) = OutputData(T, 2) + InputData(i, 2)
OutputData(T, 4) = OutputData(T, 4) + InputData(i, 4)
OutputData(T, 3) = OutputData(T, 4)
End If
Next
Sheet1.Range("F6:I1000").ClearContents
Sheet1.Range("F6").Resize(k, 3) = OutputData
Set Dic = Nothing
End Sub
1 cách:
PHP:Option Explicit Sub TH() Application.ScreenUpdating = False abc abc2 Application.ScreenUpdating = True End Sub Sub abc() Dim a, b, c(1 To 10000, 1 To 1), i, j, k, LR a = [B6:b8].Value For i = 1 To UBound(a, 1) b = Split(a(i, 1), ";") For j = LBound(b) To UBound(b) k = k + 1: c(k, 1) = b(j) Next j Next i [C10].Resize(k) = c Range("C10:C1000").SpecialCells(4).EntireRow.Delete LR = Range("C" & Rows.Count).End(xlUp).Row For i = 10 To LR Range("F" & i - 4) = Split(Range("C" & i), "*")(0) Range("G" & i - 4) = Split(Range("C" & i), "*")(1) Range("H" & i - 4) = Split(Range("C" & i), "*")(2) Next i Columns(3).ClearContents For i = 6 To Range("F" & Rows.Count).End(xlUp).Row Cells(i, 9) = Cells(i, 8) * Cells(i, 7) Next End Sub Sub abc2() Dim i As Long, k As Long, T As Long Dim InputData(), OutputData() Dim Dic As Object Set Dic = CreateObject("Scripting.dictionary") InputData = Sheet1.Range("F6:I" & Sheet1.[F65000].End(xlUp).Row).Value ReDim OutputData(1 To UBound(InputData), 1 To 4) For i = 1 To UBound(InputData) If Not Dic.exists(InputData(i, 1)) Then k = k + 1 Dic(InputData(i, 1)) = k OutputData(k, 1) = InputData(i, 1): OutputData(k, 2) = InputData(i, 2): OutputData(k, 4) = InputData(i, 4) Else T = Dic.Item(InputData(i, 1)) OutputData(T, 2) = OutputData(T, 2) + InputData(i, 2) OutputData(T, 4) = OutputData(T, 4) + InputData(i, 4) OutputData(T, 3) = OutputData(T, 4) End If Next Sheet1.Range("F6:I1000").ClearContents Sheet1.Range("F6").Resize(k, 3) = OutputData Set Dic = Nothing End Sub
Bạn cố gắng chờ đợi các thành viên khác nhé.Code anh rất OK. Em xin cảm ơn . em cũng hiểu code anh là nó tách ra trước sau đó mới cộng dồn lại. Anh có cách nào không tách ra mà cộng dồn được không. Vì em sợ Ví dụ chuổi có 5000 dòng mã mổi dòng có 100 thực đơn vậy số dòng tách ra = 5000 * 100 = 500.000 dòng vậy Excel 2003 nó không đủ dòng để chứa. Anh có cách nào khắc phục không ( excel 2010 và 2007 em không thích vì có 1 số code nó không chạy được em tẩy chay luôn rồi)
dạ . Em xin chân thành cảm ơn AnhBạn cố gắng chờ đợi các thành viên khác nhé.
Chạy thử codeChào cả nhà GPE !
Em cần 1 đoạn code để tách tên hàng và sau khi tách thì cộng dồn Số lượng và Thành Tiền lại . em đã tự nghĩ viết mãi không ra nay nhờ mọi người giúp đở để học hỏi. Xin chân thành cảm ơn !
Sub GPE()
Dim Dic As Object, dArr As Variant, Arr As Variant, tmp As Variant, S As Variant
Dim i As Long, j As Integer, k As Long, ik As Long, key As String
Set Dic = CreateObject("Scripting.dictionary")
dArr = Range("B6", Range("B" & Rows.Count).End(xlUp)).Value
ReDim Arr(1 To UBound(dArr), 1 To 3)
For i = 1 To UBound(dArr)
tmp = Split(dArr(i, 1), ";")
For j = LBound(tmp) To UBound(tmp)
S = Split(tmp(j), "*")
If UBound(S) = 2 Then
Key = S(0)
If Not Dic.exists(Key) Then
k = k + 1
Dic.Add Key, k
Arr(k, 1) = Key
End If
ik = Dic.Item(Key)
Arr(ik, 2) = Arr(ik, 2) + CDbl(S(1))
Arr(ik, 3) = Arr(ik, 3) + CDbl(S(2))
End If
Next j
Next i
i = Range("F" & Rows.Count).End(xlUp).Row
If i > 5 Then Range("F6:H" & i).ClearContents
Range("F6:H6").Resize(k) = Arr
End Sub
Dường như kết quả(Thành tiền) có khác so với đáp án của chủ Topic bác HieuCD à.Chạy thử codeMã:Sub GPE() Dim Dic As Object, dArr As Variant, Arr As Variant, tmp As Variant, S As Variant Dim i As Long, j As Integer, k As Long, ik As Long, key As String Set Dic = CreateObject("Scripting.dictionary") dArr = Range("B6", Range("B" & Rows.Count).End(xlUp)).Value ReDim Arr(1 To UBound(dArr), 1 To 3) For i = 1 To UBound(dArr) tmp = Split(dArr(i, 1), ";") For j = LBound(tmp) To UBound(tmp) S = Split(tmp(j), "*") If UBound(S) = 2 Then Key = S(0) If Not Dic.exists(Key) Then k = k + 1 Dic.Add Key, k Arr(k, 1) = Key End If ik = Dic.Item(Key) Arr(ik, 2) = Arr(ik, 2) + CDbl(S(1)) Arr(ik, 3) = Arr(ik, 3) + CDbl(S(2)) End If Next j Next i i = Range("F" & Rows.Count).End(xlUp).Row If i > 5 Then Range("F6:H" & i).ClearContents Range("F6:H6").Resize(k) = Arr End Sub
Mình quên nhân cho sản lượngDường như kết quả(Thành tiền) có khác so với đáp án của chủ Topic bác HieuCD à.
Sub GPE()
Dim Dic As Object, dArr As Variant, Arr As Variant, tmp As Variant, S As Variant
Dim i As Long, j As Integer, k As Long, ik As Long, key As String
Set Dic = CreateObject("Scripting.dictionary")
dArr = Range("B6", Range("B" & Rows.Count).End(xlUp)).Value
ReDim Arr(1 To UBound(dArr), 1 To 3)
For i = 1 To UBound(dArr)
tmp = Split(dArr(i, 1), ";")
For j = LBound(tmp) To UBound(tmp)
S = Split(tmp(j), "*")
If UBound(S) = 2 Then
key = S(0)
If Not Dic.exists(key) Then
k = k + 1
Dic.Add key, k
Arr(k, 1) = key
End If
ik = Dic.Item(key)
Arr(ik, 2) = Arr(ik, 2) + CDbl(S(1))
Arr(ik, 3) = Arr(ik, 3) + CDbl(S(1)) * CDbl(S(2))
End If
Next j
Next i
i = Range("F" & Rows.Count).End(xlUp).Row
If i > 5 Then Range("F6:H" & i).ClearContents
Range("F6:H6").Resize(k) = Arr
End Sub
Bài này anh đã chia ra làm 2 phần thì Code luôn phần đầu vào mảng đi anh, không cần phải gộp ngay, chia ra để trị cũng được mà.1 cách:
PHP:Option Explicit Sub TH() Application.ScreenUpdating = False abc abc2 Application.ScreenUpdating = True End Sub Sub abc() Dim a, b, c(1 To 10000, 1 To 1), i, j, k, LR a = [B6:b8].Value For i = 1 To UBound(a, 1) b = Split(a(i, 1), ";") For j = LBound(b) To UBound(b) k = k + 1: c(k, 1) = b(j) Next j Next i [C10].Resize(k) = c Range("C10:C1000").SpecialCells(4).EntireRow.Delete LR = Range("C" & Rows.Count).End(xlUp).Row For i = 10 To LR Range("F" & i - 4) = Split(Range("C" & i), "*")(0) Range("G" & i - 4) = Split(Range("C" & i), "*")(1) Range("H" & i - 4) = Split(Range("C" & i), "*")(2) Next i Columns(3).ClearContents For i = 6 To Range("F" & Rows.Count).End(xlUp).Row Cells(i, 9) = Cells(i, 8) * Cells(i, 7) Next End Sub Sub abc2() Dim i As Long, k As Long, T As Long Dim InputData(), OutputData() Dim Dic As Object Set Dic = CreateObject("Scripting.dictionary") InputData = Sheet1.Range("F6:I" & Sheet1.[F65000].End(xlUp).Row).Value ReDim OutputData(1 To UBound(InputData), 1 To 4) For i = 1 To UBound(InputData) If Not Dic.exists(InputData(i, 1)) Then k = k + 1 Dic(InputData(i, 1)) = k OutputData(k, 1) = InputData(i, 1): OutputData(k, 2) = InputData(i, 2): OutputData(k, 4) = InputData(i, 4) Else T = Dic.Item(InputData(i, 1)) OutputData(T, 2) = OutputData(T, 2) + InputData(i, 2) OutputData(T, 4) = OutputData(T, 4) + InputData(i, 4) OutputData(T, 3) = OutputData(T, 4) End If Next Sheet1.Range("F6:I1000").ClearContents Sheet1.Range("F6").Resize(k, 3) = OutputData Set Dic = Nothing End Sub
Mình quên nhân cho sản lượng
Arr(ik, 3) = Arr(ik, 3) + CDbl(S(2))
Chỉnh lại
Arr(ik, 3) = Arr(ik, 3) + CDbl(S(1)) * CDbl(S(2))Mã:Sub GPE() Dim Dic As Object, dArr As Variant, Arr As Variant, tmp As Variant, S As Variant Dim i As Long, j As Integer, k As Long, ik As Long, key As String Set Dic = CreateObject("Scripting.dictionary") dArr = Range("B6", Range("B" & Rows.Count).End(xlUp)).Value ReDim Arr(1 To UBound(dArr), 1 To 3) For i = 1 To UBound(dArr) tmp = Split(dArr(i, 1), ";") For j = LBound(tmp) To UBound(tmp) S = Split(tmp(j), "*") If UBound(S) = 2 Then key = S(0) If Not Dic.exists(key) Then k = k + 1 Dic.Add key, k Arr(k, 1) = key End If ik = Dic.Item(key) Arr(ik, 2) = Arr(ik, 2) + CDbl(S(1)) Arr(ik, 3) = Arr(ik, 3) + CDbl(S(1)) * CDbl(S(2)) End If Next j Next i i = Range("F" & Rows.Count).End(xlUp).Row If i > 5 Then Range("F6:H" & i).ClearContents Range("F6:H6").Resize(k) = Arr End Sub