Không gọi hàm mà nó vẫn chạy?

Liên hệ QC

phihndhsp

Thành viên gạo cội
Tham gia
26/12/09
Bài viết
3,363
Được thích
2,488
Giới tính
Nam
Nghề nghiệp
Giáo Viên
Tôi có 1 thắc mắc mà tìm hoài không ra, file này là của một người bạn hỏi
Trong sheet21 tôi có code như sau
Mã:
Sub Intudong_PC()
'dat bien
    Dim Chay As Long
    Dim Ddau As Long
    Dim Dcuoi As Long
    Ddau = Sheet21.Range("L9").Value - 1
    Dcuoi = Sheet21.Range("M9").Value - 1
    If Ddau <= -1 Or Dcuoi <= -1 Then
        Sheet21.Range("L10") = "Phai nhap du Tu va Den"
    Else
        For Chay = Ddau To Dcuoi
       Sheet21.Range("L5") = Chay + 1
        Next
    End If
End Sub
trong code tôi không có đề cập đến việc gọi hàm Function VndUni(ByVal s As String) As String
mà tại sao khi chạy từng bước(F8) tới dòng Sheet21.Range("L5") = Chay + 1 nó tự động chạy qua Funtion VnUni
xin chân thành cảm ơn

Có phải chăng khi L5 thay đổi, dẫn theo những đối số khác thay đổi, mà đối số khác lại có quan hệ với đối số thông qua hàm VndUni chăng?
 

File đính kèm

  • NXT Hang Hoa - pp BQGQ - Phuoc Chau - 2018 - T03001.xlsb
    268.5 KB · Đọc: 11
Lần chỉnh sửa cuối:
Tôi có 1 thắc mắc mà tìm hoài không ra, file này là của một người bạn hỏi
Trong sheet21 tôi có code như sau
Mã:
Sub Intudong_PC()
'dat bien
    Dim Chay As Long
    Dim Ddau As Long
    Dim Dcuoi As Long
    Ddau = Sheet21.Range("L9").Value - 1
    Dcuoi = Sheet21.Range("M9").Value - 1
    If Ddau <= -1 Or Dcuoi <= -1 Then
        Sheet21.Range("L10") = "Phai nhap du Tu va Den"
    Else
        For Chay = Ddau To Dcuoi
       Sheet21.Range("L5") = Chay + 1
        Next
    End If
End Sub
trong code tôi không có đề cập đến việc gọi hàm Function VndUni(ByVal s As String) As String
mà tại sao khi chạy từng bước(F8) tới dòng Sheet21.Range("L5") = Chay + 1 nó tự động chạy qua Funtion VnUni
xin chân thành cảm ơn

Có phải chăng khi L5 thay đổi, dẫn theo những đối số khác thay đổi, mà đối số khác lại có quan hệ với đối số thông qua hàm VndUni chăng?
- Thứ nhất: Trong sheet In phieu Xuat, cell A29 có dùng hàm VNDUNI
- Thứ hai: Trong code có đoạn Sheet21.Range("L5") = Chay + 1 . Hành động gán giá trị xuống sheet sẽ khiến cho sheet phải tính toán lại
Vậy nếu bạn không muốn code chạy hàm VNDUNI thì:
- Hoặc là: Xóa công thức tại A29
- Hoặc là: Đừng gán giá trị xuống sheet In phieu Xuat
 
Upvote 0
- Thứ nhất: Trong sheet In phieu Xuat, cell A29 có dùng hàm VNDUNI
- Thứ hai: Trong code có đoạn Sheet21.Range("L5") = Chay + 1 . Hành động gán giá trị xuống sheet sẽ khiến cho sheet phải tính toán lại
Vậy nếu bạn không muốn code chạy hàm VNDUNI thì:
- Hoặc là: Xóa công thức tại A29
- Hoặc là: Đừng gán giá trị xuống sheet In phieu Xuat
Dạ em cũng mới viết vài hàm rồi thử xem, đúng là nó sẽ gọi lại hàm khi nó có sử dụng các function có liên quan, cảm ơn anh Ndu nhiều
 
Upvote 0
Nếu tôi nhớ không lầm thì bạn là GV về tin học.
Nếu bạn dạy lập trình thì nên tìm hiểu và thực tập cho thuần thục về debug và compiler directives

Để biết xem một function được gọi ở đâu, bạn có thể dùng call stack viewer để xem. Rất tiếc là VBE (tức là cửa sổ VBA) không hổ trợ stack viewer mạnh mẽ như những môi trường khác (ví dụ Visual Studio) cho nên công việc hơi cực:

Ngay dòng code đầu tiên cảu function, bạn đặt mọt break
Khi function được gọi, đương nhiên nó sẽ dừng ở điểm break này
Bạn vào view > call strack. Trong cửa sổ hiển thị, bạn sẽ thấy tên hàm này, kế đó là tên hàm gọi nó,

Nếu không thấy cái tên hàm gọi nó thì 99% là nó được gọi bởi môt ô nào đó. Bạn đưa code này vào đầu module
#Const DIR_MYDEBUG = True
Và code này vào đầu function
#If DIR_MYDEBUG Then
On Error Resume Next
Debug.Print Application.Caller.Parent.Name & " " & Application.Caller.Address
If Err = 424 Then Stop
On Error GoTo 0
#End If

Code sẽ ghi ra tên cell gọi hàm. Nếu nó stop thì do nó được gọi bởi hàm khác và bạn có thể view call stack.

