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:
Public Sub hello()
MsgBox TypeName(Application.Match([C6].Value, [a1:a26], 0))
MsgBox TypeName(Application.Match([C6].Value2, [a1:a26], 0))
MsgBox TypeName(Application.Match([C6], [a1:a26], 0))
End Sub

ủa sao cái nào nó cũng cho Error
ý bạn là sao?
tôi nghe nó value2 không sử dụng được cho date?
 
Upvote 0
giỡn chơi quài đại ka
đối với kiểu Date thì Match trong VBA chỉ nhận 2 kiểu
1 là .Value2
2 là Range
như vậy cái đầu sẽ là Error
2 cái sau là Double

ok, sorry, vì tôi sửa ngày mà ko để ý
=======
1-
lý do mà tôi không tìm chính xác là vì
vì ví dụ khi người ta nhập từ ngày 3/7/15, mà trong cột dữ liệu ko có ngày này (ngày đó nghỉ, ko có dữ liệu nhập) thì nó tìm được dòng cuối là ngày 2/7
=======
2-
cái dzụ value2, thì.........hihhihi, tôi học mò ko à, ko có rành lý thuyết, thấy trong help của excel nó viết như vậy
Mã:
The only difference between this property and the [B]Value[/B] property is  that the [B]Value2[/B] property doesn’t use the [B]Currency[/B] and [B]Date[/B]  data types. You can return values formatted with these data types as  floating-point numbers by using the [B]Double[/B] data type.
============
3-
nhưng mà như bạn nó quá 20 000 thì ko xài hàm match , vậy kế hoạch của tôi phá sản rồi
mà nghĩ cũng lạ hén, anh Bill này nâng số dòng của excel lên cho cố rồi xử lý không nổi.
===============
4-
tôi nhớ có lần bạn nói, giới hạn của mảng là bao nhiêu dòng vậy
 
Lần chỉnh sửa cuối:
Upvote 0
ok, sorry, vì tôi sửa ngày mà ko để ý
=======
1-
lý do mà tôi không tìm chính xác là vì
vì ví dụ khi người ta nhập từ ngày 3/7/15, mà trong cột dữ liệu ko có ngày này (ngày đó nghỉ, ko có dữ liệu nhập) thì nó tìm được dòng cuối là ngày 2/7
=======
2-
cái dzụ value2, thì.........hihhihi, tôi học mò ko à, ko có rành lý thuyết, thấy trong help của excel nó viết như vậy
Mã:
The only difference between this property and the [B]Value[/B] property is  that the [B]Value2[/B] property doesn’t use the [B]Currency[/B] and [B]Date[/B]  data types. You can return values formatted with these data types as  floating-point numbers by using the [B]Double[/B] data type.
============
3-
nhưng mà như bạn nó quá 20 000 thì ko xài hàm match , vậy kế hoạch của tôi phá sản rồi
mà nghĩ cũng lạ hén, anh Bill này nâng số dòng của excel lên cho cố rồi xử lý không nổi.
===============
4-
tôi nhớ có lần bạn nói, giới hạn của mảng là bao nhiêu dòng vậy

dữ liệu ngày xếp thứ tự rồi thì cho dù tìm cần dò tìm không chính xác thì cách dùng mảng vẫn làm được chứ .
em khác gì anh , cũng toàn đi học lỏm , em thấy như vầy
giá trị thật của 1 ô có format ngày thật ra là giá trị của ô đó khi Format là General
khi gặp .Value excel check xem ô đó có Format ngày hay không ? nếu có thì nó lấy giá trị ô đó rồi cố gắng cast về dạng ngày tháng
còn khi gặp .Value2 thì excel chỉ lấy giá trị thật của ô đó là xong
Bill nâng số dòng của excel lên nhiều vì Bill biết ngoài cách dùng hàm Match ra còn nhiều cách khác lợi hại hơn để làm việc với dữ liệu lớn , và Bill cũng muốn thử tài các lập trình viên VBA đó mà . ha ha
giới hạn của mảng tùy vào máy 32 bit hay 64 bit , con số cụ thể thì để các nhà bác học trên GPE trả lời
dân đen chúng ta chỉ cần gán giá trị trên sheet xuống mảng , khi nào thấy nó la làng lên
OVER FLOW thì lúc đó tự hiểu là phải giảm số dòng xuống
đối với dữ liệu khoảng 60 000 dòng và dưới 30 cột thì không cần lo về vấn đề giới hạn mảng
 
Upvote 0
Chào các anh chị,
em có đoạn code chạy lần đầu không bị lỗi, nhưng chạy lần 2 thì bị lỗi.
Mong các anh chị GPE xem và chỉnh sửa giúp ạ
em có đính kèm file cho mọi người dễ kiểm tra nhé

