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:
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

  • addin.xla
    31.5 KB · Đọc: 8
  • Excel mau.xls
    46 KB · Đọc: 9
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

  • VD.xlsx
    8.7 KB · Đọc: 3
Upvote 0
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
Web KT
Back
Top Bottom