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:
Chào mn ngày đầu tuần vv.
mọi người giúp e phương thức xác định dòng, cột cuối cùng chứa dữ liệu với ạ
bình thường e sử dụng 2 code sau :
Mã:
dim Lr_Row, Lr_Col as integer
    Lr_Row = Cells(Rows.Count, 1).End(xlUp).Row
    Lr_Col = Cells(1, Columns.Count).End(xlToLeft).Column
Tuy nhiên 2 dòng lệnh trên nó chỉ xác định được dòng và cột cuối ở cột A và dòng số 1.
Có nhiều file không thể xác định được là dòng nào hay cột nào chứa dữ liệu cuối cùng, do đó nếu sử dụng 2 dòng lệnh trên thì không đúng lắm.
mọi người có thể giúp e sử dụng cách nào tốt hơn không ạ.
xin cám ơn.
 
Upvote 0
Xài fương thức FIND() đi bạn; luôn lúc nào cũng đạt iêu cầu bạn đề ra.
 
Upvote 0
Chào mn ngày đầu tuần vv.
mọi người giúp e phương thức xác định dòng, cột cuối cùng chứa dữ liệu với ạ
bình thường e sử dụng 2 code sau :
Mã:
dim Lr_Row, Lr_Col as integer
    Lr_Row = Cells(Rows.Count, 1).End(xlUp).Row
    Lr_Col = Cells(1, Columns.Count).End(xlToLeft).Column
Tuy nhiên 2 dòng lệnh trên nó chỉ xác định được dòng và cột cuối ở cột A và dòng số 1.
Có nhiều file không thể xác định được là dòng nào hay cột nào chứa dữ liệu cuối cùng, do đó nếu sử dụng 2 dòng lệnh trên thì không đúng lắm.
mọi người có thể giúp e sử dụng cách nào tốt hơn không ạ.
xin cám ơn.
Bạn phải hiểu ở đây là bạn đang lấy ở dòng 1 va cột 1.Bạn có thể thay đổi dòng và cột mà.Thay số 1 thành số 2 nó khác ngay.Nó là dòng 2 và cột B đó.
Bài đã được tự động gộp:

Xài fương thức FIND() đi bạn; luôn lúc nào cũng đạt iêu cầu bạn đề ra.
Bạn hướng dẫn phương thức đó xem nào.FIND() đó.:D
 
Upvote 0
Bạn phải hiểu ở đây là bạn đang lấy ở dòng 1 va cột 1.Bạn có thể thay đổi dòng và cột mà.Thay số 1 thành số 2 nó khác ngay.Nó là dòng 2 và cột B đó.
Bài đã được tự động gộp:


Bạn hướng dẫn phương thức đó xem nào.FIND() đó.:D
Bạn phải hiểu ở đây là bạn đang lấy ở dòng 1 va cột 1.Bạn có thể thay đổi dòng và cột mà.Thay số 1 thành số 2 nó khác ngay.Nó là dòng 2 và cột B đó.
Bài đã được tự động gộp:


Bạn hướng dẫn phương thức đó xem nào.FIND() đó.:D
bạn hiểu ko : vì là dữ liệu mình hơn 4000 cột, bây giờ đâu xác định được cột nào là có dữ liệu dài nhất để mà chọn "A" Hay là "X" ???
 
Upvote 0
bạn hiểu ko : vì là dữ liệu mình hơn 4000 cột, bây giờ đâu xác định được cột nào là có dữ liệu dài nhất để mà chọn "A" Hay là "X" ???
À vậy thì xác định dòng lớn nhất trong đó.
Vậy bạn thử.
Mã:
Sub xacdinhsodong()
Dim a As Long
With Sheet1
a = .UsedRange.Rows.Count
MsgBox a
End With
End Sub
 
Upvote 0
À vậy thì xác định dòng lớn nhất trong đó.
Vậy bạn thử.
Mã:
Sub xacdinhsodong()
Dim a As Long
With Sheet1
a = .UsedRange.Rows.Count
MsgBox a
End With
End Sub
Cám ơn ! Code này có hiệu quả. Vậy liệu mình bỏ with đi
Gắn cho a = sheet1.usedrange.rows.count đc k nhỉ
 
