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

Hoang2013

Thành viên gắn bó
Tham gia ngày
15 Tháng tám 2013
Bài viết
1,625
Được thích
1,598
Điểm
560
Tuổi
6
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!
 

dkkx3a

Thành viên mới
Tham gia ngày
14 Tháng chín 2007
Bài viết
13
Được thích
0
Điểm
663
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

PacificPR

Thành viên gắn bó
Tham gia ngày
6 Tháng năm 2016
Bài viết
1,905
Được thích
2,574
Điểm
360
Nơi ở
Cái Bang
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 ?
 

dkkx3a

Thành viên mới
Tham gia ngày
14 Tháng chín 2007
Bài viết
13
Được thích
0
Điểm
663
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ộ).
 

giaiphap

==(^o^)==
Tham gia ngày
12 Tháng ba 2007
Bài viết
5,209
Được thích
4,828
Điểm
860
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
 

Đặng Anh Khoa

Thành viên mới
Tham gia ngày
21 Tháng tám 2017
Bài viết
5
Được thích
1
Điểm
0
Tuổi
26
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

befaint

|||||||||||||
Tham gia ngày
6 Tháng một 2011
Bài viết
9,549
Được thích
11,200
Điểm
1,560
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
 

vova2209

Thành viên tiêu biểu
Tham gia ngày
5 Tháng tư 2017
Bài viết
602
Được thích
63
Điểm
220
Tuổi
33
Nơi ở
TP. Tuyên Quang
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]
 

SA_DQ

/(hông là gì!
Thành viên danh dự
Tham gia ngày
8 Tháng sáu 2006
Bài viết
11,607
Được thích
17,586
Điểm
1,860
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.
 

PHANPHUOCDINH

Thành viên mới
Tham gia ngày
22 Tháng chín 2015
Bài viết
4
Được thích
1
Điểm
165
Tuổi
32
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.
 

vova2209

Thành viên tiêu biểu
Tham gia ngày
5 Tháng tư 2017
Bài viết
602
Được thích
63
Điểm
220
Tuổi
33
Nơi ở
TP. Tuyên Quang
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

ChanhTQ@

0901452không62
Tham gia ngày
5 Tháng chín 2008
Bài viết
4,261
Được thích
4,939
Điểm
100
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!
 

vova2209

Thành viên tiêu biểu
Tham gia ngày
5 Tháng tư 2017
Bài viết
602
Được thích
63
Điểm
220
Tuổi
33
Nơi ở
TP. Tuyên Quang
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
 

PHANPHUOCDINH

Thành viên mới
Tham gia ngày
22 Tháng chín 2015
Bài viết
4
Được thích
1
Điểm
165
Tuổi
32
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?
 

vova2209

Thành viên tiêu biểu
Tham gia ngày
5 Tháng tư 2017
Bài viết
602
Được thích
63
Điểm
220
Tuổi
33
Nơi ở
TP. Tuyên Quang
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!
 

PHANPHUOCDINH

Thành viên mới
Tham gia ngày
22 Tháng chín 2015
Bài viết
4
Được thích
1
Điểm
165
Tuổi
32
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?
 

tueyennhi

Thành viên tích cực
Tham gia ngày
18 Tháng mười 2010
Bài viết
1,136
Được thích
97
Điểm
420
Tuổi
31
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?
 

ChanhTQ@

0901452không62
Tham gia ngày
5 Tháng chín 2008
Bài viết
4,261
Được thích
4,939
Điểm
100
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.
 

tueyennhi

Thành viên tích cực
Tham gia ngày
18 Tháng mười 2010
Bài viết
1,136
Được thích
97
Điểm
420
Tuổi
31
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
...
 

ChanhTQ@

0901452không62
Tham gia ngày
5 Tháng chín 2008
Bài viết
4,261
Được thích
4,939
Điểm
100
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?!
 
Top Bottom