Mình đang gặp khó khăn về việc chan 1 số ra nhiều ô trong 1 sheet

quanghai1969

Thành viên gạo cội
Tham gia ngày
21 Tháng hai 2009
Bài viết
5,620
Được thích
7,024
Điểm
860
Nơi ở
Thuận An, Bình Dương
Bỏ thế nào bạn :).....còn For 1=1 to 20 thì mình biết edit chỗ nào còn vụ bỏ ô nào trong khi các ô là liền kế nao
Thì sau khi chay code xong bạn chèn vào 1 cột thì sẽ có 1 cột trống rồi.
Còn cái vụ thêm cột hay bớt cột gi gì đó thì ảnh hưởng code nhiều lắm, chắc là không sửa được code đâu
 

po_op_po_op

Thành viên mới
Tham gia ngày
9 Tháng mười một 2006
Bài viết
30
Được thích
0
Điểm
663
Tuổi
36
Thì sau khi chay code xong bạn chèn vào 1 cột thì sẽ có 1 cột trống rồi.
Còn cái vụ thêm cột hay bớt cột gi gì đó thì ảnh hưởng code nhiều lắm, chắc là không sửa được code đâu
oh...vấn đề này thuộc về tiểu xảo :D. anyway cám ơn bạn nhiều
 

po_op_po_op