Upvote 0
Cám ơn ! Code này có hiệu quả. Vậy liệu mình bỏ with đi
Gắn cho a = sheet1.usedrange.rows.count đc k nhỉ
Được nó vẫn như nhau mà.
Bài đã được tự động gộp:

Nếu không có dòng: i=i+1
thì số sheet sẽ bằng không thì sao anh ?
hay còn có cái gì khác, em chưa hiểu ý chổ này lắm !
Bạn có thể thay bằng thế này.
Mã:
Sub Vonglap_For8()
    Dim mysheet As Worksheet
    Dim i As Integer
    For Each mysheet In ActiveWorkbook.Worksheets
  
    MsgBox mysheet.Name
    MsgBox "So sheets trong Worksheet la: " & mysheet.Index
    Next mysheet
    
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Được nó vẫn như nhau mà.
Bài đã được tự động gộp:


Bạn có thể thay bằng thế này.
Mã:
Sub Vonglap_For8()
    Dim mysheet As Worksheet
    Dim i As Integer
    For Each mysheet In ActiveWorkbook.Worksheets
 
    MsgBox mysheet.Name
    MsgBox "So sheets trong Worksheet la: " & mysheet.Index
    Next mysheet
   
End Sub
Cách này cũng hay, nhưng nếu số sheet nhiều lên thì mau hư chuột lắm anh !:cray:
 
Upvote 0
Cách này cũng hay, nhưng nếu số sheet nhiều lên thì mau hư chuột lắm anh !:cray:
Bạn muốn xem có bao nhiêu sheets à.Mình tưởng hiện thị từng sheets.
Mã:
Sub Vonglap_For8()
    Dim mysheet As Worksheet
    Dim i As Integer
    For Each mysheet In ActiveWorkbook.Worksheets

    MsgBox mysheet.Name
   
    Next mysheet
   MsgBox "So sheets trong Worksheet la: " & Sheets.Count
End Sub
 
Upvote 0
Bạn muốn xem có bao nhiêu sheets à.Mình tưởng hiện thị từng sheets.
Mã:
Sub Vonglap_For8()
    Dim mysheet As Worksheet
    Dim i As Integer
    For Each mysheet In ActiveWorkbook.Worksheets

    MsgBox mysheet.Name
  
    Next mysheet
   MsgBox "So sheets trong Worksheet la: " & Sheets.Count
End Sub
Híc cái tưởng nhầm của anh mà hóa ra lại hay với em.
 
Upvote 0
Mình mới tập tành làm code VBA phục vụ công việc. Mình có thắc mắc muốn nhờ giải đáp giúp.
Mình có file dùng Vlookup để in nhiều phần khác nhau với 1 khuôn giống nhau. Và đã có dùng VBA để in số lượng lớn giấy với 1 thao tác.
Nhưng khi mình dùng hàm For To Next để in thì chỉ thực hiện được từ số nhỏ đến số lớn.
Vậy có cách nào để mình in với số lượng lớn từ lớn đến nhỏ được không?
 
Upvote 0
Mình mới tập tành làm code VBA phục vụ công việc. Mình có thắc mắc muốn nhờ giải đáp giúp.
Mình có file dùng Vlookup để in nhiều phần khác nhau với 1 khuôn giống nhau. Và đã có dùng VBA để in số lượng lớn giấy với 1 thao tác.
Nhưng khi mình dùng hàm For To Next để in thì chỉ thực hiện được từ số nhỏ đến số lớn.
Vậy có cách nào để mình in với số lượng lớn từ lớn đến nhỏ được không?
Được!
For I=lớn To nhỏ Step - mấy
 
Lần chỉnh sửa cuối:
Upvote 0
For số = nhỏ To lớn
thì vòng lặp đi từ số nhỏ sang lớn, từng bước một.

For số = lớn To nhỏ Step -1
thì vòng lặp đi từ lớn xuống nhỏ, từng bước một. Đừng quên cái chỗ Step -1
 
Upvote 0
Thay đoạn code If ... EndIf đầu sub thành đoạn sau, xem có được không
Mã:
If lngRow <= 3 Then
    lngRow = 4
