Nhờ kiểm tra Code tự động điền vào các vùng khác nhau trong 1 bảng tính (1 người xem)

Liên hệ QC

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

khuongvietphong

Be all you can be !
Tham gia
6/7/14
Bài viết
2,069
Được thích
1,444
Nghề nghiệp
Ăn không ngồi rồi ^.^
Nhờ các anh chị kiểm tra giúp em xem đoạn Code trong File nó bị "bệnh" gì mà khi chạy lại báo lỗi ạ.

Chi tiết và ví dụ cụ thể em ghi trong File rồi đó. Em cảm ơn mọi người !
 

File đính kèm

bạn thêm lệnh
Application.EnableEvents = False

OK. Tớ cám ơn bạn nhiều nhé. Mình dùng sự kiện Change suốt ngày bị thiếu cặp lệnh này:
Mã:
[COLOR=#000000]Application.EnableEvents = False
[/COLOR][COLOR=#000000]Application.EnableEvents = True

Trí nhớ vô cùng tồi . Làm riết rồi mà vẫn quên hoài ...THANK YOU ![/COLOR]
 
Upvote 0
Thêm EnableEvents = False và EnableEvents = True
Ngoài ra. thiếu 1 điều kiện là không ghi đè lên giá trị đã có
 
Upvote 0
Nhờ các anh chị kiểm tra giúp em xem đoạn Code trong File nó bị "bệnh" gì mà khi chạy lại báo lỗi ạ.

Chi tiết và ví dụ cụ thể em ghi trong File rồi đó. Em cảm ơn mọi người !

anh Tiêu Phong viết code "dữ" quá , ngưỡng mộ ;;;;;;;;;;;;;;;;;;;;;;
Giờ em có thắc mắc nhỏ nhờ anh Tiêu Phong giúp đở
em có vùng 8 ô x 8 ô
giờ người dùng đặt con hậu lên 1 vị trí bất kì , làm sao tự điền 7 con hậu vào 7 vị trí còn lại sao cho không có con nào ăn được con nào . Em nghĩ mãi chưa ra nhờ anh Tiêu Phong giúp với . hi hi !$@!!!$@!!
 
Upvote 0
anh Tiêu Phong viết code "dữ" quá , ngưỡng mộ ;;;;;;;;;;;;;;;;;;;;;;

Đừng chọc quê em mà anh !!
Giờ em có thắc mắc nhỏ nhờ anh Tiêu Phong giúp đở
em có vùng 8 ô x 8 ô
giờ người dùng đặt con hậu lên 1 vị trí bất kì , làm sao tự điền 7 con hậu vào 7 vị trí còn lại sao cho không có con nào ăn được con nào . Em nghĩ mãi chưa ra nhờ anh Tiêu Phong giúp với . hi hi !$@!!!$@!!

Chết cha .. bị anh đố khó rồi ...Hãy cho em thời gian anh nhé ...
 
Upvote 0
anh Tiêu Phong viết code "dữ" quá , ngưỡng mộ ;;;;;;;;;;;;;;;;;;;;;;
Giờ em có thắc mắc nhỏ nhờ anh Tiêu Phong giúp đở
em có vùng 8 ô x 8 ô
giờ người dùng đặt con hậu lên 1 vị trí bất kì , làm sao tự điền 7 con hậu vào 7 vị trí còn lại sao cho không có con nào ăn được con nào . Em nghĩ mãi chưa ra nhờ anh Tiêu Phong giúp với . hi hi !$@!!!$@!!

1. Hậu không ăn được lẫn nhau:
- Không cùng dòng hoặc cột (dễ)
- Không cùng đường chéo: abs(row2 - row1) <> abs(column2 - column1)

2. Phương pháp:
Kiểm tra không cùng đường chéo: Tuần tự kiểm tra 2 và 1, 3 và 2, 4 và 3, ... 8 và 7

3. Lập trình:
Khoan làm 8 con, làm 2 con trước, rồi 3 con, 4 con. Nếu 4 con đúng thì làm 8 con.
 
Upvote 0
vùng 8 ô x 8 ô
giờ người dùng đặt con hậu lên 1 vị trí bất kì , làm sao tự điền 7 con hậu vào 7 vị trí còn lại sao cho không có con nào ăn được con nào

Bài này khó qua anh ơi, không giống với bài trên, ta không thể xếp 1 cách tùy tiện được. Nếu lúc như lúc đầu mình thích

đặt con hậu ở đâu thì đặt thì sẽ có trường hợp xếp không đủ 8 con trên bàn cờ được.
 
Upvote 0
Bài này khó qua anh ơi, không giống với bài trên, ta không thể xếp 1 cách tùy tiện được. Nếu lúc như lúc đầu mình thích

đặt con hậu ở đâu thì đặt thì sẽ có trường hợp xếp không đủ 8 con trên bàn cờ được.

ờ , bài đó chỉ dành để làm khi nào quá rảnh , giúp luyện kĩ năng suy luận , không nhất thiết phải làm ra ngay .
đến 1 lúc nào đó đủ "nội công" , tự nhiên em sẽ làm được thôi mà .
 
Upvote 0
Upvote 0
Bài này khó qua anh ơi, không giống với bài trên, ta không thể xếp 1 cách tùy tiện được. Nếu lúc như lúc đầu mình thích

đặt con hậu ở đâu thì đặt thì sẽ có trường hợp xếp không đủ 8 con trên bàn cờ được.
Hình như đúng vậy, tôi chưa thử sắp lần nào được 8 con kể cả sắp bằng tay.

Sau đây là code sắp 7 con, thủ thuật đơn giản:

PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
Dim BanCo As Range, i As Long, j As Long, Rw As Long, Col As Long
Dim Giatri


Set BanCo = Sheet1.Range("F3:M10")
Rw = Target.Row - 2: Col = Target.Column - 5
Giatri = Target.Value
BanCo.ClearContents
Target.Value = Giatri
x = Rw: y = Col
If Not Intersect(Target, BanCo) Is Nothing Then
    If Target.Count > 1 Then GoTo ExitSub
    For i = Rw To Rw + 5
        x = (x + 2)
        If x > 8 Then x = x Mod 8 + 1
        y = (y + 1)
        If y > 8 Then y = y Mod 8 + 1
        BanCo(x, y) = Giatri
    Next i
End If
ExitSub:
Application.EnableEvents = True
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Upvote 0
Những bài kinh điển thế này search google ra cả đống ngay. Thử không google xem sao. Có thể lập 1 hàm với tham số là mảng arr (), mảng này có 8 phần tử, arr (i) là cột của con hậu trên hàng i, arr (i)=0 hàng i chưa có con nào, các phần tử của mảng có giá trị từ 0 đên 8 và các số dương thì khác nhau. Ta xét i từ 1 đến 8,nếu arr (i)=0 thì gán giá trị >0 rồi gọi đệ quy với mảng mới. Không biết máy có chịu nổi không
 
Upvote 0
Phong có hình của 1 đáp án nào đó không?

dạ em xếp "hên xui" được vài hình nè thầy . --=0--=0

a33cf111422d8926e7edfbfb755eb27b.png
 
Upvote 0
Bài này khó qua anh ơi, không giống với bài trên, ta không thể xếp 1 cách tùy tiện được. Nếu lúc như lúc đầu mình thích

đặt con hậu ở đâu thì đặt thì sẽ có trường hợp xếp không đủ 8 con trên bàn cờ được.

mình nghe "giang hồ" nói là đặt 1 con đầu tiên ở bất cứ chỗ nào cũng sẽ tìm được hộ khẩu cho 7 em còn lại đấy . +-+-+-++-+-+-++-+-+-+
 
Upvote 0
Lúc đầu mình lo tràn bộ nhớ khi dùng đệ quy, sau mới thấy có 8! khoảng 40k khả năng thì đệ quy đơn giản. Để tạo ra các hoán vị, mình lập hàm tham số n là kích thước bàn cờ, hàm trả về mảng, mỗi phần tử mảng là chuỗi chỉ vị trí con hậu. Hàm được lập bằng đệ quy, với mỗi chuỗi gồm các ký tự từ 1 đến n-1 ta nhét thêm ký tự n vào n vị trí. Ví dụ từ chuỗi 12 là các con hậu ở hàng 1 cột 1, hàng 2 cột 2; ta thêm số 3 thành 312, 132, 123. Sau khi có tất cả 8! hoán vị thì kiểm tra từng hoán vị bằng cách tách các chữ số trong chuỗi vào mảng a (1 to 8) chẳng hạn rồi kiểm tra xem a(i)+i và a (i)-i có trùng nhau không. Kết quả hình như có 92 cách xếp 8 con hậu, sau đó lọc ra các cách xếp có con hậu ở vị trí cho trước.
 
Lần chỉnh sửa cuối:
Upvote 0
Lúc đầu mình lo tràn bộ nhớ khi dùng đệ quy, sau mới thấy có 8! khoảng 40k khả năng thì đệ quy đơn giản. Để tạo ra các hoán vị, mình lập hàm tham số n là kích thước bàn cờ, hàm trả về mảng, mỗi phần tử mảng là chuỗi chỉ vị trí con hậu. Hàm được lập bằng đệ quy, với mỗi chuỗi gồm các ký tự từ 1 đến n-1 ta nhét thêm ký tự n vào n vị trí. Ví dụ từ chuỗi 12 là các con hậu ở hàng 1 cột 1, hàng 2 cột 2; ta thêm số 3 thành 312, 132, 123. Sau khi có tất cả 8! hoán vị thì kiểm tra từng hoán vị bằng cách tách các chữ số trong chuỗi vào mảng a (1 to 8) chẳng hạn rồi kiểm tra xem a(i)+i và a (i)-i có trùng nhau không. Kết quả hình như có 92 cách xếp 8 con hậu, sau đó lọc ra các cách xếp có con hậu ở vị trí cho trước.

ờ được rồi . Lúc đầu tôi không tính làm vì khả năng 99% em Phong không biết đệ quy , có làm cũng như không
Bây giờ có "người lớn" tham gia thì lại phải tính khác . Nếu sẵn lòng , mời bạn góp vui vài đoạn code theo ý tưởng của bạn để giải bài toán này : đặt trước 1 con ở vị trí bất kì , tìm chỗ cho 7 con còn lại . Để đơn giản ta chỉ lấy kết quả đầu tiên tìm được .
Theo như bạn diễn tả thì ý tưởng của bạn khác tôi rồi đấy , bạn cứ ra tay trước rồi tôi cũng góp vui sau để tất cả cùng học nhé . ;;;;;;;;;;;;;;;;;;;;;;
 
Upvote 0
Tiếc là máy tính mình hỏng ngay sau khi tìm được 92 cách xếp 8 con hậu. Không biết có sửa kịp trong ngày hôm nay không.
 
Upvote 0
Làm góp vui, code không đẹp nhưng chạy được, các bạn góp ý dùm cám ơn
 

File đính kèm

Upvote 0
Thử mò đại ai ngờ thấy không sai.

Vì còn nhiều người có nhiều cách khác nên tạm thời chưa công bố code. Code sẽ công bố khi không còn người tham gia viết code cho bài này.

Code này tìm thấy thì dừng chứ không tìm hết.
 

File đính kèm

Upvote 0
Tiếc là máy tính mình hỏng ngay sau khi tìm được 92 cách xếp 8 con hậu. Không biết có sửa kịp trong ngày hôm nay không.

Không biết có bao nhiêu cách nhưng đủ 8 ô thì dừng.
Nhập thí thí cái gì đó vào trong khung.
----------------------
Bài này viết theo ý của "Lão chết tiệt" ở bài #8
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Không biết có bao nhiêu cách nhưng đủ 8 ô thì dừng.
Nhập thí thí cái gì đó vào trong khung.
----------------------
Bài này viết theo ý của "Lão chết tiệt" ở bài #8

Hì hì, mở xem Code của thầy thấy ngắn --> mừng quá --> cứ tưởng thế là bài này giải quyết được ngắn gọn vầy là ngon rồi. Chốc

quay ra thử ai zè thấy kết quả bị trật thầy ạ
 
Upvote 0
Hì hì, mở xem Code của thầy thấy ngắn --> mừng quá --> cứ tưởng thế là bài này giải quyết được ngắn gọn vầy là ngon rồi. Chốc

quay ra thử ai zè thấy kết quả bị trật thầy ạ
Bác Ba chưa nắm quy tắc trò chơi rồi --=0
Đây là tất cả các cách xếp. Đúng là có 92 cách xếp khác nhau.

Code sẽ được post sau.
 

File đính kèm

Upvote 0
Bác Ba chưa nắm quy tắc trò chơi rồi --=0
Đây là tất cả các cách xếp. Đúng là có 92 cách xếp khác nhau.

Code sẽ được post sau.

Híc!
Hình như tôi chỉ làm theo ý của "Lão chết tiệt" ở bài #8 gợi ý cách giải bài #7 mà.
Tìm 8 vị trí bất kỳ để con Hậu không "ăn" được 8 con Hậu khác!
Nếu hiểu sai thì "già rồi lẩm cẩm" thiệt.
 
Lần chỉnh sửa cuối:
Upvote 0
Híc!
Hình như tôi chỉ làm theo ý của "Lão chết tiệt" ở bài #8 gợi ý cách giải bài #7 mà.
Tìm 8 vị trí bất kỳ để con Hậu không "ăn" được 8 con Hậu khác!
Nếu hiểu sai thì "già rồi lẩm cẩm" thiệt.
Làm như lão chết tiệt không nói sai bao giờ á. Nhưng dù sai cũng ngó kết quả 1 cái chứ bạn già.
Ý của tui là vừa không cùng dòng cột, vừa không cùng đường chéo. Nhưng lẽ ra con thứ i phải so với tất cả (i - 1) con đã có trước nó, chứ không chỉ so với con liền kề.
Có điều dùng vòng lặp sắp tuần tự đến hết là không được.
 
Upvote 0
Làm như lão chết tiệt không nói sai bao giờ á. Nhưng dù sai cũng ngó kết quả 1 cái chứ bạn già.
Ý của tui là vừa không cùng dòng cột, vừa không cùng đường chéo. Nhưng lẽ ra con thứ i phải so với tất cả (i - 1) con đã có trước nó, chứ không chỉ so với con liền kề.
Có điều dùng vòng lặp sắp tuần tự đến hết là không được.

Ái da!
Đúng là hồ đồ vì không "gành" về con Hậu.
Tôi chưa xét trường hợp 8 con hậu không "ăn" được lẫn nhau nữa.
Xin chịu. Xin chịu ... lỗi. Sẽ "ngâm kiếu" lại.
 
Upvote 0
Mình up code của mình, gõ chữ "x" vào ô bất kỳ trên bàn cờ. Chạy sub main để điền các ô còn lại.
 

File đính kèm

Upvote 0
mình cũng góp vui vài đoạn -+*/-+*/

Code tại sự kiện change của sheet ( vùng B8:I16)

Mã:
Private Sub Worksheet_Change(ByVal target As Range)
Dim myRgn As Range
Set myRgn = Me.Range("B" & "8" & ":" & "I" & "1" & "5")
If target.Count = 1 Then
If Not Intersect(target, myRgn) Is Nothing Then
If target.Value <> "" Then
Func1 myRgn, target
Else: myRgn.ClearContents: End If: End If: End If: End Sub

code tại Module

Mã:
Private gbVar1 As Long


Sub Func1(ByVal pram1 As Range, ByVal pram2 As Range)
Dim Var1() As Boolean, Var2(1 To 8, 1 To 8) As String, Var4 As Long, Var5 As Long
ReDim Var1(1 To pram1.Rows.Count, 1 To pram1.Columns.Count)
Var1(pram2.Row - pram1.Row + 1, pram2.Column - pram1.Column + 1) = True
gbVar1 = 0
Func2 Var1, 1
For Var4 = 1 To 8
For Var5 = 1 To 8
If Var1(Var4, Var5) Then Var2(Var4, Var5) = pram2.Value
Next
Next
pram1.Value = Var2
End Sub


Private Sub Func2(ByRef Var1() As Boolean, ByVal pram4 As Long)
Dim Var4 As Long, Var5 As Long, Var8, Var9 As Long
If gbVar1 = 8 Then Exit Sub
For Var4 = 1 To 8
If Var1(pram4, Var4) Then
Func2 Var1, pram4 + 1
Exit Sub
End If
Next
Var8 = Var1
For Var9 = 1 To 8
If gbVar1 = 8 Then Exit Sub
Var1 = Var8
Var1(pram4, Var9) = True
If Not Func3(Var1) Then
Func2 Var1, pram4 + 1
End If
Next
End Sub




Function Func3(ByRef Var1() As Boolean) As Boolean
Dim Var4 As Long, Var5 As Long, Var12 As Boolean
For Var4 = 1 To 8
Var12 = False
For Var5 = 1 To 8
If Var1(Var4, Var5) And Var12 Then
Func3 = True
Exit Function
Else
Var12 = Var1(Var4, Var5) Or Var12
End If
Next
Var12 = False
For Var5 = 1 To 8
If Var1(Var5, Var4) And Var12 Then
Func3 = True
Exit Function
Else
Var12 = Var1(Var5, Var4) Or Var12
End If
Next
Next
For Var4 = 1 To 7
Var12 = False
For Var5 = 1 To Var4
If Var1(Var4 - Var5 + 1, Var5) And Var12 Then
Func3 = True
Exit Function
Else
Var12 = Var1(Var4 - Var5 + 1, Var5) Or Var12
End If
Next
Var12 = False
For Var5 = 1 To 9 - Var4
If Var1(Var4 + Var5 - 1, Var5) And Var12 Then
Func3 = True
Exit Function
Else
Var12 = Var1(Var4 + Var5 - 1, Var5) Or Var12
End If
Next
Var12 = False
For Var5 = 9 - Var4 To 8
If Var1(Var4 + Var5 - 8, Var5) And Var12 Then
Func3 = True
Exit Function
Else
Var12 = Var1(Var4 + Var5 - 8, Var5) Or Var12
End If
Next
Var12 = False
For Var5 = Var4 To 8
If Var1(8 + Var4 - Var5, Var5) And Var12 Then
Func3 = True
Exit Function
Else
Var12 = Var1(8 + Var4 - Var5, Var5) Or Var12
End If
Next
Next
gbVar1 = 0
For Var4 = 1 To 8
For Var5 = 1 To 8
If Var1(Var4, Var5) Then gbVar1 = gbVar1 + 1
Next
Next
End Function
 
Upvote 0
Như được dịch ngược bằng VB decompiler. Đề nghị bỏ mấy dòng khai báo biến đi cho khó hiểu hơn!
 
Upvote 0
được dịch từ VBA sang VBA , đố bạn biết VBA gốc nằm ở đâu ? +-+-+-++-+-+-+
Code này đơn giản nên việc tìm và thay thế cũng không mấy khó khăn. Chỉ có điều tên biến không mô tả nội dung nó lưu trữ nên việc đọc cũng hơi khó khăn. Nếu một dự án lớn thì việc dịch ngược cũng mất không ít thời gian à --=0

Đã vậy thì tôi gửi code luôn vậy.

Cũng dạng này nhưng có đề bài khó hơn: Viết code giải ô số Sudoku. Ai có hứng thú thì nhào vô --=0
 

File đính kèm

Upvote 0
Code này đơn giản nên việc tìm và thay thế cũng không mấy khó khăn. Chỉ có điều tên biến không mô tả nội dung nó lưu trữ nên việc đọc cũng hơi khó khăn. Nếu một dự án lớn thì việc dịch ngược cũng mất không ít thời gian à --=0

Đã vậy thì tôi gửi code luôn vậy.

Cũng dạng này nhưng có đề bài khó hơn: Viết code giải ô số Sudoku. Ai có hứng thú thì nhào vô --=0

mình không được học hành gì nhiều , nên chỉ biết tự viết mã để replace các kí tự thôi à
Nếu có lòng , mời bạn cho mình thưởng thức dự án không nhỏ nào đó để giúp mình hoàn thiện cỗ máy replace với -+*/-+*/

Đây là cách của mình với bài này , code đặt chung hết vào module của sheet

Mã:
Option Explicit
Private userRow As Long, userCol As Long, EndGame As Boolean, strResult As String


Private Sub Worksheet_Change(ByVal target As Range)
Dim BanCo As Range, giatri, r As Long
EndGame = False
Set BanCo = Sheet1.Range("B8:I16")
giatri = target.Value
If Not IsArray(giatri) And Not Intersect(target, BanCo) Is Nothing Then
    userRow = target.Row - 7
    userCol = target.Column - 1
    hell 1, ""
    If EndGame Then
        Application.EnableEvents = False
        BanCo.ClearContents
        For r = 1 To 8 Step 1
            BanCo(Mid(strResult, r, 1), r) = giatri
        Next
        Application.EnableEvents = True
    Else
        MsgBox "ho^ng? tim` thay'"
    End If
End If
End Sub


Private Sub hell(Col As Long, tmp As String)
Dim r As Long, u As Long
If Not EndGame Then
    If Col < 9 Then
        If Col <> userCol Then
            For r = 1 To 8 Step 1
                If InStr(1, tmp, r) = 0 And r <> userRow Then
                    For u = 1 To Col - 1 Step 1
                        If Abs(Mid(tmp, u, 1) - r) = Col - u Then Exit For
                    Next
                    If u > Col - 1 And Abs(userRow - r) <> Abs(userCol - Col) Then hell Col + 1, tmp & r
                End If
            Next
        Else
            hell Col + 1, tmp & userRow
        End If
    Else
        EndGame = True
        strResult = tmp
    End If
End If
End Sub

Nếu thích giao lưu Soduku mà phải điền bằng tay thì khổ lắm
Bạn có lòng tốt thì giúp mọi người 1 đoạn code lấy đề bài Sudoku từ trên mạng xuống trước đi , để có cái mà làm . --=0--=0
 

File đính kèm

Upvote 0

File đính kèm

Upvote 0
mình không được học hành gì nhiều , nên chỉ biết tự viết mã để replace các kí tự thôi à
Nếu có lòng , mời bạn cho mình thưởng thức dự án không nhỏ nào đó để giúp mình hoàn thiện cỗ máy replace với -+*/-+*/
Tôi dịch bằng VBA nên cũng chẳng có gì ngạc nhiên khi một ai đó dùng VBA để dịch lại. Tuy nhiên cũng bởi vì tôi tự làm nên tôi biết không đơn giản chỉ là thay thế các biến.

Dự án lớn thì tôi không tiện đưa lên. Nhưng nếu bạn có hứng thú thì tạm nghiên cứu file này trước vậy.
Nếu thích giao lưu Soduku mà phải điền bằng tay thì khổ lắm
Bạn có lòng tốt thì giúp mọi người 1 đoạn code lấy đề bài Sudoku từ trên mạng xuống trước đi , để có cái mà làm . --=0--=0
Đề Sudoku thì dễ thôi. Bạn HieuCD đã đưa lên rồi đấy. Chắc đủ cho bạn test, khỏi cần lấy trên mạng nữa nhỉ.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Nếu các bạn cần đáp án để test, mình sẽ gởi lên
 
Upvote 0
Nếu các bạn cần đáp án để test, mình sẽ gởi lên

đáp án nghĩa là code giải sudoku hả ? gửi đi bạn . Tôi đang thắc không biết mình có sai ở đâu không mà sao thấy bài này dễ quá , nhiều khi tôi lầm ở đâu chăng ? nên bạn cho tôi tham khảo code của bạn nhé . !$@!!!$@!!
 
Upvote 0
đáp án nghĩa là code giải sudoku hả ? gửi đi bạn . Tôi đang thắc không biết mình có sai ở đâu không mà sao thấy bài này dễ quá , nhiều khi tôi lầm ở đâu chăng ? nên bạn cho tôi tham khảo code của bạn nhé . !$@!!!$@!!
kết quả thôi, còn code của mình không đúng nghĩa là code, chỉ làm bán thủ công thôi
 
Upvote 0
giải được tức là nội công đã tăng lên , sắp trở thành cao thủ , sướng nhé . /-*+//-*+/

Trời trời ... cao thủ gì đâu anh, tại giải được câu đố của anh xong thấy vui vui vậy thôi...hì hì ..

Vui thì cũng thấy vui nhưng mà cũng hơi buồn, tại vì suốt từ qua tới cả buổi sáng hôm nay nay cứ chăm chăm cái bài toán này mà bỏ bê cả vụ ôn thi . Kết quả chiều nay đi thi làm bài nát bét hết anh ạ ...:;;;::::;;;:::
 
Lần chỉnh sửa cuối:
Upvote 0
đây cũng là ví dụ hay để luyện tư duy , tôi làm phát trước vậy

Mã:
Option Explicit


Private arrResult


Public Sub hello()
Dim arr, r As Long, c As Long, dArr, str As String
arr = Sheet2.Range("A12").Resize(9, 9).Value
arrResult = ""
Solve arr
Sheet2.Range("M2").Resize(9, 9).ClearContents
Sheet2.Range("M2").Resize(9, 9).Value = arrResult
End Sub


Private Sub Solve(ByVal arr)
If Not IsArray(arrResult) Then
    Dim r As Long, c As Long, tmpMin(1 To 3), str, has1situ As Boolean
    For r = 1 To 9 Step 1
        For c = 1 To 9 Step 1
            If arr(r, c) = "" Then
                str = situ(r, c, arr)
                If Len(str) = 0 Then GoTo kt
                If Len(str) = 1 Then
                    arr(r, c) = str
                    has1situ = True
                Else
                    If Not has1situ Then
                        If Len(tmpMin(3)) = 0 Or Len(str) < Len(tmpMin(3)) Then
                            tmpMin(1) = r: tmpMin(2) = c: tmpMin(3) = str
                        End If
                    End If
                End If
            End If
        Next
    Next
    If IsFinish(arr) Then
        arrResult = arr
    Else
        If has1situ Then
            Solve arr
        Else
            For r = 1 To Len(tmpMin(3)) Step 1
                arr(tmpMin(1), tmpMin(2)) = Mid(tmpMin(3), r, 1)
                Solve arr
            Next
        End If
    End If
End If
kt:
End Sub


'get all situation for target cell ( i , j)
Private Function situ(i As Long, j As Long, arr) As String
Dim r As Long, c As Long
situ = "123456789"
For c = 1 To 9 Step 1
    If arr(i, c) <> "" Then situ = Replace(situ, arr(i, c), "")
Next
For r = 1 To 9 Step 1
    If arr(r, j) <> "" Then situ = Replace(situ, arr(r, j), "")
Next
For r = 3 * WorksheetFunction.RoundUp(i / 3, 0) - 2 To 3 * WorksheetFunction.RoundUp(i / 3, 0) Step 1
    For c = 3 * WorksheetFunction.RoundUp(j / 3, 0) - 2 To 3 * WorksheetFunction.RoundUp(j / 3, 0) Step 1
        If arr(r, c) <> "" Then situ = Replace(situ, arr(r, c), "")
    Next
Next
End Function


Private Function IsFinish(arr) As Boolean
Dim r As Long, c As Long
IsFinish = False
For r = 1 To 9 Step 1
    For c = 1 To 9 Step 1
        If arr(r, c) = "" Then Exit Function
    Next
Next
IsFinish = True
End Function
 

File đính kèm

Upvote 0
đường chéo là cái gì ? không hiểu ?
[TABLE="width: 261"]
[TR]
[TD]2[/TD]
[TD]3[/TD]
[TD]9[/TD]
[TD]5[/TD]
[TD]8[/TD]
[TD]7[/TD]
[TD]1[/TD]
[TD]6[/TD]
[TD]4[/TD]
[/TR]
[TR]
[TD]8[/TD]
[TD]1[/TD]
[TD]6[/TD]
[TD]9[/TD]
[TD]2[/TD]
[TD]4[/TD]
[TD]7[/TD]
[TD]5[/TD]
[TD]3[/TD]
[/TR]
[TR]
[TD]7[/TD]
[TD]4[/TD]
[TD]5[/TD]
[TD]3[/TD]
[TD]1[/TD]
[TD]6[/TD]
[TD]2[/TD]
[TD]9[/TD]
[TD]8[/TD]
[/TR]
[TR]
[TD]6[/TD]
[TD]5[/TD]
[TD]7[/TD]
[TD]4[/TD]
[TD]3[/TD]
[TD]9[/TD]
[TD]8[/TD]
[TD]1[/TD]
[TD]2[/TD]
[/TR]
[TR]
[TD]1[/TD]
[TD]8[/TD]
[TD]4[/TD]
[TD]6[/TD]
[TD]7[/TD]
[TD]2[/TD]
[TD]5[/TD]
[TD]3[/TD]
[TD]9[/TD]
[/TR]
[TR]
[TD]9[/TD]
[TD]2[/TD]
[TD]3[/TD]
[TD]8[/TD]
[TD]5[/TD]
[TD]1[/TD]
[TD]4[/TD]
[TD]7[/TD]
[TD]6[/TD]
[/TR]
[TR]
[TD]5[/TD]
[TD]6[/TD]
[TD]2[/TD]
[TD]7[/TD]
[TD]9[/TD]
[TD]8[/TD]
[TD]3[/TD]
[TD]4[/TD]
[TD]1[/TD]
[/TR]
[TR]
[TD]3[/TD]
[TD]9[/TD]
[TD]8[/TD]
[TD]1[/TD]
[TD]4[/TD]
[TD]5[/TD]
[TD]6[/TD]
[TD]2[/TD]
[TD]7[/TD]
[/TR]
[TR]
[TD]4[/TD]
[TD]7[/TD]
[TD]1[/TD]
[TD]2[/TD]
[TD]6[/TD]
[TD]3[/TD]
[TD]9[/TD]
[TD]8[/TD]
[TD]5[/TD]
[/TR]
[/TABLE]
là đường màu đỏ xanh không được trùng
 
Upvote 0
[TABLE="width: 261"]
[TR]
[TD]2[/TD]
[TD]3[/TD]
[TD]9[/TD]
[TD]5[/TD]
[TD]8[/TD]
[TD]7[/TD]
[TD]1[/TD]
[TD]6[/TD]
[TD]4[/TD]
[/TR]
[TR]
[TD]8[/TD]
[TD]1[/TD]
[TD]6[/TD]
[TD]9[/TD]
[TD]2[/TD]
[TD]4[/TD]
[TD]7[/TD]
[TD]5[/TD]
[TD]3[/TD]
[/TR]
[TR]
[TD]7[/TD]
[TD]4[/TD]
[TD]5[/TD]
[TD]3[/TD]
[TD]1[/TD]
[TD]6[/TD]
[TD]2[/TD]
[TD]9[/TD]
[TD]8[/TD]
[/TR]
[TR]
[TD]6[/TD]
[TD]5[/TD]
[TD]7[/TD]
[TD]4[/TD]
[TD]3[/TD]
[TD]9[/TD]
[TD]8[/TD]
[TD]1[/TD]
[TD]2[/TD]
[/TR]
[TR]
[TD]1[/TD]
[TD]8[/TD]
[TD]4[/TD]
[TD]6[/TD]
[TD]7[/TD]
[TD]2[/TD]
[TD]5[/TD]
[TD]3[/TD]
[TD]9[/TD]
[/TR]
[TR]
[TD]9[/TD]
[TD]2[/TD]
[TD]3[/TD]
[TD]8[/TD]
[TD]5[/TD]
[TD]1[/TD]
[TD]4[/TD]
[TD]7[/TD]
[TD]6[/TD]
[/TR]
[TR]
[TD]5[/TD]
[TD]6[/TD]
[TD]2[/TD]
[TD]7[/TD]
[TD]9[/TD]
[TD]8[/TD]
[TD]3[/TD]
[TD]4[/TD]
[TD]1[/TD]
[/TR]
[TR]
[TD]3[/TD]
[TD]9[/TD]
[TD]8[/TD]
[TD]1[/TD]
[TD]4[/TD]
[TD]5[/TD]
[TD]6[/TD]
[TD]2[/TD]
[TD]7[/TD]
[/TR]
[TR]
[TD]4[/TD]
[TD]7[/TD]
[TD]1[/TD]
[TD]2[/TD]
[TD]6[/TD]
[TD]3[/TD]
[TD]9[/TD]
[TD]8[/TD]
[TD]5[/TD]
[/TR]
[/TABLE]
là đường màu đỏ xanh không được trùng

à ra vậy , thì đấy là lưu ý cho các bạn viết code sau nhớ thêm vào .
 
Upvote 0
[TABLE="width: 261"]
[TR]
[TD]2[/TD]
[TD]3[/TD]
[TD]9[/TD]
[TD]5[/TD]
[TD]8[/TD]
[TD]7[/TD]
[TD]1[/TD]
[TD]6[/TD]
[TD]4[/TD]
[/TR]
[TR]
[TD]8[/TD]
[TD]1[/TD]
[TD]6[/TD]
[TD]9[/TD]
[TD]2[/TD]
[TD]4[/TD]
[TD]7[/TD]
[TD]5[/TD]
[TD]3[/TD]
[/TR]
[TR]
[TD]7[/TD]
[TD]4[/TD]
[TD]5[/TD]
[TD]3[/TD]
[TD]1[/TD]
[TD]6[/TD]
[TD]2[/TD]
[TD]9[/TD]
[TD]8[/TD]
[/TR]
[TR]
[TD]6[/TD]
[TD]5[/TD]
[TD]7[/TD]
[TD]4[/TD]
[TD]3[/TD]
[TD]9[/TD]
[TD]8[/TD]
[TD]1[/TD]
[TD]2[/TD]
[/TR]
[TR]
[TD]1[/TD]
[TD]8[/TD]
[TD]4[/TD]
[TD]6[/TD]
[TD]7[/TD]
[TD]2[/TD]
[TD]5[/TD]
[TD]3[/TD]
[TD]9[/TD]
[/TR]
[TR]
[TD]9[/TD]
[TD]2[/TD]
[TD]3[/TD]
[TD]8[/TD]
[TD]5[/TD]
[TD]1[/TD]
[TD]4[/TD]
[TD]7[/TD]
[TD]6[/TD]
[/TR]
[TR]
[TD]5[/TD]
[TD]6[/TD]
[TD]2[/TD]
[TD]7[/TD]
[TD]9[/TD]
[TD]8[/TD]
[TD]3[/TD]
[TD]4[/TD]
[TD]1[/TD]
[/TR]
[TR]
[TD]3[/TD]
[TD]9[/TD]
[TD]8[/TD]
[TD]1[/TD]
[TD]4[/TD]
[TD]5[/TD]
[TD]6[/TD]
[TD]2[/TD]
[TD]7[/TD]
[/TR]
[TR]
[TD]4[/TD]
[TD]7[/TD]
[TD]1[/TD]
[TD]2[/TD]
[TD]6[/TD]
[TD]3[/TD]
[TD]9[/TD]
[TD]8[/TD]
[TD]5[/TD]
[/TR]
[/TABLE]
là đường màu đỏ xanh không được trùng

Mỗi đề Sudoku chỉ có 1 đáp án. Không có chuyện muốn đường chéo không trùng là được đâu.
 
Upvote 0
Mình nhớ nhầm, các bạn thông cảm, bài của bạn Doveandrose giải quá tuyệt, cám ơn bạn
 
Upvote 0
Mình có tập tin trợ giúp giải câu đố gồm 2 sheet
- Sheet Sudoku: chỉ dùng công thức để gợi ý chọn phương án để giải thủ công
- Sheet Kusu: dùng code để giải tự động với đề nhập bất kỳ
 

File đính kèm

Upvote 0
Xem ra mọi người cũng không hứng thú với đề bài này nhỉ.
Đây là cách làm của tôi.
 

File đính kèm

Upvote 0

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

Back
Top Bottom