Thành viên mới
Tham gia ngày
9 Tháng mười một 2006
Bài viết
30
Được thích
0
Điểm
663
Tuổi
36
Mình dùng 1 bảng test khác để thử công thức của tiền bối ndu96081631 ( mình rất thích ý tưởng của ndu96081631, vì mình dùng công thức excel chủ yếu để chủ động )
và mình gửi lại 1 file có vẻ chưa đc thuận lợi lắm. Nên mặt dày mong các bạn xem giúp mình. Vấn để là ở SheetB1 và cột chênh lệch :((. mình tính cho 2 cột này =0
Mong các bạn giúp mình hướng giải quyết với
 

File đính kèm

siwtom

Thành viên gắn bó
Tham gia ngày
19 Tháng ba 2008
Bài viết
2,128
Được thích
4,180
Điểm
860
Mình dùng 1 bảng test khác để thử công thức của tiền bối ndu96081631 ( mình rất thích ý tưởng của ndu96081631, vì mình dùng công thức excel chủ yếu để chủ động )
và mình gửi lại 1 file có vẻ chưa đc thuận lợi lắm. Nên mặt dày mong các bạn xem giúp mình. Vấn để là ở SheetB1 và cột chênh lệch :((. mình tính cho 2 cột này =0
Mong các bạn giúp mình hướng giải quyết với
Bạn ạ, bạn nói tôi không hiểu. Dữ liệu dù thế nào chăng nữa thì "qui tắc chan" do bạn đặt ra, sao bạn lại nói là phải "trải nghiệm" gì đó thì mới ra qui tắc chan?
Tôi đã đọc tới bài #24 và vẫn chưa biết "qui tắc" chan của bạn thế nào.
Đọc bài đầu của bạn khó hiểu nên tôi đọc file.
Ta có số k nguyên dương và số ô là n < k. Khi chia k cho n ta được thương m và số dư r. Ta nhập vào các ô giá trị m. Tiếp theo ta xét r. Nếu r = 0 (chia hết) thì thôi. Nếu r > 0 thì số dư này ta chia đều cho một số ô p với p < n (do p <= r < n). Do p < n nên ta sẽ thêm cho một số ô (chứ không phải cho tất cả) trong n ô, vì vậy ta phải chọn ngẫu nhiên p ô trong n ô. Tới chỗ này tôi hiểu. Nhưng ...

a. lúc nào thì ta chọn p = r và mỗi ô sẽ được +1 (dòng 1 của vd. giả lập có p = r = 2)
b. Lúc nào thì chọn p < n (dòng 2 có p = 3 < 4 = r). Và nếu chọn p < r thì thì sau khi +1 (hoặc 2, 3, ...) cho mỗi ô được chọn ngẫu nhiên thì vẫn còn "thừa" 0 <= r1 < p, vậy thì số thừa này sẽ được sử dụng như thế nào? Nhìn vào dòng 2 tôi có cảm giác là bạn sẽ tiếp tục chọn ngẫu nhiên p1 ô (p1 <= r1) trong p ô được chọn ngẫu nhiên. Cái này với vd. 2 nó là:

k = 24, n = 5 => m = 4, r = 4. Chọn p = 3 (chọn được B, D, E) => +1 vào B, D, E và còn r1 = 1. Cái 1 này ta cộng vào 1 ô ngẫu nhiên (p1 = 1) từ 3 ô (p = 3) B, D, E. Ta có 1 ô ngẫu nhiên này là B, vậy cộng thêm 1 vào B.

Tôi thử đoán "qui tắc" chan thế nào:

Dữ liệu đầu vào: Có n ô và giá trị k nguyên dương với k >= n. Ta thực hiện các bước:

1. Ta chia k cho n được thương là m và số dư là r. Ta cộng vào mỗi ô đã cho giá trị m. Nếu r = 0 thì kết thúc, nếu r > 0 thì làm tiếp bước 2.
2. Trước tiên ta chọn p (tức số các ô sẽ được chọn ngẫu nhiên - do có thể p = n (dòng 1) hoặc p < n - dòng 2) trong khoảng 1 --> r. Sau khi có p <= n rồi thì ta chọn p ô ngẫu nhiên từ n ô. Có được p ô ngẫu nhiên rồi thì quay lại bước 1 nhưng với tập số liệu mới: n = p, k = r

Với "qui tắc" như trên thì vd. dòng 7 với n = 5, k = 34 sẽ được diễn giải như sau:
m = k \ n = 6, r = k mod n = 4. Ta cộng 6 vào các ô A, B, ..., E. Do r > 0 ta làm tiếp bước 2. Trước tiên ta chọn số ô ngẫu nhiên trong khoảng 1 --> 4, được p = 3. Ta chọn 3 ô ngẫu nhiên trong 5 ô (A, B, ..., E) và được các ô A, B, E. Ta quay lại bước 1 với n = p = 3 (3 ô A, B, E) và k = r = 4. Với tập giá trị mới này ta có m = k \ n = 1, r = k mod n = 1. Ta cộng 1 (tức m) vào các ô A, B, E - tới chỗ này thì có A = B = E = 7, C = 6, D = 6. Do r = 1 > 0 nên ta làm tiếp bước 2. Trước tiên ta chọn số p, tức số các ô ngẫu nhiên cần chọn. Do r = 1 nên số các ô cần chọn p = 1 (chọn p ngẫu nhiên trong khoảng 1 --> r, tức trong 1 --> 1). Ta chọn p = 1 ô ngẫu nhiên trong 3 ô A, B, E (do n = 3). Ta chọn được ô A. Ta quay lại bước 1 với tập dữ liệu mới: n = p = 1 (1 ô duy nhất, cụ thể là ô A), k = r = 1. Với dữ liệu mới này thì m = k \ n = 1, r = k mod 1 = 0. Ta cộng thêm vào ô A giá trị m = 1. Do r = 0 nên "trò chơi" kết thúc tại đây. Kết quả ta có A = 8, B = 7, C = D = 6, E = 7

Nếu "qui tắc" chan của bạn đúng như thế thì tôi cũng đã "vô tình" phát biểu nó ở dạng thuật toán mất rồi. Bây giờ thì chả còn "cơ hội" để mò tìm thuật toán nữa. Chỉ còn phải code thôi.
-----------
Nếu qui tắc chan của bạn không đúng như trên thì tôi hỏi: qui tắc chan của bạn thế nào? Không thể nói là phải "trải nghiệm" mới ra qui tắc chan. Qui tắc là do bạn đặt ra, bạn muốn thế nào thì phải thế ấy, thế thôi. Nếu cái qui tắc mà bạn "thích như thế" nó có mâu thuẫn (cái kiểu: tôi muốn ăn cái bánh nhưng vẫn còn lại cái bánh) thì mọi người sẽ chỉ ra.
Đã là qui tắc thì bắt buộc bạn phải phát biểu ở dạng tổng quát. Các ví dụ chỉ là giúp làm sáng tỏ qui tắc khi cái qui tắc đó nó hơi rắc rối, khó hiểu.

Tôi thấy một vài bạn có vẻ hiểu ý tác giả, vậy các bạn có thể phát biểu cái "qui tắc" chan của tác giả thế nào không? Các bước thao tác như thế nào? Nếu không biết qui tắc thì làm sao thao tác được?
 
Lần chỉnh sửa cuối:

po_op_po_op

Thành viên mới
Tham gia ngày
9 Tháng mười một 2006
Bài viết
30
Được thích
0
Điểm
663
Tuổi
36
Nghĩa "chan" là bạn có 1 cột dữ liệu và bạn chia ra chô các ô khác trong 1 vùng chỉ định, và tổng dữ liệu đc chia này = lại cái dữ liệu mà bạn đem đi "chan" kia.
 

siwtom

Thành viên gắn bó
Tham gia ngày
19 Tháng ba 2008
Bài viết
2,128
Được thích
4,180
Điểm
860
Nghĩa "chan" là bạn có 1 cột dữ liệu và bạn chia ra chô các ô khác trong 1 vùng chỉ định, và tổng dữ liệu đc chia này = lại cái dữ liệu mà bạn đem đi "chan" kia.
Chung chung quá. Nếu "qui tắc" chỉ ngắn gọn thế thì ta xét vd. ở dòng 7.
Bạn có ở cột dữ liệu số 34. Chan thế nào? Chan đều? Thế thì A = B = C = D = E = 6,8
Sao, không được à? Thế thì phải giải thích thêm cái "chan" ngắn đến dễ sợ kia. Ta thêm nhé: Chia lấy thương nguyên dương? Thế thì A = B = C = D = E = 6. Còn lại 4 thì làm gì với nó đây? Từ cái "chan" ngắn cũn cỡn kia không biết được phải làm gì với cái 4 này cả. Bổ sung thêm nhé: Số 4 này bổ sung cho một số ô được chọn ngẫu nhiên. Được thôi, nhưng số 4 này được bổ sung cho 4 (hay 3, 2, 1) ô được chọn ngẫu nhiên trong 5 ô kia? Từ qui tắc "chan" ngắn kia không biết phải làm gì. Chọn 4 ô bất kỳ hay 3, 2, 1 ô để chan đều? Và nếu lại còn dư thì lại chọn ... để chan đều? Như thế cái qui tắc kia nó đâu có ngắn và chung chung như bạn đã viết?
Bạn chỉ cho vd. nhưng cho dù bạn cho 1000 vd. thì nó chũng chỉ là vd. chứ từ 1000 vd. cũng không thể suy ra qui tắc được. Bởi cái qui tắc đoán trên cơ sở 1000 dữ liệu có thể vẫn khác với qui tắc thực (tức qui tắc của bạn nhưng bạn không phát biểu rõ ra). Rất có thể với 1000 dữ liệu cụ thể này thì qui tắc đoán mò trên cơ sở 1000 dữ liệu đúng với qui tắc thực nhưng với dữ liệu 1001 nào đó thì nó lại không đúng với qui tắc thực.
Thôi, tôi không hiểu nên hỏi thế thôi. Chúc bạn có được kết quả theo ý mình.
 
Lần chỉnh sửa cuối:

ndu96081631

Huyền thoại GPE
Thành viên BQT
Super Moderator
Tham gia ngày
5 Tháng sáu 2008
Bài viết
30,269
Được thích
52,662
Điểm
11,910
Mình dùng 1 bảng test khác để thử công thức của tiền bối ndu96081631 ( mình rất thích ý tưởng của ndu96081631, vì mình dùng công thức excel chủ yếu để chủ động )
và mình gửi lại 1 file có vẻ chưa đc thuận lợi lắm. Nên mặt dày mong các bạn xem giúp mình. Vấn để là ở SheetB1 và cột chênh lệch :((. mình tính cho 2 cột này =0
Mong các bạn giúp mình hướng giải quyết với
Tôi sửa sơ qua hàm thế này:
PHP:
Function DistNum(ByVal Num As Double, ByVal Amount As Long)
  Dim dRem As Double, lQuot As Long, i As Long
  Dim Arr() As Double
  On Error Resume Next
  ReDim Arr(1 To Amount)
  lQuot = Int(Num / Amount)
  dRem = Num - lQuot * Amount
  dRem = Round(dRem, 4)
  For i = 1 To Amount
    Arr(i) = lQuot + IIf(dRem >= 1, 1, dRem)
    dRem = dRem - IIf(dRem > 1, 1, dRem)
  Next
  DistNum = Draw(Arr, Amount)
End Function
Cũng không chắc có đúng ý bạn hay không? (nói thiệt là tôi rất ngán mấy cái INT và MOD trong VBA ---> Toàn cho kết quả sai bét)
Lưu ý
- hàm mảng này khi dùng phải quét 1 lần nhiều cell rồi gõ công thức trên thanh Formula, sau đó bấm tổ hợp phím Ctrl + Shift + Enter.
- Bạn không thể gõ vào 1 cell rồi kéo fill sang các cell khác ---> Kết quả sẽ sai
 

File đính kèm

Top Bottom