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

thangteo

Thành viên thường trực
Tham gia ngày
8 Tháng năm 2007
Bài viết
381
Được thích
43
Điểm
685
Tuổi
33
Quan trọng là dùng để làm gì. Ví dụ nếu dùng để tính thời gian làm bài thì tôi chỉ cần giữ chuột ở thanh tiêu đề của form là có thể "tạm dừng" được.
Dạ cũng gần tương tự như chạy thời gian làm bài thôi ạ, nhưng khi muốn dừng tắt thời gian chạy đó thì nhấn nút để vừa dừng thời gian chạy cùng với tắt form thời gian đó luôn. Chứ cứ giữ mãi thanh tiêu đề của form để dừng thời gian thì bất tiện quá!
 

huuthang_bd

Chuyên gia GPE
Tham gia ngày
10 Tháng chín 2008
Bài viết
7,221
Được thích
8,170
Điểm
860
Nơi ở
TP.HCM
Dạ cũng gần tương tự như chạy thời gian làm bài thôi ạ, nhưng khi muốn dừng tắt thời gian chạy đó thì nhấn nút để vừa dừng thời gian chạy cùng với tắt form thời gian đó luôn. Chứ cứ giữ mãi thanh tiêu đề của form để dừng thời gian thì bất tiện quá!
Tôi đang giả sử tôi là thí sinh. Trong thời gian suy nghĩ tôi nhấn giữ chuột ở thanh tiêu đề để tạm dừng thời gian. Mục đích là để gian lận thời gian.
 

thangteo

Thành viên thường trực
Tham gia ngày
8 Tháng năm 2007
Bài viết
381
Được thích
43
Điểm
685
Tuổi
33
Tôi đang giả sử tôi là thí sinh. Trong thời gian suy nghĩ tôi nhấn giữ chuột ở thanh tiêu đề để tạm dừng thời gian. Mục đích là để gian lận thời gian.
Không đến mức phải gian lận vậy đâu anh. Mà chỉ có mình ngồi xử lý form thôi mà. Hội kia từng người làm bài, làm xong thì báo mồm. Kaka.
 

boma

Thành viên mới
Tham gia ngày
8 Tháng mười hai 2006
Bài viết
41
Được thích
4
Điểm
665
Nơi ở
TP.HCM
Xin hỏi mọi người đoạn code này có nghĩa gì, tại sao lại khai báo biến ở tên của thủ tục (ByVal Target..) và Intersect có nghĩa gì ?

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect(Target, Range("AM1:XFD1")) Is Nothing Then
If Target.Rows.Count = 1 Then
Range("AL1").Value = Target.Value
Range("AL2").Value = Target.Offset(1).Value
GPE
End If
End If
End Sub
 

chitbk

Thành viên mới
Tham gia ngày
11 Tháng hai 2009
Bài viết
7
Được thích
0
Điểm
663
Tuổi
34
Các anh chị giúp em với.
Nhờ các anh chị giải thích code của hàm sau với:
ThisWorkbook.Activate
wksInput.Shapes("cmbUniaxialAnalysis").ThreeD.BevelTopType = msoBevelSlope
 

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 tích cực
Tham gia ngày
12 Tháng tư 2017
Bài viết
1,263
Được thích
1,944
Đ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

Thành viên gạo cội
Tham gia ngày
12 Tháng ba 2007
Bài viết
4,834
Được thích
4,094
Đ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
25
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,023
Được thích
10,435
Đ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
566
Được thích
58
Đ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
6,414
Được thích
10,539
Đ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
31
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
566
Được thích
58
Đ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,933
Đ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!
 
Top Bottom