Lưu ý là code trên chỉ giản dị cho trường hợp được gọi bởi cell (90% như nói ở trên). Nếu nó có khả năng được gọi bởi graph hay gì gì đó thì bạn tự tìm hiểu và điều chỉnh.
 
Upvote 0
Nếu tôi nhớ không lầm thì bạn là GV về tin học.
Nếu bạn dạy lập trình thì nên tìm hiểu và thực tập cho thuần thục về debug và compiler directives

Để biết xem một function được gọi ở đâu, bạn có thể dùng call stack viewer để xem. Rất tiếc là VBE (tức là cửa sổ VBA) không hổ trợ stack viewer mạnh mẽ như những môi trường khác (ví dụ Visual Studio) cho nên công việc hơi cực:

Ngay dòng code đầu tiên cảu function, bạn đặt mọt break
Khi function được gọi, đương nhiên nó sẽ dừng ở điểm break này
Bạn vào view > call strack. Trong cửa sổ hiển thị, bạn sẽ thấy tên hàm này, kế đó là tên hàm gọi nó,

Nếu không thấy cái tên hàm gọi nó thì 99% là nó được gọi bởi môt ô nào đó. Bạn đưa code này vào đầu module
#Const DIR_MYDEBUG = True
Và code này vào đầu function
#If DIR_MYDEBUG Then
On Error Resume Next
Debug.Print Application.Caller.Parent.Name & " " & Application.Caller.Address
If Err = 424 Then Stop
On Error GoTo 0
#End If

Code sẽ ghi ra tên cell gọi hàm. Nếu nó stop thì do nó được gọi bởi hàm khác và bạn có thể view call stack.

Lưu ý là code trên chỉ giản dị cho trường hợp được gọi bởi cell (90% như nói ở trên). Nếu nó có khả năng được gọi bởi graph hay gì gì đó thì bạn tự tìm hiểu và điều chỉnh.
Dạ em cảm ơn anh nhiều, em sẽ nghiên cứu các vấn đề này, lúc đầu em xem code thì thấy không gọi ở đâu hết, nhưng sau khi xem kỹ thì nó có liên quan trực tiếp hay gián tiếp, khi đó nó sẽ tự cập nhật lại, em sẽ xem xét kỹ lại những thuật debug lại
 
Upvote 0
ÚI trời, dùng cái gì mà application.cal... gì gì đấy để tắt tự độngt
Thích mỗi cái này của anh.
Không biết cái này thì khi viết code xong nó mà không chạy đúng ý thì chỉ có nước đọc lại từng dòng code, mất ối thời gian. Thực ra nên học debug trước khi học code, vì debug giúp người học hiểu sâu từng câu lệnh ( ý là tự tìm hiểu).
 
Upvote 0
...
Không biết cái này thì khi viết code xong nó mà không chạy đúng ý thì chỉ có nước đọc lại từng dòng code, mất ối thời gian. Thực ra nên học debug trước khi học code, vì debug giúp người học hiểu sâu từng câu lệnh ( ý là tự tìm hiểu).
Trật lất. Không có mọt trình độ tương đối về code thì debug chỉ là người mù mò đường (mà khong có cả cây gậy).
Đọc lại từng dòng code tuy "mất ối thời gian" nhưng nó giúp cho người viết code tập tính kiên nhẫn.
Đối với tôi thời gian mà người ta cho rằng "mất" ấy là thời gian thu thập kiến thức được rất nhiều.

Chú: tuy nhiên, tôi là ngừoi không sợ mất thời gian như nhiều ngừoi ở đây. Tôi vẫn thường làm gương cho con cháu và học trò của mình là "đầu óc tôi chỉ thông minh vào hạng trung bình, nhưng kiên nhẫn và cố gắng của tôi ít người bì kịp". Và "trong mọt cuộc tranh tài, nếu tôi thua địch thủ thì chỉ có thể thua vì sức, về trí, chứ thua về nổ lực thì không thể xảy ra" - nhấn mạnh: không thể xảy ra.
 
Lần chỉnh sửa cuối:
Upvote 0
VetMini said:
viết code tập tính kiên nhẫn
Đó cũng là một cách, để tập tính kiên nhẫn có nhiều cách mà anh, biết debug chỉ giúp nhanh chóng khoanh vùng khu vực, cuối cùng vẫn phải đọc lại từng câu lệnh trong khi vực đã khoanh vùng.
Mấy cách không biết. Nhưng cách quote lời của ngừoi khác nó không được đúng lắm.
Lời chính của tôi là "người viết code tập tính kiên nhẫn". Chủ từ là "người", người ấy tập kiên nhẫn, "viết code" chỉ là tĩnh từ bổ nghĩa.
Bạn quote lại là "viết code tập tính kiên nhẫn". Vì không có "người" cho nên chủ từ sẽ bị hiểu là hành động "viết code"
Tôi không hề nói rằng viết code để học tính kiên nhẫn.
 
Upvote 0
để mình tập quơ thử lời bạn Vetmini coi sao --=0--=0 , không khéo ảnh lại sắp quơ cho mình 1 cây roi mây đa.

"trong mọt cuộc tranh tài, nếu tôi thua địch thủ thì chỉ có thể thua vì sức, về trí, chứ thua về nổ thì không thể xảy ra" - nhấn mạnh: không thể xảy ra.
 
Upvote 0
Cố tình chọt cô te thành quơ (đúp đơ vê a e rờ) để gây chiến phải hôn?
 
Upvote 0
Web KT

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

Back
Top Bottom