Dựa vào nội dung trong ô để có thể di chuyển từ Start đến cottage

Liên hệ QC

Quy Vu

Thành viên chính thức
Tham gia
4/8/17
Bài viết
65
Được thích
4
Giới tính
Nam
Xin chào các anh/chị
e xin lời giải cho bài tập VBA này, e gõ code e nghĩ là đúng nhưng mà chỉ chạy được 2 dòng thì dừng
Nội dung đề : Dựa vào nội dung trong ô để có thể di chuyển từ Start đến cottage
1545034722266.png
R: sang phải, D: xuống dưới, L: sang trái, U: đi lên
Đây là code của em
Không biết có sai ở đâu k mà chạy chả được gì cả!
Mã:
Sub baitap13()
Range("D4").Select
ActiveCell.Offset(0, 1).Select
If Selection.Value = "D" Then
ActiveCell.Offset(1, 0).Select
ElseIf Selection.Value = "R" Then
ActiveCell.Offset(0, 1).Select
ElseIf Selection.Value = "U" Then
ActiveCell.Offset(-1, 0).Select
Else
ActiveCell.Offset(0, -1).Select
End If
End Sub
 

File đính kèm

  • RRH maze.xls
    60.5 KB · Đọc: 8
B
Xin chào các anh/chị
e xin lời giải cho bài tập VBA này, e gõ code e nghĩ là đúng nhưng mà chỉ chạy được 2 dòng thì dừng
Nội dung đề : Dựa vào nội dung trong ô để có thể di chuyển từ Start đến cottage
View attachment 209544
R: sang phải, D: xuống dưới, L: sang trái, U: đi lên
Đây là code của em
Không biết có sai ở đâu k mà chạy chả được gì cả!
Mã:
Sub baitap13()
Range("D4").Select
ActiveCell.Offset(0, 1).Select
If Selection.Value = "D" Then
ActiveCell.Offset(1, 0).Select
ElseIf Selection.Value = "R" Then
ActiveCell.Offset(0, 1).Select
ElseIf Selection.Value = "U" Then
ActiveCell.Offset(-1, 0).Select
Else
ActiveCell.Offset(0, -1).Select
End If
End Sub
Bạn đọc lại đề (in English) kỹ ở trang đó đi, bài toán này trong mục vòng lặp
Excel VBA Macros | Loops and conditions exercise | Looping over maze to find cottage
nên phải sử dụng lệnh lặp, và kết hợp với If hoặc Select Case
Lệnh lặp là những lệnh nào thì đọc lý thuyết, rồi quay lại đây tiếp
 
Upvote 0
Chắc là cái tiêu đề bạn ghi chung chung quá.Ghi chi tiết ra nhé.Code của bạn cho thêm cái vòng lặp không xác định vào nữa.Mới chạy được đúng ý.
cám ơn bác, để e ngâm cứu tiếp. Thiệt là khó, cơ mà e đọc code em k thấy sai ở đâu, sao nó lại k chạy nhỉ? hiuhiu
 
Upvote 0
cám ơn bác, để e ngâm cứu tiếp. Thiệt là khó, cơ mà e đọc code em k thấy sai ở đâu, sao nó lại k chạy nhỉ? hiuhiu
Xem lại bài này
B

Bạn đọc lại đề (in English) kỹ ở trang đó đi, bài toán này trong mục vòng lặp
Excel VBA Macros | Loops and conditions exercise | Looping over maze to find cottage
nên phải sử dụng lệnh lặp, và kết hợp với If hoặc Select Case
Lệnh lặp là những lệnh nào thì đọc lý thuyết, rồi quay lại đây tiếp

tức bạn cần sử dụng vòng lặp, nếu không thì code chỉ chạy cell select 1 hay 2 lần
 
Upvote 0
Xem lại bài này


tức bạn cần sử dụng vòng lặp, nếu không thì code chỉ chạy cell select 1 hay 2 lần
Cám ơn bác, em làm được r ạ, mấy cái lý thuyết thì e nắm cũng được tương đối r, cơ mà lúc làm bài tập thì k liên kết lại để làm ra được bài. Huhu, theo cái lập trình này khó thật
Sub baitap13()
Range("D4").Select