Else
    Dim Rg As Range
    Set Rg = .Range("B4:B" & lngRow).Find(txtmakhncc.Text,lookin:=xlValues, LookAt:=xlWhole)
    If Not Rg  Is Nothing Then
        Msgbox "Da co trung " & txtmakhncc.Text
        Exit sub
    End If
    lngRow = lngRow + 1
End If

Em làm được rồi, Tks bác nhiều. Nhưng em muốn thêm điều kiện nữa như sau thì phải thêm như nào (phần điều kiện trên vẫn giữ song song với điều kiện dưới đây):
- Trong file excell ở cột C4:C (là dữ liệu ở Textboxt "txtphanbiet.Text" nhập vào mà có chữ "kh") thì sẽ kiểm tra điều kiện cột E4:E (cột này là cột của Textboxt "txtsodtkhncc.Text" được nhập vào mà dữ liệu đã có thì cũng báo trùng và ko cho nhập (lưu ý chỉ ktra khi cột C là chữ "kh")

Em có VD trong file attch kèm theo.

=> giờ em phải thêm code VBA điều kiện như nào ah ? Rất mong cả nhà giúp đỡ.
 

File đính kèm

  • VD.xlsx
    9.7 KB · Đọc: 4
Lần chỉnh sửa cuối:
Upvote 0
Em làm được rồi, Tks bác nhiều. Nhưng em muốn thêm điều kiện nữa như sau thì phải thêm như nào (phần điều kiện trên vẫn giữ song song với điều kiện dưới đây):
- Trong file excell ở cột C4:C (là dữ liệu ở Textboxt "txtphanbiet.Text" nhập vào mà có chữ "kh") thì sẽ kiểm tra điều kiện cột E4:E (cột này là cột của Textboxt "txtsodtkhncc.Text" được nhập vào mà dữ liệu đã có thì cũng báo trùng và ko cho nhập (lưu ý chỉ ktra khi cột C là chữ "kh")

Em có VD trong file attch kèm theo.

=> giờ em phải thêm code VBA điều kiện như nào ah ? Rất mong cả nhà giúp đỡ.
Đưa file kiểu này thì sao test đúng sai, nên bạn thử làm đi rồi gửi lên đây hỏi tiếp nếu mắc
 
Upvote 0
Đưa file kiểu này thì sao test đúng sai, nên bạn thử làm đi rồi gửi lên đây hỏi tiếp nếu mắc
Vậy em muốn bỏ qua việc set "kh" giờ em chỉ set 2 mục
("B4:B" & lngRow).Find(txtmakhncc.Text, LookIn:=xlValues, LookAt:=xlWhole) và ("F4:F" & lngRow).Find(txtsodtkhncc.Text, LookIn:=xlValues, LookAt:=xlWhole) anh giup em doan Code VBA của nó sẽ phải viết như nào ah ?
 
Upvote 0
Vậy em muốn bỏ qua việc set "kh" giờ em chỉ set 2 mục
("B4:B" & lngRow).Find(txtmakhncc.Text, LookIn:=xlValues, LookAt:=xlWhole) và ("F4:F" & lngRow).Find(txtsodtkhncc.Text, LookIn:=xlValues, LookAt:=xlWhole) anh giup em doan Code VBA của nó sẽ phải viết như nào ah ?
Thì cũng vậy bạn phải tự thân vận động , sáng tạo lên, đừng cứ chờ ù ì sẽ bao giờ lên tay
Đây, thử thế này
Mã:
If lngRow <= 3 Then
    lngRow = 4
Else
    'Kiem tra trung Ma
    Dim Rg As Range
    Set Rg = .Range("B4:B" & lngRow).Find(txtmakhncc.Text,lookin:=xlValues, LookAt:=xlWhole)
    If Not Rg  Is Nothing Then
        Msgbox "Da co trung " & txtmakhncc.Text
        Exit sub
    End If
  
    'Kiem tra trung so dt
    Set Rg = Nothing
     Set Rg = .Range("F4:F" & lngRow).Find(txtsodtkhncc.Text,lookin:=xlValues, LookAt:=xlWhole)
    If Not Rg  Is Nothing Then
        Msgbox "Da co trung " & txtsodtkhncc.Text
        Exit sub
    End If
  
    lngRow = lngRow + 1
End If
 
Upvote 0
Web KT
Back
Top Bottom