Chào các bác!
Yêu cầu bài toán của em không có nhiều (thể hiện trong ví dụ file đính kèm)
Xin các bác ghé qua và giúp đỡ em chút.
Cell C5 có kết quả =36 và bạn diễn giải con số 36 này có được là do 352 = 36x9 + 28
Vậy xin hỏi: Tại sao C5 không là số 28? Vì 352 cũng =28*12+16 vậy
Ý tôi muốn hỏi: Tại sao C5 phải là 36 mà không là 1 số nào khác
Thầy ơi!
Các cột A,B,C là dữ liệu đầu vào (INPUT), còn dữ liệu đầu ra của em mong muốn được thể hiện ở cột G, H (hoặc L,M). Trong ví dụ này được hiểu như là có 509 (số lượng) cái kẹo A được chia thành nhiều phần mỗi phần có 45 cái (quy đổi), như vậy sẽ chia được 11 phần nguyên và 1 phần lẻ (14 cái). Kết quả được thể hiện trong phần OUTPUT1 & OUTPUT2
Thầy ơi, trong lúc chờ các cao thủ khác thì thầy giúp em đi, em cũng đang cần sớm mà.Hiểu rồi
Nếu làm bằng code chắc chỉ chuyện nhỏ (để các cao thủ khác làm hen)
Còn nếu bằng công thức thì... ẹc.. ẹc... hổng biết có được không ta?
Thầy ơi, trong lúc chờ các cao thủ khác thì thầy giúp em đi, em cũng đang cần sớm mà.
Em có làm bằng công thức được nhưng thấy rắc rối quá, và tốc độ xử lý chạy cũng chậm lắm nên em muốn sử dụng bằng Code (vừa để học hỏi thêm)
Nếu sử dụng công thức như em thì rắc rối quá, vì em rất gà.![]()
Sub OutPut(ByVal Source As Range, ByVal Target As Range, ByVal bType As Boolean)
'Source phai là vùng có ít nhat 3 côt
Dim tmpArr, Arr()
Dim tmp1 As Long, tmp2 As Long
Dim lR As Long, n As Long, m As Long, lRemain As Long
tmpArr = Source.Value
For lR = 1 To UBound(tmpArr, 1)
tmp1 = tmpArr(lR, 2): tmp2 = tmpArr(lR, 3)
n = 0
If tmp1 * tmp2 Then
Do
lRemain = tmp1 - n * tmp2
n = n + 1: m = m + 1
ReDim Preserve Arr(1 To 2, 1 To m)
Arr(1, m) = tmpArr(lR, 1)
If bType Then
Arr(2, m) = IIf(lRemain < tmp2, lRemain, tmp2)
Else
If n = 1 Then
Arr(2, m) = IIf((tmp1 Mod tmp2) > 0, (tmp1 Mod tmp2), tmp2)
Else
Arr(2, m) = tmp2
End If
End If
Loop Until lRemain < tmp2
End If
Next
Target.Resize(m, 2).Value = WorksheetFunction.Transpose(Arr)
End Sub
Sub Main1()
Dim Source As Range, Target As Range
Set Source = Range("A4:C1000")
Set Target = Range("G4")
Target.Resize(60000, 2).ClearContents
OutPut Source, Target, True
End Sub
Sub Main2()
Dim Source As Range, Target As Range
Set Source = Range("A4:C1000")
Set Target = Range("L4")
Target.Resize(60000, 2).ClearContents
OutPut Source, Target, False
End Sub
Sub Ouput1()
Dim Tm, KQ(), i, j
Dim Cl As Range
[G4:H4].End(xlDown).ClearContents
Set Cl = [G4]
Tm = Range([A4], [C65536].End(3))
For i = 1 To UBound(Tm, 1)
j = Int(Tm(i, 2) / Tm(i, 3))
Cl.Offset(, 1).Resize(j) = Tm(i, 3)
Cl.Resize(j) = Tm(i, 1)
If Tm(i, 2) Mod Tm(i, 3) > 0 Then
Cl.Offset(j) = Tm(i, 1)
Cl.Offset(j, 1) = Tm(i, 2) Mod Tm(i, 3)
End If
Set Cl = Cl.Offset(j + IIf(Tm(i, 2) Mod Tm(i, 3) > 0, 1, 0))
Next
End Sub
'-------------------------------------------------------
Sub Ouput2()
Dim Tm, KQ(), i, j
Dim Cl As Range
[L4:M4].End(xlDown).ClearContents
Set Cl = [L4]
Tm = Range([A4], [C65536].End(3))
For i = 1 To UBound(Tm, 1)
j = Int(Tm(i, 2) / Tm(i, 3))
If Tm(i, 2) Mod Tm(i, 3) > 0 Then
Cl = Tm(i, 1)
Cl.Offset(, 1) = Tm(i, 2) Mod Tm(i, 3)
Set Cl = Cl.Offset(1)
End If
Cl.Offset(, 1).Resize(j) = Tm(i, 3)
Cl.Resize(j) = Tm(i, 1)
Set Cl = Cl.Offset(j)
Next
End Sub
Mình giúp bạn 2 đoạn code, mỗi đoạn tương ứng với 1 dạng output
Mã:Sub Ouput1() Dim Tm, KQ(), i, j Dim Cl As Range [G4:H4].End(xlDown).ClearContents Set Cl = [G4] Tm = Range([A4], [C65536].End(3)) For i = 1 To UBound(Tm, 1) j = Int(Tm(i, 2) / Tm(i, 3)) Cl.Offset(, 1).Resize(j) = Tm(i, 3) Cl.Resize(j) = Tm(i, 1) If Tm(i, 2) Mod Tm(i, 3) > 0 Then Cl.Offset(j) = Tm(i, 1) Cl.Offset(j, 1) = Tm(i, 2) Mod Tm(i, 3) End If Set Cl = Cl.Offset(j + IIf(Tm(i, 2) Mod Tm(i, 3) > 0, 1, 0)) Next End Sub '------------------------------------------------------- Sub Ouput2() Dim Tm, KQ(), i, j Dim Cl As Range [L4:M4].End(xlDown).ClearContents Set Cl = [L4] Tm = Range([A4], [C65536].End(3)) For i = 1 To UBound(Tm, 1) j = Int(Tm(i, 2) / Tm(i, 3)) If Tm(i, 2) Mod Tm(i, 3) > 0 Then Cl = Tm(i, 1) Cl.Offset(, 1) = Tm(i, 2) Mod Tm(i, 3) Set Cl = Cl.Offset(1) End If Cl.Offset(, 1).Resize(j) = Tm(i, 3) Cl.Resize(j) = Tm(i, 1) Set Cl = Cl.Offset(j) Next End Sub
Sub Ouput1()
Dim Tm, KQ(), i, j
Dim Cl As Range
With Sheet1
.[G4:H4].End(xlDown).ClearContents
Set Cl = .[G4]
Tm = .Range([A4], .[C65536].End(3))
For i = 1 To UBound(Tm, 1)
j = Int(Tm(i, 2) / Tm(i, 3))
If j > 0 Then
Cl.Offset(, 1).Resize(j) = Tm(i, 3)
Cl.Resize(j) = Tm(i, 1)
End If
If Tm(i, 2) Mod Tm(i, 3) > 0 Then
Cl.Offset(j) = Tm(i, 1)
Cl.Offset(j, 1) = Tm(i, 2) Mod Tm(i, 3)
End If
Set Cl = Cl.Offset(j + IIf(Tm(i, 2) Mod Tm(i, 3) > 0, 1, 0))
Next
End With
End Sub
'-------------------------------------------------------
Sub Ouput2()
Dim Tm, KQ(), i, j
Dim Cl As Range
With Sheet1
.[L4:M4].End(xlDown).ClearContents
Set Cl = .[L4]
Tm = .Range(.[A4], .[C65536].End(3))
For i = 1 To UBound(Tm, 1)
j = Int(Tm(i, 2) / Tm(i, 3))
If Tm(i, 2) Mod Tm(i, 3) > 0 Then
Cl = Tm(i, 1)
Cl.Offset(, 1) = Tm(i, 2) Mod Tm(i, 3)
Set Cl = Cl.Offset(1)
End If
If j > 0 Then
Cl.Offset(, 1).Resize(j) = Tm(i, 3)
Cl.Resize(j) = Tm(i, 1)
Set Cl = Cl.Offset(j)
End If
Next
End With
End Sub
Khi viết Code thì mới xác định các việc chính còn nhiều trường hợp chưa lường hết mà phải qua test thực tế. Chỉ rào thêm 1 cái If là được thôi mà.
Nếu bạn để Code ở Module thì phải dấn chiếu rõ tên sheet như sau nha
Mã:Sub Ouput1() Dim Tm, KQ(), i, j Dim Cl As Range With Sheet1 .[G4:H4].End(xlDown).ClearContents Set Cl = .[G4] Tm = .Range([A4], .[C65536].End(3)) For i = 1 To UBound(Tm, 1) j = Int(Tm(i, 2) / Tm(i, 3)) If j > 0 Then Cl.Offset(, 1).Resize(j) = Tm(i, 3) Cl.Resize(j) = Tm(i, 1) End If If Tm(i, 2) Mod Tm(i, 3) > 0 Then Cl.Offset(j) = Tm(i, 1) Cl.Offset(j, 1) = Tm(i, 2) Mod Tm(i, 3) End If Set Cl = Cl.Offset(j + IIf(Tm(i, 2) Mod Tm(i, 3) > 0, 1, 0)) Next End With End Sub '------------------------------------------------------- Sub Ouput2() Dim Tm, KQ(), i, j Dim Cl As Range With Sheet1 .[L4:M4].End(xlDown).ClearContents Set Cl = .[L4] Tm = .Range(.[A4], .[C65536].End(3)) For i = 1 To UBound(Tm, 1) j = Int(Tm(i, 2) / Tm(i, 3)) If Tm(i, 2) Mod Tm(i, 3) > 0 Then Cl = Tm(i, 1) Cl.Offset(, 1) = Tm(i, 2) Mod Tm(i, 3) Set Cl = Cl.Offset(1) End If If j > 0 Then Cl.Offset(, 1).Resize(j) = Tm(i, 3) Cl.Resize(j) = Tm(i, 1) Set Cl = Cl.Offset(j) End If Next End With End Sub
Làm đại thế này:
Chạy Sub Main1 và Main2 và kiểm tra kết quảMã:Sub OutPut(ByVal Source As Range, ByVal Target As Range, ByVal bType As Boolean) 'Source phai là vùng có ít nhat 3 côt Dim tmpArr, Arr() Dim tmp1 As Long, tmp2 As Long Dim lR As Long, n As Long, m As Long, lRemain As Long tmpArr = Source.Value For lR = 1 To UBound(tmpArr, 1) tmp1 = tmpArr(lR, 2): tmp2 = tmpArr(lR, 3) n = 0 If tmp1 * tmp2 Then Do lRemain = tmp1 - n * tmp2 n = n + 1: m = m + 1 ReDim Preserve Arr(1 To 2, 1 To m) Arr(1, m) = tmpArr(lR, 1) If bType Then Arr(2, m) = IIf(lRemain < tmp2, lRemain, tmp2) Else If n = 1 Then Arr(2, m) = IIf((tmp1 Mod tmp2) > 0, (tmp1 Mod tmp2), tmp2) Else Arr(2, m) = tmp2 End If End If Loop Until lRemain < tmp2 End If Next Target.Resize(m, 2).Value = WorksheetFunction.Transpose(Arr) End Sub Sub Main1() Dim Source As Range, Target As Range Set Source = Range("A4:C1000") Set Target = Range("G4") Target.Resize(60000, 2).ClearContents OutPut Source, Target, True End Sub Sub Main2() Dim Source As Range, Target As Range Set Source = Range("A4:C1000") Set Target = Range("L4") Target.Resize(60000, 2).ClearContents OutPut Source, Target, False End Sub
---------------
Cũng chưa mấy hài lòng. Ai rảnh cải tiến lại xem nhé
Chủ thớt đã có code vừa ý, giờ giải trí bằng công thức
đặt một đóng name như sau:
INPUT=Sheet1!$A$3:$D$5
So=COUNTIF(Sheet1!$G$4:Sheet1!$G5;Sheet1!$G5)
SoA=COUNTIF(Sheet1!$G$3:Sheet1!$G4;Sheet1!$A$4)
SoB=COUNTIF(Sheet1!$G$3:Sheet1!$G4;Sheet1!$A$5)
SPA=INT(Sheet1!$B$4/Sheet1!$C$4)+IF(MOD(Sheet1!$B$4;Sheet1!$C$4)=0;0;1)
SPB=INT(Sheet1!$B$5/Sheet1!$C$5)+IF(MOD(Sheet1!$B$5;Sheet1!$C$5)=0;0;1)
TenSP=EVALUATE("SP" & Sheet1!$G5)
Bi giờ mới tới công thức
OUTPUT1
G4=IF(SoA<SPA;"A";IF(SoB<SPB;"B";""))
H4=VLOOKUP(G4;INPUT;IF(So=TenSP;4;3))
OUTPUT2
L4=IF(SoA<SPA;"A";IF(SoB<SPB;"B";""))
M4=VLOOKUP(L4;INPUT;IF(So=1;4;3))
Phì...phò....mệt quá.....hìhì
Nếu là công thức bạn thử file này xem
Trong file của tôi, bạn đặt công thức này vào ô I4 thử xem.Quá hay, bằng những hàm thông dụng mà anh có thể giải được một bài toán có cấu trúc lắc léo vậy.
vậy cón output 2 (tức đặt số 14 của A) lên đầu thì, tôi suy nghĩ hoài cũng ko biết làm sao lật nó lên trên được
tks
=IF(G4<>G3,MOD(VLOOKUP(G4,$A$4:$C$5,2,0)-1,VLOOKUP(G4,$A$4:$C$5,3,0))+1,VLOOKUP(G4,$A$4:$C$5,3,0))
Nếu là công thức bạn thử file này xem
Nếu là công thức bạn thử file này xem