Mã:
Sub copy_sheet()
Worksheets("Cycle form").Activate
ActiveWorkbook.Worksheets("Cycle form").Copy
ActiveSheet.Range([D6], [H65536].End(xlUp)).Select
Selection.Copy
ActiveWorkbook.Worksheets("Cycle form").Range("D6:H13").PasteSpecial xlValues
Dim ShName As String, MyFileName As String
ShName = "Cycle form"
MyFileName = Range("R1")
ActiveWorkbook.SaveAs Filename:=Worksheets(ShName).[Q1] & MyFileName & ".xls"
End Sub
 

File đính kèm

  • test.xlsm
    554.5 KB · Đọc: 14
Upvote 0
Chào các anh chị,
em có đoạn code chạy lần đầu không bị lỗi, nhưng chạy lần 2 thì bị lỗi.
Mong các anh chị GPE xem và chỉnh sửa giúp ạ
em có đính kèm file cho mọi người dễ kiểm tra nhé

Mã:
Sub copy_sheet()
Worksheets("Cycle form").Activate
ActiveWorkbook.Worksheets("Cycle form").Copy
ActiveSheet.Range([D6], [H65536].End(xlUp)).Select
Selection.Copy
ActiveWorkbook.Worksheets("Cycle form").Range("D6:H13").PasteSpecial xlValues
Dim ShName As String, MyFileName As String
ShName = "Cycle form"
MyFileName = Range("R1")
ActiveWorkbook.SaveAs Filename:=Worksheets(ShName).[Q1] & MyFileName & ".xls"
End Sub
Lỗi là đúng thôi.
chạy code đầu tiên thì Myfilename được lưu trong thư mục.
chạy code lần 2 myfilename có rồi thì sao lưu đè lên được.
nếu muốn lưu đè lên thì bạn cho cặp này ở đầu và cuối code:
Application.Displayalert= False
...
Application.displayalert= true
 
Upvote 0
Sub copy_sheet()
Worksheets("Cycle form").Activate
ActiveWorkbook.Worksheets("Cycle form").Copy
ActiveSheet.Range([D6], [H65536].End(xlUp)).Select
Selection.Copy
ActiveWorkbook.Worksheets("Cycle form").Range("D6:H13").PasteSpecial xlValues
Dim ShName As String, MyFileName As String
ShName = "Cycle form"
MyFileName = Range("R1")
ActiveWorkbook.SaveAs Filename:=Worksheets(ShName).[Q1] & MyFileName & ".xls"
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Lỗi là đúng thôi.
chạy code đầu tiên thì Myfilename được lưu trong thư mục.
chạy code lần 2 myfilename có rồi thì sao lưu đè lên được.
nếu muốn lưu đè lên thì bạn cho cặp này ở đầu và cuối code:
Application.Displayalert= False
...
Application.displayalert= true

Em đã làm theo hướng dẫn nhưng vẫn bị lỗi anh ơi, anh xem lại giúp em với
Mã:
Sub copy_sheet()
Application.displayalert = False
Dim ShName As String, MyFileName As String
Worksheets("Cycle form").Activate
ActiveWorkbook.Worksheets("Cycle form").Copy
ActiveSheet.Range([D6], [H65536].End(xlUp)).Select
Selection.Copy
ActiveWorkbook.Worksheets("Cycle form").Range("D6:H13").PasteSpecial xlValues
ShName = "Cycle form"
MyFileName = Range("R1")
ActiveWorkbook.SaveAs Filename:=Worksheets(ShName).[Q1] & MyFileName & ".xls"
Application.displayalert = True
End Sub
 
Upvote 0
Lỗi là đúng thôi.
chạy code đầu tiên thì Myfilename được lưu trong thư mục.
chạy code lần 2 myfilename có rồi thì sao lưu đè lên được.
nếu muốn lưu đè lên thì bạn cho cặp này ở đầu và cuối code:
Application.Displayalert= False
...
Application.displayalert= true

Application.displayalerts
 
