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:
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.
Bật chức năng Record macro lên để ghi lại quá trình bạn viết công thức là có kết quả.
PHP:
Sub Macro1()
'
' Macro1 Macro
'

'
    ActiveCell.FormulaR1C1 = "=ISNUMBER(FIND(""HKNK"",RC[1]))"
    Range("A2").Select
End Sub
 
Upvote 0
Anh Befaint cho em hỏi chút ạ! sub này của em chạy vẫn ổn, khi cho vào form báo lỗi như dưới đây là sao ạ
Sub hidedongproKL()
Dim headRowHei As Double, pageHei As Double, tRowHei As Double, shNames As Range
Dim ws As Worksheet, r As Long, lrPrint As Long, arr As Variant, lrCT As Long, frCT As Long, signRow As Long

Application.ScreenUpdating = False

Set ws = ActiveSheet
With ws
ws.Activate
lrPrint = .[B65000].End(xlUp).row
.Range("B1:B" & lrPrint).EntireRow.Hidden = False
arr = .Range("B1:D" & lrPrint).Value
For r = UBound(arr) To 1 Step -1
If WorksheetFunction.Trim(arr(r, 1)) <> "" And Not IsNumeric(arr(r, 1)) Then signRow = r
If Val(arr(r, 1)) <> 0 Or Val(arr(r, 3)) <> 0 Then
lrCT = r
Exit For
End If
Next
frCT = .Rows(.PageSetup.PrintTitleRows).row + .Rows(.PageSetup.PrintTitleRows).Rows.Count
.Rows(frCT & ":" & lrPrint).RowHeight = 18 'Chieu tao toi thieu cua dong`
If lrCT < signRow - 1 Then
.Rows((lrCT + 1) & ":" & (signRow - 1)).Hidden = True
End If
[QUOTE="befaint, [/QUOTE]
 
Upvote 0
Bạn đang thiếu dòng lệnh
End With

Mà mình thấy ngộ chổ này:
PHP:
Set ws = ActiveSheet
With ws
   ws.Activate
Hình như câu lệnh cuối là thừa.
Diều này chứng tỏ (có thể) bạn chưa dịch sang tiếng Việt (để hiểu) các dòng lệnh này.
 
Upvote 0
Anh Nghĩa cho em hỏi, làm sao để update một listview mà vẫn giữ được scroll view hiện thời? Cám ơn anh.
 
Upvote 0
Bạn đang thiếu dòng lệnh
End With

Mà mình thấy ngộ chổ này:
PHP:
Set ws = ActiveSheet
With ws
   ws.Activate
Hình như câu lệnh cuối là thừa.
Diều này chứng tỏ (có thể) bạn chưa dịch sang tiếng Việt (để hiểu) các dòng lệnh này.
Chỗ kia sửa thành worksheet.active luôn anh nhỉ
- file đây anh xem hộ em với
 

File đính kèm

  • xxx.xlsb
    144.1 KB · Đọc: 6
Upvote 0
1./ Bạn nên bắt đầu các câu lệnh 1 cách thẳng cột; Các câu lệnh như thế này là bạn bắt chước ai vậy:
PHP:
Sub hidedongproKL()
    Dim headRowHei As Double, pageHei As Double, tRowHei As Double, shNames As Range
    Dim ws As Worksheet, r As Long, lrPrint As Long, arr As Variant, lrCT As Long, frCT As Long, signRow As Long

    Application.ScreenUpdating = False
 
Set ws = ActiveSheet
        With ws
            ws.Activate
            lrPrint = .[B65000].End(xlUp).row
            MsgBox lrPrint
            .Range("B1:B" & lrPrint).EntireRow.Hidden = False
            arr = .Range("B1:D" & lrPrint).Value
            For r = UBound(arr) To 1 Step -1
                If WorksheetFunction.Trim(arr(r, 1)) <> "" And Not IsNumeric(arr(r, 1)) Then signRow = r
                If Val(arr(r, 1)) <> 0 Or Val(arr(r, 3)) <> 0 Then
                    lrCT = r
                    Exit For
                End If
            Next
& kiểu như vậy có giúp gì cho bạn trong chuyện fát hiện ra lỗi sơ đẵng hay không, như Có If mà không có End If,. . . .

2./ Cứ cho là giữa fần khai báo các biến & fần các câu lệnh thừa hành nên có dòng trống để tiện fân biệt;
Nhưng sau dòng trống đó 1 dòng lý gì có dòng trống thứ 2?

3./ Câu lệnh ws.Activate là thừa. Nên bỏ đi;

4./ Nên chăng các dòng khai báo biến nên có cùng loại
Không nên:
Dim GPE As Byte, Rng As Range
Dim Rws As Long, Wh As Worksheet

5./ Câu lệnh này mình thấy báo lỗi:
PHP:
frCT = .Rows(.PageSetup.PrintTitleRows).row + .Rows(.PageSetup.PrintTitleRows).Rows.Count

Bạn kiểm tra xem các tham biến tại thời điểm báo lỗi có trị là bao nhiêu?
(Có thể) do máy của mình không có máy in, nên nó báo là
.PageSetup.PrintTitleRows =""

Tạm thời là vậy; Có gì các bạn khác sẽ giúp bạn tiếp!
 
Upvote 0
1./ Bạn nên bắt đầu các câu lệnh 1 cách thẳng cột; Các câu lệnh như thế này là bạn bắt chước ai vậy:
PHP:
Sub hidedongproKL()
    Dim headRowHei As Double, pageHei As Double, tRowHei As Double, shNames As Range
    Dim ws As Worksheet, r As Long, lrPrint As Long, arr As Variant, lrCT As Long, frCT As Long, signRow As Long

    Application.ScreenUpdating = False
 
Set ws = ActiveSheet
        With ws
            ws.Activate
            lrPrint = .[B65000].End(xlUp).row
            MsgBox lrPrint
            .Range("B1:B" & lrPrint).EntireRow.Hidden = False
            arr = .Range("B1:D" & lrPrint).Value
            For r = UBound(arr) To 1 Step -1
                If WorksheetFunction.Trim(arr(r, 1)) <> "" And Not IsNumeric(arr(r, 1)) Then signRow = r
                If Val(arr(r, 1)) <> 0 Or Val(arr(r, 3)) <> 0 Then
                    lrCT = r
                    Exit For
                End If
            Next
& kiểu như vậy có giúp gì cho bạn trong chuyện fát hiện ra lỗi sơ đẵng hay không, như Có If mà không có End If,. . . .

2./ Cứ cho là giữa fần khai báo các biến & fần các câu lệnh thừa hành nên có dòng trống để tiện fân biệt;
Nhưng sau dòng trống đó 1 dòng lý gì có dòng trống thứ 2?

3./ Câu lệnh ws.Activate là thừa. Nên bỏ đi;

4./ Nên chăng các dòng khai báo biến nên có cùng loại
Không nên:
Dim GPE As Byte, Rng As Range
Dim Rws As Long, Wh As Worksheet

5./ Câu lệnh này mình thấy báo lỗi:
PHP:
frCT = .Rows(.PageSetup.PrintTitleRows).row + .Rows(.PageSetup.PrintTitleRows).Rows.Count

Bạn kiểm tra xem các tham biến tại thời điểm báo lỗi có trị là bao nhiêu?
(Có thể) do máy của mình không có máy in, nên nó báo là
.PageSetup.PrintTitleRows =""

Tạm thời là vậy; Có gì các bạn khác sẽ giúp bạn tiếp!
3. Set ws = ActiveSheet
With ws
ws.Activate
-----> thay luôn bằng worksheet.active anh nhỉ
4. Khai báo như thế cũng chỉ là lệnh tắt thôi nhỉ anh: không nên
5. trong code thêm: lại chạy được anh à
Sheets("1.KL V").Select
hidedongproKL
Sheets("1.KL V").Range("J8").Value = I
Sheets("1.KL V").PrintOut
 
Upvote 0
Chào anh Vova2209! Anh cho em hỏi, em tạo một listview nhiều cột, chỉ hiện thị một lúc được 10 cột, muốn xem cột nào thì mình kéo scroll bar nằm ngang đến cột đó. Vậy có code nào để tự động dịch scroll bar đến cột mình cần không anh?
 
Upvote 0
Chào anh Vova2209! Anh cho em hỏi, em tạo một listview nhiều cột, chỉ hiện thị một lúc được 10 cột, muốn xem cột nào thì mình kéo scroll bar nằm ngang đến cột đó. Vậy có code nào để tự động dịch scroll bar đến cột mình cần không anh?
Bạn ơi! nếu nhiều cột nó sẽ tự động thêm thanh quận ngang cho mình mà, không phải code đâu!
 
Upvote 0
Bạn ơi! nếu nhiều cột nó sẽ tự động thêm thanh quận ngang cho mình mà, không phải code đâu!

Dạ, em biết là có thành scroll bar nằm ngang để kéo đến cột cần xem, nhưng em muốn khi mở form, thì listview tự động kéo đến cột chứa dữ liệu cuối cùng, như vậy thì phải viết code như thế nào vậy anh?
 
Upvote 0
Em có sưu tập được code sau dùng để hiện màu cột, dòng căn cứ vào vị trí con chuột trong excel (dòng và cột cắt nhau tại vị trí này):

PHP:
Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
'Update 20140318
Static xRow
Static xColumn
If xColumn <> "" Then
    With Columns(xColumn).Interior
        .ColorIndex = xlNone
    End With
    With Rows(xRow).Interior
        .ColorIndex = xlNone
    End With
End If
pRow = Selection.Row
pColumn = Selection.Column
xRow = pRow
xColumn = pColumn
With Columns(pColumn).Interior
    .ColorIndex = 6
    .Pattern = xlSolid
End With
With Rows(pRow).Interior
    .ColorIndex = 6
    .Pattern = xlSolid
End With
End Sub

Hiện tại nó sẽ hiện màu toàn bộ ô trong dòng và cột. Có các nào khống chế số ô và dòng này bằng một con số nhất định được không anh chị. Ví dụ chỉ cho phép hiện màu trong vùng (A1:H5000) được không mọi người?
 
Upvote 0
Bạn thử với cái này:
PHP:
Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
'Sub GPE()
Update 20140318 '
Const Hg As Long = 50:            Const Cot As Integer = 23
Static xRow
Static xColumn

xRow = Selection.Row:               xColumn = Selection.Column
With Cells(1, xColumn).Resize(Hg).Interior
    .ColorIndex = 7:                .Pattern = xlSolid
End With
With Cells(xRow, 1).Resize(, Cot).Interior
    .ColorIndex = 7:                .Pattern = xlSolid
End With
End Sub

Sau đó tự sửa lại các tham số cần thiết.
 
Upvote 0
Bạn thử với cái này:
PHP:
Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
'Sub GPE()
Update 20140318 '
Const Hg As Long = 50:            Const Cot As Integer = 23
Static xRow
Static xColumn

xRow = Selection.Row:               xColumn = Selection.Column
With Cells(1, xColumn).Resize(Hg).Interior
    .ColorIndex = 7:                .Pattern = xlSolid
End With
With Cells(xRow, 1).Resize(, Cot).Interior
    .ColorIndex = 7:                .Pattern = xlSolid
End With
End Sub

Sau đó tự sửa lại các tham số cần thiết.

Cảm ơn anh ạ, em xin phép bổ sung thêm.

PHP:
If xColumn <> "" Then
    With Columns(xColumn).Interior
        .ColorIndex = xlNone
    End With
    With Rows(xRow).Interior
        .ColorIndex = xlNone
    End With
End If
...
 
Upvote 0
Mục đích bạn đưa mấy dòng lệnh này vô macro để làm gì vậy? Có thể cho biết được không nếu thấy không fiền?!
 
Upvote 0
Mục đích bạn đưa mấy dòng lệnh này vô macro để làm gì vậy? Có thể cho biết được không nếu thấy không fiền?!

Anh viết code chạy ngon lành mà không cần biết nó làm gì, giỏi thật. Cái này em hay nhập giấy nghỉ các loại theo từng cột ngày. Nhập rất nhiều sợ người lọ lẫn vào người kia nên em làm cái này để bấm vào người nào thì hiện màu dòng của người đó anh ạ :)

