Chuyên đề giải đáp những thắc mắc về code VBA

Liên hệ QC

maytinhvp01

Thành viên thường trực
Tham gia
27/7/13
Bài viết
390
Được thích
179
Mình muốn nhờ giải thich câu lệnh " If Ran.Cells(d, c) > max Then max = Ran.Cells(d, c) "
trong ví du:
Public Function LonNhat(Ran As Range)
Dim max As Double, v As Integer, d As Integer, c As Integer
max = Ran.Cells(1, 1)
For d = 1 To Ran.Rows.Count
For c = 1 To Ran.Columns.Count
If Ran.Cells(d, c) > max Then max = Ran.Cells(d, c)
Next c
Next d
v = Tim(max, Ran)
LonNhat = max
End Function
-------------------------------------------------------
[INFO1]Thông báo:
Vì topic này:
http://www.giaiphapexcel.com/forum/...ải-thích-các-code-đề-nghị-các-bạn-gửi-vào-đây
đã quá dài nên BQT đóng lại.
Nay tôi mở topic mới với cùng chủ đề: GIẢI THÍCH NHỮNG THẮC MẮC VỀ CODE
Các bạn nếu có nhu cầu giải thích code, vui lòng post tại đây nhé
NDU96081631

[/INFO1]
 
Chỉnh sửa lần cuối bởi điều hành viên:
Bạn sửa như sau
Mã:
Private Sub Cmd_Click()
  Dim Dat As Double, kt As Double, Check As Boolean
  Check = (Cmd.Caption = "Show Form")
  Cmd.Caption = IIf(Check, "Close Form", "Show Form")
  Dat = TimeValue("00:00:00")
  If Check Then
    UserForm1.Show
    Do
      UserForm1.Label1.Caption = Format(Dat, "hh:mm:ss")
      Dat = Dat + TimeValue("00:00:01")
      kt = Timer
      Do While Timer - kt < 1
        DoEvents
        If UserForm1.Label1.Caption = "00:00:05" Then
          MsgBox "Het thoi gian nghi.": Exit Sub
        End If
    Loop
    Loop
  Else
    Unload UserForm1: Exit Sub
  End If
End Sub
Nhưng có một vấn đề anh ơi, nếu Close Form trước 5s, Form vẫn đóng bình thường nhưng hết 5s nó vẫn hiện MsgBox báo hết giờ ạ. Làm sao để tắt trước giờ mình quy định thì nó không thông báo hết giờ nữa ạ?
Close Form trước giờ quy định thì code vẫn chạy ngầm thì phải (như ảnh): Untitled.jpg
 
Upvote 0
Nhưng có một vấn đề anh ơi, nếu Close Form trước 5s, Form vẫn đóng bình thường nhưng hết 5s nó vẫn hiện MsgBox báo hết giờ ạ. Làm sao để tắt trước giờ mình quy định thì nó không thông báo hết giờ nữa ạ?
Close Form trước giờ quy định thì code vẫn chạy ngầm thì phải (như ảnh): View attachment 182988
Bạn chỉnh câu lệnh tương ứng thành
Mã:
    Unload UserForm1:  End
 
Upvote 0
Bạn chỉnh câu lệnh tương ứng thành
Mã:
    Unload UserForm1:  End
Dạ vâng, cảm ơn anh.
Vậy trường hợp Form này chạy trên 1 Form chính khác (tức là nút Show Form ở trong 1 Form chính) thì nếu sửa lại thành: End thì nó sẽ tắt cả 2 Form luôn à anh? Giải quyết thế nào khi Close Form mà code ko chạy ngầm nữa và form chính vẫn hiện để tiếp tục xử lý dữ liệu trên form chính ạ.?
 