Upvote 0
Mong được sự giúp đỡ của các anh chị. em xin cám ơn!
Range("Q" & Worksheets("KEHOACH").Cells(1, 1)).FormulaArray = _
"=IF(RC12="""",0,SUM(IF(RC12=XUATTP!R4C4:R50000C4,1,0)*IF(RC13=XUATTP!R4C5:R50000C5,1,0)*IF(RC6=XUATTP!R4C6:R50000C6,1,0)*IF(RC14=XUATTP!R4C9:R50000C9,1,0)*IF(RC15=XUATTP!R4C11:R50000C11,1,0)*XUATTP!R4C12:R50000C12))"
Range("Q" & Worksheets("KEHOACH").Cells(1, 1) & ":Q" & Worksheets("KEHOACH").Cells(1, 2)).FillDown
ActiveSheet.Calculate
Range("Q" & Worksheets("KEHOACH").Cells(1, 1) & ":Q" & Worksheets("KEHOACH").Cells(1, 2)).Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
Nhờ anh chị giải thíc vì em chưa hiểu một số câu lệnh trong đoạn code trên :(:
- "=IF(RC12="""",0, ƠO em chưa hiểu ("""") có nghĩa là gì, sau đó sao lại là số 0
- SUM(IF(RC12=XUATTP!R4C4:R50000C4,1,0) cÂU LỆNH NÀY LIÊN KẾT ĐẾN SHEET KHÁC ĐÚNG KHÔNG Ạ
- *IF( Dấu * ở đây có nghĩa là gì ?
- Range("Q" & Worksheets("KEHOACH").Cells(1, 1)) âu Câu lệnh này có phải chọn cột Q tại sheets kế hoạch không ạ
- Nếu e muốn tính tộng có điệu kiện các dòng của sheet2 đổ về các dòng tương ứng điều kiện của sheets1 thi e phải làm sao.
Xian chân thành cảm ơn các anh chị
 
Upvote 0
Nhờ anh chị giải thíc vì em chưa hiểu một số câu lệnh trong đoạn code trên :(:
- "=IF(RC12="""",0, ƠO em chưa hiểu ("""") có nghĩa là gì, sau đó sao lại là số 0
1/"""" tương đương với để trống, khi bạn xài công thức trực tiếp ở ngoài sheet thì là "" (Tức là khi dữ liệu trong cell mà trống thì lấy 0)
- SUM(IF(RC12=XUATTP!R4C4:R50000C4,1,0) cÂU LỆNH NÀY LIÊN KẾT ĐẾN SHEET KHÁC ĐÚNG KHÔNG Ạ
Theo bạn hiểu liên kết có nghĩa là gì? Chỗ tô đỏ là điều kiện lấy từ sheet khác (XUATTP)
- *IF( Dấu * ở đây có nghĩa là gì ?
Dấu * là dấu nhân thôi chứ có gì đâu ta?
- Range("Q" & Worksheets("KEHOACH").Cells(1, 1)) Câu lệnh này có phải chọn cột Q tại sheets kế hoạch không ạ
Đúng là thao tác với cột Q sheet kế hoạch. (chọn thì không có)
- Nếu e muốn tính tộng có điệu kiện các dòng của sheet2 đổ về các dòng tương ứng điều kiện của sheets1 thi e phải làm sao.
Thì hãy đưa file lên đây.
 
Upvote 0
Nhờ mọi người kiểm tra dùm em xem tại sao CODE này lại báo lỗi ạ. Trong File em muốn tính tổng của từng bộ phận
 

File đính kèm

  • HOI.xls
    36.5 KB · Đọc: 12
Upvote 0
Nhờ mọi người kiểm tra dùm em xem tại sao CODE này lại báo lỗi ạ. Trong File em muốn tính tổng của từng bộ phận

Code của bạn:
Mã:
Sub vidu()
Dim i As Integer, j As Integer, tong As [COLOR=#ff0000]Integer[/COLOR]
...................
End Sub
Giới hạn của Integer chỉ đến 32,767 trong khi giá trị bạn cộng dồn lên đến hàng triệu. Vậy thay chỗ màu đỏ thành Long xem sao
Mà nói chung thì cũng chẳng việc gì phải xài Integer, cứ Long toàn bộ cho nó chắc
 
Upvote 0
Code của bạn:
Mã:
Sub vidu()
Dim i As Integer, j As Integer, tong As [COLOR=#ff0000]Integer[/COLOR]
...................
End Sub
Giới hạn của Integer chỉ đến 32,767 trong khi giá trị bạn cộng dồn lên đến hàng triệu. Vậy thay chỗ màu đỏ thành Long xem sao
Mà nói chung thì cũng chẳng việc gì phải xài Integer, cứ Long toàn bộ cho nó chắc

Dạ . Cảm ơn chú ạ :-=:-=
 
Upvote 0
1/"""" tương đương với để trống, khi bạn xài công thức trực tiếp ở ngoài sheet thì là "" (Tức là khi dữ liệu trong cell mà trống thì lấy 0)

Theo bạn hiểu liên kết có nghĩa là gì? Chỗ tô đỏ là điều kiện lấy từ sheet khác (XUATTP)

Dấu * là dấu nhân thôi chứ có gì đâu ta?

Đúng là thao tác với cột Q sheet kế hoạch. (chọn thì không có)

Thì hãy đưa file lên đây.

Hiện Tại file em đang làm mong a chị chỉ dẫn
 

File đính kèm

  • DATADULIEU2015122221.xlsm
    213.5 KB · Đọc: 16
Upvote 0
Bài này dùng hàm, chứ vba chi vậy bạn.
TÔi làm công thức cho bạn tại cột L, các cột khác bạn tự nghiên cứu và làm theo

Mã:
 L4 =SUMIFS(XUATTP!$K$4:$K$1000,XUATTP!$G$4:$G$1000,$B4,XUATTP!$D$4:$D$1000,$E4,XUATTP!$E$4:$E$1000,$F4,XUATTP!$H$4:$H$1000,$G4,XUATTP!$F$4:$F$1000,$H4,XUATTP!$J$4:$J$1000,$I4)
Cớm Ơn Anh về đoạn mã cho em xin hỏi thêm chút xíu về vấn đề VBA
____SUM(IF(RC12=XUATTP!R4C4:R50000C4, 1,0)*IF(RC13=XUATTP!R4C5:R50000C5,1,0): Giá trị 1 và 0 ở đây có nghĩa là gì
Em xin cám ơn
 
Upvote 0
Cái này là công thức mảng, Sum và If thôi mà, 1,0 là trong hàm if trả về nếu True thì 1, false là 0. Hàm này chẳng qua là bạn gõ ngoài sheet thôi mà... Ví dụ If(1>0,true,false). Thì biểu thức trên ta có thể thay thế chữ true/false bằng 1/0 hoặc là "Đúng"/"Sai" thôi...
P/s: Bạn hỏi mấy vấn đề này thì nên cần đọc lại lý thuyết VBA căn bản, cũng như hàm cơ bản của excel...
Hiện tại em đang học :D Mới mua hai quấn sách của GPE nhà mình đang đọc và tìm hiểu thaks a chị nhiều :D}}}}}
 
Upvote 0
Hiện tại em đang học :D Mới mua hai quấn sách của GPE nhà mình đang đọc và tìm hiểu thaks a chị nhiều :D}}}}}

Muốn "đau khổ" với VBA thì xem Sub này, tôi viết chỉ cho 1 cột K (xuất TP - sheet KEHOACH).
Bạn tuỳ ý chỉnh sửa vị trí các điều kiện lọc... thành 2 cái Sub nữa cho Nhap_BB và Xuât_BB là sử dụng được cho file của bạn với dữ liệu lớn. (Nhìn vào có lẽ rất dễ chỉnh)
PHP:
Public Sub Xuat_TP()
Dim Dic As Object, sArr(), dArr(), Tem As String, I As Long, J As Long, Rws As Long, K As Long
Set Dic = CreateObject("Scripting.Dictionary")
With Sheets("KEHOACH")
    sArr = .Range(.[A4], .[A4].End(xlDown)).Resize(, 9).Value
End With
ReDim dArr(1 To UBound(sArr, 1), 1 To 1)
For I = 1 To UBound(sArr, 1)
    K = K + 1
    Tem = sArr(I, 2)
    For J = 5 To 9
        Tem = Tem & "#" & sArr(I, J)
        If Not Dic.Exists(Tem) Then
            Dic.Add Tem, K
        End If
    Next J
Next I
With Sheets("XUATTP")
    sArr = .Range(.[A4], .[K4].End(xlDown)).Value
End With
For I = 1 To UBound(sArr, 1)
    Tem = sArr(I, 7) & "#" & sArr(I, 4) & "#" & sArr(I, 5) & "#" & sArr(I, 8) & "#" & sArr(I, 6) & "#" & sArr(I, 10)
    If Dic.Exists(Tem) Then
        Rws = Dic.Item(Tem)
        dArr(Rws, 1) = dArr(Rws, 1) + sArr(I, 11)
    End If
Next I
Sheets("KEHOACH").Range("K4").Resize(K) = dArr
Set Dic = Nothing
End Sub
 
Upvote 0
Các bác cho em hỏi chú xíu về đoạn code sau :
Range("R" & Worksheets("Sheet1").Cells(1, 1)).Formula = "=IF((RC15=A),0,(RC16-RC17))"

Nếu như em muốn có thêm một giá trị để xét VD RC15 = A HOẶC RC15 = B để trả về đúng hoặc sai thì phải viết như thế nào ạ.
em cám ơn các bác nhiều
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom