Chuyển đổi số lượng theo 1 hệ số nhất định (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

AndOrNot

Thành viên chính thức
Tham gia
27/6/12
Bài viết
75
Được thích
3
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.
 

File đính kèm

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
 
Upvote 0
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
 
Upvote 0
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

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?
 
Upvote 0
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)
 
Upvote 0
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à. :)
 
Upvote 0
Nếu sử dụng công thức như em thì rắc rối quá, vì em rất gà. :)

Làm đại thế này:
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
Chạy Sub Main1Main2 và kiểm tra kết quả
---------------
Cũng chưa mấy hài lòng. Ai rảnh cải tiến lại xem nhé
 
Lần chỉnh sửa cuối:
Upvote 0
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
 
Upvote 0
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

Bác ơi với số lượng < quy đổi thì bị báo lỗi.
 

File đính kèm

Upvote 0
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
 
Upvote 0
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

Vâng cảm ơn bác. Sau khi gửi #9 xong, trên đường đi về em mới sực nhớ ra là cần phải thêm cái "If j <> 0 Then" vào, vậy mà không nghĩ ra ngay lúc đó lại làm phiền bác. Em đúng là ngu quá đi

Em cảm ơn bác nhiều lắm!
 
Upvote 0
Làm đại thế này:
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
Chạy Sub Main1Main2 và kiểm tra kết quả
---------------
Cũng chưa mấy hài lòng. Ai rảnh cải tiến lại xem nhé

Em cảm ơn thầy nhiều!
 
Upvote 0
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ì
 

File đính kèm

Upvote 0
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ì


Toàn các cao thủ cả thôi, thế mới biết mình mới gà đến mức độ nào. Em cũng có file giải quyết vấn đề này làm từ công thức (nguyên chất) nhưng không up lên được.
 
Upvote 0
Bài này nhìn lại thấy cũng hay hay (về mặt thuật toán)
Giờ mời các cao thủ vào làm tiếp với yêu cầu như sau:
- Xử lý toàn bộ bằng Array
- Xác định mảng kết quả vừa đủ
- Không dùng WorksheetFunction hay Evaluate
- Viết code với số vòng lập ít nhất (chắc bèo lắm cũng phải 2 vòng)

Ẹc... Ẹc...
Mời toàn thể bà con tham gia hen
 
Upvote 0
Nếu là công thức bạn thử file này xem
 

File đính kèm

Upvote 0
Nếu là công thức bạn thử file này 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
 
Upvote 0
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
Trong file của tôi, bạn đặt công thức này vào ô I4 thử xem.
Mã:
=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))
 
Upvote 0
Nếu là công thức bạn thử file này xem

Gửi bác huuthang_bd!
File của bác gửi rất hay khi sử dụng công thức, tuy nhiên nếu phát sinh tình huống (như trong file đính kèm) thì kết quả lại không ra được như ý muốn.
Bác có thể xem lại giúp em được không?

AndOrNot
 

File đính kèm

Upvote 0

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

Back
Top Bottom