Upvote 0
Dạ vâng, cảm ơn anh.
Vậy trường hợp Form này chạy trên 1 Form chính khác (tức là nút Show Form ở trong 1 Form chính) thì nếu sửa lại thành: End thì nó sẽ tắt cả 2 Form luôn à anh? Giải quyết thế nào khi Close Form mà code ko chạy ngầm nữa và form chính vẫn hiện để tiếp tục xử lý dữ liệu trên form chính ạ.?
Loay hoay em chỉnh lại thế này, test thử có vẻ được, các anh xem xem có ổn không ạ:
- Cho nó chạy bắt đầu từ 01s.

Private Sub Cmd_Click()
Dim Dat As Double, kt As Double, Check As Boolean
Check = (Cmd.Caption = "Show Form")
Cmd.Caption = IIf(Check, "Close Form", "Show Form")
Dat = TimeValue("00:00:01")
If Check Then
UserForm1.Show
Do
UserForm1.Label1.Caption = Format(Dat, "hh:mm:ss")
Dat = Dat + TimeValue("00:00:01")
kt = Timer
Do While Timer - kt < 1
DoEvents
If UserForm1.Label1.Caption = "00:00:00" Then
Unload UserForm1: Exit Sub
End If
Loop
Loop
Else
Unload UserForm1: Exit Sub
End If
End Sub
 
Upvote 0
Loay hoay em chỉnh lại thế này, test thử có vẻ được, các anh xem xem có ổn không ạ:
- Cho nó chạy bắt đầu từ 01s.

Private Sub Cmd_Click()
Dim Dat As Double, kt As Double, Check As Boolean
Check = (Cmd.Caption = "Show Form")
Cmd.Caption = IIf(Check, "Close Form", "Show Form")
Dat = TimeValue("00:00:01")
If Check Then
UserForm1.Show
Do
UserForm1.Label1.Caption = Format(Dat, "hh:mm:ss")
Dat = Dat + TimeValue("00:00:01")
kt = Timer
Do While Timer - kt < 1
DoEvents
If UserForm1.Label1.Caption = "00:00:00" Then
Unload UserForm1: Exit Sub
End If
Loop
Loop
Else
Unload UserForm1: Exit Sub
End If
End Sub
 

File đính kèm

Upvote 0
Quan trọng là dùng để làm gì. Ví dụ nếu dùng để tính thời gian làm bài thì tôi chỉ cần giữ chuột ở thanh tiêu đề của form là có thể "tạm dừng" được.
 
Upvote 0
Quan trọng là dùng để làm gì. Ví dụ nếu dùng để tính thời gian làm bài thì tôi chỉ cần giữ chuột ở thanh tiêu đề của form là có thể "tạm dừng" được.
Dạ cũng gần tương tự như chạy thời gian làm bài thôi ạ, nhưng khi muốn dừng tắt thời gian chạy đó thì nhấn nút để vừa dừng thời gian chạy cùng với tắt form thời gian đó luôn. Chứ cứ giữ mãi thanh tiêu đề của form để dừng thời gian thì bất tiện quá!
 
Upvote 0
Dạ cũng gần tương tự như chạy thời gian làm bài thôi ạ, nhưng khi muốn dừng tắt thời gian chạy đó thì nhấn nút để vừa dừng thời gian chạy cùng với tắt form thời gian đó luôn. Chứ cứ giữ mãi thanh tiêu đề của form để dừng thời gian thì bất tiện quá!
Tôi đang giả sử tôi là thí sinh. Trong thời gian suy nghĩ tôi nhấn giữ chuột ở thanh tiêu đề để tạm dừng thời gian. Mục đích là để gian lận thời gian.
 
Upvote 0
Tôi đang giả sử tôi là thí sinh. Trong thời gian suy nghĩ tôi nhấn giữ chuột ở thanh tiêu đề để tạm dừng thời gian. Mục đích là để gian lận thời gian.
Không đến mức phải gian lận vậy đâu anh. Mà chỉ có mình ngồi xử lý form thôi mà. Hội kia từng người làm bài, làm xong thì báo mồm. Kaka.
 