Dòng lệnh em thêm để nó bỏ màu đi nếu di chuyển sang các ô khác anh ạ.
 
Lần chỉnh sửa cuối:
Upvote 0
Thì mình thấy lạ ở chỗ là tham biến xColumn vừa khai báo ngay dòng trước đó;
Hiển nhiên tại dòng lệnh điều kiện
Mã:
If xColumn <> "" Then
Nó nhận trị rỗng hay bằng 0 gì đó; Nên câu hỏi mầy giống cái gì thì tham biến này làm sao nó trả lời!?!
 
Upvote 0
Thì mình thấy lạ ở chỗ là tham biến xColumn vừa khai báo ngay dòng trước đó;
Hiển nhiên tại dòng lệnh điều kiện
Mã:
If xColumn <> "" Then
Nó nhận trị rỗng hay bằng 0 gì đó; Nên câu hỏi mầy giống cái gì thì tham biến này làm sao nó trả lời!?!

Chắc nó liên quan cái Static. Bài đầu em bảo code sưu tầm mà chứ em có viết ra nó đâu anh :D
 
Upvote 0
Sưu tầm nhưng fải có chọn lọc; Có thế mới đúng theo chủ trương & nghị quyết đó nha!

Chúc vui!
 
Upvote 0
Sưu tầm nhưng fải có chọn lọc; Có thế mới đúng theo chủ trương & nghị quyết đó nha!

Chúc vui!

Vì nếu không có đoạn đó thì khi di chuyển con trỏ chuột sang ô khác (giống như hành quân sang vị trí khác nhưng không thu dọn bãi chiến trường anh ạ).
 
Upvote 0
Em thường phải trích lọc số liệu dựa vào mã ID. Có ID 5 số (Ví dụ 10001, 20001, 30001), hoặc 6 số (Ví dụ 100012, 200012, 300012)., hoặc 7 số (Ví dụ 1000123, 2000123, 3000123). Có cách đặt biến nào để chỉ các giá trị thỏa mãn điều kiện mình đặt ra (Ví dụ từ 10000 đến 29999) thì mới lấy các đầu số đó không mọi người? Em thì đang dùng hàm len đếm số lượng chữ số để loại... nhưng muốn làm theo kiểu khoanh vùng kia cho rõ ràng đỡ nhầm lẫn.
 
Upvote 0
Web KT

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

Back
Top Bottom