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

vova2209

Thành viên tiêu biểu
Tham gia ngày
5 Tháng tư 2017
Bài viết
576
Được thích
61
Đ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
31
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
576
Được thích
61
Đ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
31
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,103
Được thích
92
Đ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,933
Đ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,103
Được thích
92
Đ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,933
Đ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?!
 

tueyennhi

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

ChanhTQ@

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

tueyennhi

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

ChanhTQ@

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

tueyennhi

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

tueyennhi

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

Hai Lúa Miền Tây

❆❆❆❆❆❆❆❆
Thành viên BQT
Administrator
Tham gia ngày
18 Tháng ba 2008
Bài viết
7,365
Được thích
14,254
Điểm
1,910
Nơi ở
Tp.HCM
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.
Nếu lọc dữ liệu = ADO thì có thể bạn dùng điều kiện Where Col In (1000123, 2000123, 3000123...)
 

tueyennhi

Thành viên tích cực
Tham gia ngày
18 Tháng mười 2010
Bài viết
1,103
Được thích
92
Điểm
420
Tuổi
31
Chủ để của em trên diễn đàn thường chỉ xoay quanh chấm công lương. Về công, mỗi ngày công sẽ là một sheet và có một Sheet tổng hợp toàn bộ công của mọi người trong công ty. Mà cái ADO tuy rằng đã từng ứng dụng theo một chủ đề của anh (Tách một file thành nhiều file mà trong file chứa nhiều sheet) nhưng để mà tự xây dựng thì chắc phải học dài dài chưa chắc hiểu.
 

toeic1

Thành viên mới
Tham gia ngày
12 Tháng mười một 2017
Bài viết
4
Được thích
0
Điểm
0
Tuổi
25
Mọi người cho em hỏi với ak
Em có đoạn code sau:
Private Sub CommandButton2_Click()
Dim i As Integer
Dim x As Integer
Dim y As integer
i = Application.InputBox("KL do tai", , i)
x = Range("k9")
y = application.activecell
x = x + y
i = i - x
MsgBox "KL sau khi dieu phoi" & i
End Sub
Vấn đề ở đây là giá trị x sẽ bằng ô K9 cộng với giá trị y ở ô hiện hành. Sau mỗi lần tính em muốn lưu cái giá trị đó lại để thực hiện cho lần tính sau thì làm thế nào aj?
 

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
Còn huyền ảo, nhưng cũng fán đại; Trúng trật hạ hồi fân giải:
Muốn xài lại kết quả tham biến thì ghi lại nó vô xó nào đó;
Ghi vô 1 biến toàn cục;
Ghi lên 1 ô còn lâu mới xài đến.
. . . .

Chúc thành công & vui vẻ ngày cuối tuần!
 
Top Bottom