Upvote 0
Xin hỏi mọi người đoạn code này có nghĩa gì, tại sao lại khai báo biến ở tên của thủ tục (ByVal Target..) và Intersect có nghĩa gì ?

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect(Target, Range("AM1:XFD1")) Is Nothing Then
If Target.Rows.Count = 1 Then
Range("AL1").Value = Target.Value
Range("AL2").Value = Target.Offset(1).Value
GPE
End If
End If
End Sub
 
Upvote 0
Các anh chị giúp em với.
Nhờ các anh chị giải thích code của hàm sau với:
ThisWorkbook.Activate
wksInput.Shapes("cmbUniaxialAnalysis").ThreeD.BevelTopType = msoBevelSlope
 
Upvote 0
Cho em hỏi câu lệnh Căn giữa trong Msgbox như nào ạ! em xin cảm ơn
 
Upvote 0
Xin hỏi mọi người (1) đoạn code này có nghĩa gì, (1.1) tại sao lại khai báo biến ở tên của thủ tục (ByVal Target..) và (2) Intersect có nghĩa gì ?

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
1 If Not Intersect(Target, Range("AM1:XFD1")) Is Nothing Then
If Target.Rows.Count = 1 Then
3 Range("AL1").Value = Target.Value
Range("AL2").Value = Target.Offset(1).Value
5 GPE
End If
7 End If
End Sub
(1) Đoạn mã này là 1 macro sự kiện; Có nghĩa là muốn thực hiện các dòng lệnh được đánh số từ 3 đến 5 cần thỏa vài điều kiện nào đó.
Điều kiện đầu tiên là: Dùng cái gì đó, như chuột, hay cái gì khác. . . đụng vô vùng ô giới hạn từ [AM1] cho đến [XFD1] (Quá lớn, fải không?)
Điều kiện thứ 2 là: Nếu đếm số dòng mà (bạn hay ai đó) vừa đụng tới chỉ là 1 hàng duy nhất thì sẽ thực hiện 3 lệnh (từ d3 đến d5)
(Trong đó D5 là triệu gọi 1 macro hay 1 cái gì đó như đứa con tinh thần của ai đó, thực hiện các câu lệnh công việc trong nội dung đã có)

(1.1) Thủ tục sự kiện thì sự kiện đó sẩy ra ở đâu, ở nơi nào trên trang tính. Sự mặc định này được VBE viết ra như thế (Mình hiểu nôm na là thế; Bạn chờ, có thể có thành viên nào đó giải thích cho bạn rõ ràng hơn chăng.)

2. Intersect() trước hết là 1 fương thức (Bạn có thể tìm hiểu sâu hơn bài lí thuyết về vấn đề này có trên diễn đàn; từ khóa là chính nó, thử xem)
Nôm na đã được giải thíc bên trên (ĐK 1)

3. VBA là 1 ngôn ngữ; Bạn học 1 ngôn ngữ mới mà chưa sẵn lòng dịch các câu hay mệnh đề của nó sang tiếng mẹ để hay sao? & như vậy sẽ khó cho bạn rồi.
Dịch từ ngôn ngữ này sang 1 ngôn ngữ khác càng lưu loát càng tỏ rõ sự am hiểu về ngôn ngữ mới đó bạn; Chúc nhiều thành công trên con đường chinh fục VBA!
 
Upvote 0
Mọi người cho mình hỏi vấn đề này:
Mình có làm ứng dụng nhỏ trong công việc, file excel chứa code đã chạy được, nay mình muốn xuất sang addin để chia sẽ cho anh em cơ quan, quá trình dùng có thể phải cập nhật, sửa lỗi thêm (nếu có) mà không phải chép lại file, chép dữ liệu rồi mới chạy code vba trong file đó.
Mình thử và tìm trên mạng vẫn ko thấy có hướng dẫn, có xem vài addin mở nhưng không hiểu lắm. Do vậy, mình nhờ mọi người hướng dẫn giúp các bước chi tiết với ạ (hay code luôn vào cái addin đi kèm làm mẫu để mình học với ạ). Cảm ơn nhiều.
 