ActiveCell.Offset(0, 1).Select
Do Until Selection.Value = "Cottage"
If Selection.Value = "D" Then
ActiveCell.Offset(1, 0).Select
ElseIf Selection.Value = "R" Then
ActiveCell.Offset(0, 1).Select
ElseIf Selection.Value = "U" Then
ActiveCell.Offset(-1, 0).Select
Else
ActiveCell.Offset(0, -1).Select
End If
Loop
End Sub
 
Upvote 0
cám ơn bác, để e ngâm cứu tiếp. Thiệt là khó, cơ mà e đọc code em k thấy sai ở đâu, sao nó lại k chạy nhỉ? hiuhiu
Dùng phương pháp này coi sao. Mắc chi phải vòng lặp
PHP:
Sub CallBaiTap13()
  Range("D4").Select
  baitap13
End Sub
Sub baitap13()
  Application.Wait Now + TimeSerial(0, 0, 1)
  If Selection.Value Like "Start*" Then
    ActiveCell.Offset(0, 1).Select
  ElseIf Selection.Value = "D" Then
    ActiveCell.Offset(1, 0).Select
  ElseIf Selection.Value = "R" Then
    ActiveCell.Offset(0, 1).Select
  ElseIf Selection.Value = "U" Then
    ActiveCell.Offset(-1, 0).Select
  ElseIf Selection.Value = "L" Then
    ActiveCell.Offset(0, -1).Select
  Else
    MsgBox Selection.Value & vbNewLine & Selection.Address(False, False)
    Exit Sub
  End If
    baitap13
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Dùng phương pháp này coi sao. Mắc chi phải vòng lặp
Mã:
Sub CallBaiTap13()
  Range("D4").Select
  baitap13
End Sub
Sub baitap13()
  Application.Wait Now + TimeSerial(0, 0, 1)
  If Selection.Value Like "Start*" Then
    ActiveCell.Offset(0, 1).Select
    baitap13
  ElseIf Selection.Value = "D" Then
    ActiveCell.Offset(1, 0).Select
    baitap13
  ElseIf Selection.Value = "R" Then
    ActiveCell.Offset(0, 1).Select
    baitap13
  ElseIf Selection.Value = "U" Then
    ActiveCell.Offset(-1, 0).Select
    baitap13
  ElseIf Selection.Value = "L" Then
    ActiveCell.Offset(0, -1).Select
    baitap13
  Else
    MsgBox Selection.Value & vbNewLine & Selection.Address(False, False)
  End If
End Sub
Đây thì cũng coi như lặp rồi còn gì.
 
Upvote 0
Mắc chi phải đệ quy?
Code rắc rối bỏ bố.
 
Upvote 0
Hoa lá cành. Để biết gần đến mùa xuân
PHP:
Sub baitap()
  Dim x, y
  Application.Wait Now + TimeSerial(0, 0, 1)
  x = IIf(Selection.Value = "D", 1, IIf(Selection.Value = "U", -1, 0))
  y = IIf(Selection.Value = "R" Or Selection.Value Like "Start*", 1, _
              IIf(Selection.Value = "L", -1, 0))
  If x <> 0 Or y <> 0 Then
      ActiveCell.Offset(x, y).Select
  Else
    MsgBox ActiveCell.Value & vbNewLine & ActiveCell.Address(False, False)
    Exit Sub
  End If
  baitap
End Sub
 
Upvote 0
Hoa lá cành. Để biết gần đến mùa xuân
PHP:
Sub baitap()
  Dim x, y
  Application.Wait Now + TimeSerial(0, 0, 1)
  x = IIf(Selection.Value = "D", 1, IIf(Selection.Value = "U", -1, 0))
  y = IIf(Selection.Value = "R" Or Selection.Value Like "Start*", 1, _
              IIf(Selection.Value = "L", -1, 0))
  If x <> 0 Or y <> 0 Then
      ActiveCell.Offset(x, y).Select
  Else
    MsgBox ActiveCell.Value & vbNewLine & ActiveCell.Address(False, False)
    Exit Sub
  End If
  baitap
