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

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,881
Được thích
17,848
Điểm
1,860
Bạn xem 2 dòng lệnh này:
PHP:
MsgBox .Range("A23:Q" & .Range("A" & Rows.Count).End(xlUp).Row).Address
       .Range("A23:Q" & Range("A" & Rows.Count).End(xlUp).Row).Copy
Khi xài With . . .. End With
 

audi172ht

Thành viên mới
Tham gia ngày
1 Tháng chín 2011
Bài viết
3
Được thích
0
Điểm
363
Tuổi
29
Các bác cho em hỏi em muốn từ excel mở một file word lên - tìm và xóa dòng chữ trong file word vừa mở thì làm thế nào ạ.
 

huongmuine

Thành viên GPE
Tham gia ngày
27 Tháng năm 2010
Bài viết
211
Được thích
31
Điểm
685
Mình sử dụng code bên dưới để copy vùng dữ liệu từ sheet1 sang sheet2., nhưng code không hoạt động. Nhờ anh chị chỉ giúp lỗi.
Cảm ơn.
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Sheets("TKB").Range("C46:G53"), Target) Is Nothing Then
Sheets("1A").Range("C5:G12").Value = Sheets("TKB").Range("C46:G53").Value
End If
End Sub
 

Duong.bach

Thành viên mới
Tham gia ngày
28 Tháng ba 2020
Bài viết
18
Được thích
2
Điểm
15
Tuổi
28
Application.EnableEvents = False
Application.EnableEvents = True
Chào các bác, cho em hỏi khi mình muốn dừng các sự kiện của worksheet thì dùng 2 câu lệnh trên,
Vậy trong userform thì mình dùng lệnh nào tương ứng ạ, ví dụ trong TextBox1_Change ạ.
 

leonguyenz

Thành viên mới
Thành viên BQT
Moderator
Tham gia ngày
2 Tháng tám 2010
Bài viết
4,651
Được thích
8,214
Điểm
910
Nơi ở
Bình Dương
Application.EnableEvents = False
Application.EnableEvents = True
Chào các bác, cho em hỏi khi mình muốn dừng các sự kiện của worksheet thì dùng 2 câu lệnh trên,
Vậy trong userform thì mình dùng lệnh nào tương ứng ạ, ví dụ trong TextBox1_Change ạ.
Bạn sử dụng BeforeUpdate thay cho Change.
 

huuthang_bd

Chuyên gia GPE
Tham gia ngày
10 Tháng chín 2008
Bài viết
7,951
Được thích
9,288
Điểm
860
Nơi ở
TP.HCM
Bạn sử dụng BeforeUpdate thay cho Change.
Đâu phải trường hợp nào cũng thay thế được đâu bạn.
Application.EnableEvents = False
Application.EnableEvents = True
Chào các bác, cho em hỏi khi mình muốn dừng các sự kiện của worksheet thì dùng 2 câu lệnh trên,
Vậy trong userform thì mình dùng lệnh nào tương ứng ạ, ví dụ trong TextBox1_Change ạ.
Bạn sử dụng 1 biến để bật tắt sự kiện.
Mã:
Private Sub TextBox1_Change()
Static bDisableEvents As Boolean
If Not bDisableEvents Then
    bDisableEvents = True
    '...
    '...
    '...
    bDisableEvents = False
End If
End Sub
 

moihocvba

Thành viên mới
Tham gia ngày
16 Tháng tám 2020
Bài viết
12
Được thích
0
Điểm
13
Tuổi
22
Mọi người cho mình hỏi, trong công thức VBA, cũng là tên sheet như mình thấy có lúc người ta đặt trong dấu nháy đơn, có lúc không dùng, vì sao vậy ạ?

ActiveCell.FormulaR1C1 = "='ban 1'!RC+ban2!RC"

Tại 2 vị trí in đậm. Đây là công thức chạy đúng. Ban 1 Ban2 là tên 2 sheet tồn tại.
 
Lần chỉnh sửa cuối:

Love GPE