File đính kèm

Upvote 0
Mọi người cho mình hỏi vấn đề này:
Mình có làm ứng dụng nhỏ trong công việc, file excel chứa code đã chạy được, nay mình muốn xuất sang addin để chia sẽ cho anh em cơ quan, quá trình dùng có thể phải cập nhật, sửa lỗi thêm (nếu có) mà không phải chép lại file, chép dữ liệu rồi mới chạy code vba trong file đó.
Mình thử và tìm trên mạng vẫn ko thấy có hướng dẫn, có xem vài addin mở nhưng không hiểu lắm. Do vậy, mình nhờ mọi người hướng dẫn giúp các bước chi tiết với ạ (hay code luôn vào cái addin đi kèm làm mẫu để mình học với ạ). Cảm ơn nhiều.
Mình thấy cái file mẫu nó lạ lạ thế nào ấy ... và đoạn Code trong Add In thì Sheet2 lấy tên Sheet còn Sheet3 lấy lấy giá trị xuất. Cái này để làm gì vậy bạn ?
 
Upvote 0
Mình thấy cái file mẫu nó lạ lạ thế nào ấy ... và đoạn Code trong Add In thì Sheet2 lấy tên Sheet còn Sheet3 lấy lấy giá trị xuất. Cái này để làm gì vậy bạn ?
Cái này mình làm mẫu ví dụ bạn à, để hướng dùm cách để có thể xuất dữ liệu. Cái code đó mình tạo trên file excel gồm 3 sheet, lệnh xuất sheet1 qua các sheet2, 3 đã chạy được, rồi mình xóa hết sheet2,3 để tạo file addin. Giờ muốn từ file bất kỳ sau khi add cái addin vào thì xuất như các ứng dụng đó bạn (mục đích có sửa code thì thay cái addin, chứ bắt thay luôn file thì không tiện lắm).
Ps: Mình có thử qua các lệnh thisworkbook hay activeworkbook nhưng vẫn không được, kiểu như nó hiểu xuất vào các sheet trong file addin thôi hay sao ý.
Nhờ bạn với mọi người hướng dẫn giúp (code vào file addin hộ).
 
Upvote 0
Cái này mình làm mẫu ví dụ bạn à, để hướng dùm cách để có thể xuất dữ liệu. Cái code đó mình tạo trên file excel gồm 3 sheet, lệnh xuất sheet1 qua các sheet2, 3 đã chạy được, rồi mình xóa hết sheet2,3 để tạo file addin. Giờ muốn từ file bất kỳ sau khi add cái addin vào thì xuất như các ứng dụng đó bạn (mục đích có sửa code thì thay cái addin, chứ bắt thay luôn file thì không tiện lắm).
Ps: Mình có thử qua các lệnh thisworkbook hay activeworkbook nhưng vẫn không được, kiểu như nó hiểu xuất vào các sheet trong file addin thôi hay sao ý.
Nhờ bạn với mọi người hướng dẫn giúp (code vào file addin hộ).
Trong file addin sửa code thế này.
Mã:
Public Sub Xuat()
Dim i As Long
For i = 2 To 16
    With ActiveWorkbook.Sheets(2)
        .Cells(i, 1).Formula = "='Sheet1'!B" & i
    End With
    With ActiveWorkbook.Sheets(3)
        .Cells(i, 1).Formula = "='Sheet1'!a" & i
    End With
Next
End Sub
 
Upvote 0
Dạ em chào mọi người.
Em có viết 1 đoạn code đơn giản như sau, em đang test thử ở màng hình immediate mà bị báo lỗi
range("A1").FormulaR1C1 = "=ISNUMBER(FIND("HKNK",RC[1]))"

Em phải làm sao để HKNK được hiểu là chuổi cần tìm mà ko phải là biến, để ô A1 trả về True.
Mong mọi người giúp em
 

File đính kèm

Upvote 0
Web KT

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

Back
Top Bottom