End Sub
X: Dùng chi tới 2 IIF, chỉ cần 1 hàm Instr là đủ
 
Upvote 0
Không hẳn vậy. Nếu hai cái khác dấu (-1, 1) thì tổng bằng 0.
Nếu chỉ nằm tỏng 3 trị -1,0,1 thì như vầy đúng hơn:
If (x Or y) Then

X: Dùng chi tới 2 IIF, chỉ cần 1 hàm Instr là đủ
Theo luật đi này, nếu x là -1/1 thì y là 0 và ngược lại.
Vì vậy xét x trước, nếu 0 thì mới xét y
 
Upvote 0
Không hẳn vậy. Nếu hai cái khác dấu (-1, 1) thì tổng bằng 0.
Nếu chỉ nằm tỏng 3 trị -1,0,1 thì như vầy đúng hơn:
If (x Or y) Then


Theo luật đi này, nếu x là -1/1 thì y là 0 và ngược lại.
Vì vậy xét x trước, nếu 0 thì mới xét y
Code ở bài 13 không có trường hợp -1/1
Lần đầu thấy đệ quy không truyền biến (vì thông thường người ta dùng vòng lặp :))
 
Upvote 0
...
Lần đầu thấy đệ quy không truyền biến (vì thông thường người ta dùng vòng lặp :))
(1) Đệ quy có thể dùng trạng thái (state) của môi trường (environment) và trị giá của bảng hiệu chung (shared token) để xác định cách/lượt chạy. Ở đây ta có cái obbject chung là bảng tính, và các trạng thái có thể xét được qua các thuộc tính của bảng tính (range).
Tương tự vậy, bạn cũng có thể dùng biến toàn cục để điều khiển.

(2) Chân chính theo giải thuật các bài toán trò chơi thì thường dùng đệ quy.
Tôi chỉ phê "rắc rối" là vì code ở bài #9 nguyên thuỷ là lối code cẩu thả, không có lập mô hình trước. Sau khi bị phê mới chỉnh lại, và sau đó chỉnh lần nữa thành ra code bài #13.
 
Upvote 0
(1) Đệ quy có thể dùng trạng thái (state) của môi trường (environment) và trị giá của bảng hiệu chung (shared token) để xác định cách/lượt chạy. Ở đây ta có cái obbject chung là bảng tính, và các trạng thái có thể xét được qua các thuộc tính của bảng tính (range).
Tương tự vậy, bạn cũng có thể dùng biến toàn cục để điều khiển.

(2) Chân chính theo giải thuật các bài toán trò chơi thì thường dùng đệ quy.
Tôi chỉ phê "rắc rối" là vì code ở bài #9 nguyên thuỷ là lối code cẩu thả, không có lập mô hình trước. Sau khi bị phê mới chỉnh lại, và sau đó chỉnh lần nữa thành ra code bài #13.
Anh có thể cho ví dụ cụ thể một trường hợp dùng đệ quy không truyền biến mà không thể thay thế bằng vòng lặp không?
 
Upvote 0
Anh có thể cho ví dụ cụ thể một trường hợp dùng đệ quy không truyền biến mà không thể thay thế bằng vòng lặp không?
Cả hai cái này đều tương đối, và bạn hỏi tôi là trật người rồi.
Gọi hàm mà truyền tham là chuyện thiên kinh địa nghĩa cũng như chuyện con người thích ăn ngon mặc đẹp vậy. Tôi chỉ chuyên về bài bản cho nên những kỹ xảo đi vòng qua lệ thường tôi không nghiên cứu. Ai muốn cam khổ cháo rau là chuyện của họ nhưng riêng tôi thì nếu đủ tiền cứ việc ăn ngon.
Đệ quy mà không thể thay bằng vòng lặp cũng hơi khó giải thích. Tôi có đọc qua một vài bài dùng ngăn xếp tự tạo để giả (simulate) đệ quy, hầu tránh bớt vấn đề tràn bộ nhớ ngăn xếp (stack overflow) và lỗi bộ nhớ chính (heap corruption).
 
Upvote 0
Web KT
Back
Top Bottom