Thành viên mới
Tham gia ngày
17 Tháng hai 2020
Bài viết
34
Được thích
14
Điểm
15
Em chào Anh Chị,
Em đang học code. Em thấy trong phần khai báo biến mảng mọi người hay dùng TmpArr as Variant. Vậy Tmp là viết tắt của cụm từ gì? Mong A/C chỉ bảo!
 

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,881
Được thích
17,848
Điểm
1,860
Bạn cứ nghĩ đó là rút gọn của từ Temp đi cũng được!
:D
 

Love GPE

Thành viên mới
Tham gia ngày
17 Tháng hai 2020
Bài viết
34
Được thích
14
Điểm
15

moihocvba

Thành viên mới
Tham gia ngày
16 Tháng tám 2020
Bài viết
12
Được thích
0
Điểm
13
Tuổi
22
Chào mọi người.
Công thức của Excel của em nó là như này:
Mã:
=IF(D21="",0,PRODUCT(IFERROR(TRIM(MID(SUBSTITUTE(" " & TRIM(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(D21,"m",""),"t",""),"x"," "))," ",REPT(" ",99)),99*ROW($1:$10),99))*1,1)))
E viết vào VBA dạng như này:
Mã:
"=IF(D21="""",0,PRODUCT(IFERROR(TRIM(MID(SUBSTITUTE("" "" & TRIM(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(D21,""m"",""""),""t"",""""),""x"","" "")),"" "",REPT("" "",99)),99*ROW($1:$10),99))*1,1)))""
Nhưng khi chạy code thì nó ra công thức như này, giống nhau hết, nhưng dư ký tự @ trước hàm row:
Mã:
=IF(D21="",0,PRODUCT(IFERROR(TRIM(MID(SUBSTITUTE(" " & TRIM(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(D21,"m",""),"t",""),"x"," "))," ",REPT(" ",99)),99*(@ROW($1:$10)),99))*1,1)))
Mọi người cho em hỏi là vì sao vậy ạ, và có thể sửa như thế nào ạ?
 

Love GPE

Thành viên mới
Tham gia ngày
17 Tháng hai 2020
Bài viết
34
Được thích
14
Điểm
15
Em chào A/C,
Em có thực hành thử đoạn code copy công thức ở hàng D2:E2 rồi dán công thức vào các ô từ D3:E10. Nhưng khi code chạy đến đoạn copy công thức thì đang bị sai tọa độ dòng.
- Ở dòng 2 công thức D2 =B2*C2
- Khi code copy xuống dòng 3 thì công thức D3 = B2*C2 bị sai tọa độ dòng (đúng thì nó phải là =B3*C3)

Mã:
Sub ThanhTien()
Dim i As Integer
i = Sheet1.Range("A" & Rows.Count).End(xlUp).Row
Sheet1.Range("D3:E" & i).Formula = Sheet1.Range("D2:E2").Formula
Sheet1.Range("D3:E" & i).Value = Sheet1.Range("D3:E" & i).Value
End Sub
Em sửa code như này thì code chạy đúng dòng: Sheet1.Range("D2:E" & i).Formula = Sheet1.Range("D2:E2").Formula
Em muốn hỏi thêm A/C còn có giải pháp nào thêm nữa ko ạ. Tks Anh Chị nhiều!
1601722762093.png
 

phulien1902

GPE - My love
Tham gia ngày
6 Tháng bảy 2013
Bài viết
3,539
Được thích
4,411
Điểm
560
Nơi ở
Hải Phòng
Em chào A/C,
Em có thực hành thử đoạn code copy công thức ở hàng D2:E2 rồi dán công thức vào các ô từ D3:E10. Nhưng khi code chạy đến đoạn copy công thức thì đang bị sai tọa độ dòng.
- Ở dòng 2 công thức D2 =B2*C2
- Khi code copy xuống dòng 3 thì công thức D3 = B2*C2 bị sai tọa độ dòng (đúng thì nó phải là =B3*C3)

Mã:
Sub ThanhTien()
Dim i As Integer
i = Sheet1.Range("A" & Rows.Count).End(xlUp).Row
Sheet1.Range("D3:E" & i).Formula = Sheet1.Range("D2:E2").Formula
Sheet1.Range("D3:E" & i).Value = Sheet1.Range("D3:E" & i).Value
End Sub
Em sửa code như này thì code chạy đúng dòng: Sheet1.Range("D2:E" & i).Formula = Sheet1.Range("D2:E2").Formula
Em muốn hỏi thêm A/C còn có giải pháp nào thêm nữa ko ạ. Tks Anh Chị nhiều!
View attachment 246697
Bạn thử:
PHP:
With Sheet1
        .Range("D2").FormulaR1C1 = "=RC[-2]*RC[-1]"
        .Range("d2:d" & .Range("A" & Rows.Count).End(xlUp).Row).FillDown
    End With
 

Ba Tê

Gội Rồi Mới Cạo
Tham gia ngày
5 Tháng năm 2009
Bài viết
11,718
Được thích
16,734
Điểm
1,860
Tuổi
61
Nơi ở
An Giang
Bạn thử:
PHP:
With Sheet1
        .Range("D2").FormulaR1C1 = "=RC[-2]*RC[-1]"
        .Range("d2:d" & .Range("A" & Rows.Count).End(xlUp).Row).FillDown
    End With
Cái này chỉ cần 1 dòng:
PHP:
Sheet1.Range("d2:d" & Sheet1.Range("A" & Rows.Count).End(xlUp).Row).FormulaR1C1 = "=RC[-2]*RC[-1]"
 

holykens

Thành viên mới
Tham gia ngày
12 Tháng mười 2020
Bài viết
8
Được thích
2
Điểm
15
Em chào A/C,

Hiện tại em muốn extract date dựa trên kết quả Find. Code hiện tại như sau:

Sub Findingthelastregistrationdates()
Sheet1.Select

For X = 1 To 11
Rng = Sheets("Reference").Cells(131 + X, 8).Value
If Not Rng = "0" Or Rng = "" Then
Cells.Find(What:=Rng, After:=Range("A1"), LookIn:=xlValues, LookAt:= _
xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
, SearchFormat:=False).Select
ActiveCell.Offset(0, 9).Value = ActiveCell
End If
Next
End Sub

Vấn đề là Excel ko tìm thấy kết quả như của dòng code:
1602505925740.png
Như ở hình trên thì đang ở Cell H137 của sheet Reference:
1602506357772.png

Nhưng em đã thử find manual thì vẫn tìm thấy date là 13/08/2019:
1602506117312.png
Mong các a/c giúp đỡ ạ.
 

File đính kèm

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,881
Được thích
17,848
Điểm
1,860
Thứ nhất: Bạn xài phương thức FIND() như câu lệnh là không chắc chắn & nguy cơ sẽ dẫn bạn đến lỗi 1 khi không tìm ra ô có chứa dữ liệu cần tìn
Muốn phòng ngừa lỗi cần phải viết chân phương hơn.

Thứ hai: Khi tìm một trị kiểu Ngày-tháng-năm, vùng tìm & ngày cần tìm phải ở dạng "MM/DD/YYYY" trước khi FIND()

Bạn thử nghiền ngẫm hàm này 1 hồi xem sao:
PHP:
Function NgayKT(Rng As Range) As Date
Dim Dem As Integer, J As Integer, W As Integer, Dat As Date
Dim sRng As Range

If UCase$(Rng(1).Value) = "X" Then
    If UCase$(Rng(4).Value) = "NT" Then
        Dem = 5
    ElseIf UCase$(Rng(4).Value) = "NGT" Then
        Dem = 7
    End If   
    For J = 0 To 35
        Dat = Rng(5).Value + J
        Set sRng = Range("NgayLe").Find(Format(Rng(5), "MM/DD/yyyy"), , xlValues, xlWhole)
        If Weekday(Dat) > 1 Or sRng Is Nothing Then
            Dem = Dem - 1
            If Dem = 0 Then
                NgayKT = Dat:           Exit Function
            End If
        End If
    Next J
End If
End Function
 
Lần chỉnh sửa cuối:
Top Bottom