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

maytinhvp01

Thành viên thường trực
Tham gia ngày
27 Tháng bảy 2013
Bài viết
389
Được thích
178
Điểm
395
Nơi ở
VĩnhYên_VP
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/showthread.php?15218-Những-câu-hỏi-về-code-xin-giả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:

Hoàng Trọng Nghĩa

Chuyên gia GPE
Thành viên BQT
Moderator
Tham gia ngày
17 Tháng tám 2008
Bài viết
7,620
Được thích
15,205
Điểm
1,910
Tuổi
43
Nơi ở
TPHCM
Đây làm một hàm để so sánh số lớn nhất trong một vùng dữ liệu (Range) nào đó.

Nó căn cứ từ ô đầu tiên của vùng [ Ran.Cells(1, 1) ] làm chuẩn để so sánh với các ô trong vùng đó.

Với câu lệnh này:

If Ran.Cells(d, c) > max Then max = Ran.Cells(d, c)

Với d đại diện cho hàng và c đại diện cho cột, khi vòng lặp chạy lần lượt đến mỗi ô trong Vùng tham chiếu, nếu gặp ô có giá trị lớn hơn giá trị ban đầu max = Ran.Cells(1, 1) thì max sẽ nhận giá trị tại ô đó rồi tiếp tục so sánh sang ô khác, còn không thì nó vẫn giữ giá trị lớn nhất.

=============================
Cái mà tôi không hiểu gì trong hàm đó là cái này:

v = Tim(max, Ran)

Chả biết nó dùng để làm gì nữa!
 
Lần chỉnh sửa cuối:

hungpecc1

Thành viên gắn bó
Tham gia ngày
24 Tháng tám 2012
Bài viết
1,617
Được thích
2,209
Điểm
560
Tuổi
33
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
Anh Hoàng Trọng Nghĩa đã giải thích cho bạn về Rows.count,Columns.count và câu lệnh if.... then ở trên rồi, ở đây mình muốn hỏi thêm :
Cái V=Tim(max,Ran) để làm gì vậy bạn, vì sau khi function Lonnhat kết thúc,biến V sẽ được giải phóng ra khỏi bộ nhớ !
Còn nếu tìm giá trị max trong 1 vùng mình sửa lại code cho bạn dễ hiểu như sau :
PHP:
Public Function Lonnhat(Ran As Range) As Double    
Dim mycell As Range       
 For Each mycell In Ran           
     If Val(mycell) > Lonnhat Then Lonnhat = mycell       
 Next
End Function
 
Lần chỉnh sửa cuối:

Hoàng Trọng Nghĩa

Chuyên gia GPE
Thành viên BQT
Moderator
Tham gia ngày
17 Tháng tám 2008
Bài viết
7,620
Được thích
15,205
Điểm
1,910
Tuổi
43
Nơi ở
TPHCM
Cái V=Tim(max,Ran) để làm gì vậy bạn, vì sau khi function Lonnhat kết thúc,biến V sẽ được giải phóng ra khỏi bộ nhớ !
Còn nếu tìm giá trị max trong 1 vùng mình sửa lại code cho bạn dễ hiểu như sau :
PHP:
Public Function Lonnhat(Ran As Range) As Double    
Dim mycell As Range       
 For Each mycell In Ran           
     If Val(mycell) > Lonnhat Then Lonnhat = mycell       
 Next
End Function

Giả sử vùng có 3 ô: A1:A3

A1 là trống, A2 là -1 và A3 là -2 vậy theo bạn, ô nào là Max?

Thử làm với hàm bạn, ra giá trị là bao nhiêu?
 

hungpecc1

Thành viên gắn bó
Tham gia ngày
24 Tháng tám 2012
Bài viết
1,617
Được thích
2,209
Điểm
560
Tuổi
33
Lần chỉnh sửa cuối:

Hoàng Trọng Nghĩa

Chuyên gia GPE
Thành viên BQT
Moderator
Tham gia ngày
17 Tháng tám 2008
Bài viết
7,620
Được thích
15,205
Điểm
1,910
Tuổi
43
Nơi ở
TPHCM
Lại bị anh Nghĩa "cốc" vào đâu rồi -+*/, ^^ quên mất là phải thêm điều kiện và chỉnh sửa tẹo nữa --=0
Cảm ơn anh !
Để học thuật hay làm một việc gì đó ngoài Excel thì mình làm hàm tự tạo MAX, còn không thì cứ dùng MAX trong sheet và WorksheetFunction.Max trong VBA là tốt nhất, tôi nghĩ là vậy.
 

ndu96081631

Huyền thoại GPE
Thành viên BQT
Super Moderator
Tham gia ngày
5 Tháng sáu 2008
Bài viết
30,166
Được thích
52,404
Điểm
11,910
Để học thuật hay làm một việc gì đó ngoài Excel thì mình làm hàm tự tạo MAX, còn không thì cứ dùng MAX trong sheet và WorksheetFunction.Max trong VBA là tốt nhất, tôi nghĩ là vậy.
Chính xác là thế. Ta làm trên Excel thì có thể tận dụng những thứ có sẵn của Excel
Trừ trường hợp ta viết code nhưng dự tính sẽ dùng cho các ứng dụng bên ngoài (VB chẳng hạn) và ta buộc phải viết hàm phục vụ cho riêng ta.
Đương nhiên ta cũng không thể cố viết làm sao để bì được với MAX của anh Bill (đó là công sức của 1 siêu tập thể mà) ---> Yêu cầu nó phục vụ đúng ý đồ của ta là đủ
 

maytinhvp01

Thành viên thường trực
Tham gia ngày
27 Tháng bảy 2013
Bài viết
389
Được thích
178
Điểm
395
Nơi ở
VĩnhYên_VP
#2 ,#3
v = Tim(max, Ran)
Là mình gọi thủ tục cho biết vị trí của số lớn nhất trong bảng đã tìm thấy trong bảng bạn a. Nhưng thủ tục đó mình ko đưa vào đây.
 
Lần chỉnh sửa cuối:

maytinhvp01

Thành viên thường trực
Tham gia ngày
27 Tháng bảy 2013
Bài viết
389
Được thích
178
Điểm
395
Nơi ở
VĩnhYên_VP
Giả sử vùng có 3 ô: A1:A3

A1 là trống, A2 là -1 và A3 là -2 vậy theo bạn, ô nào là Max?

Thử làm với hàm bạn, ra giá trị là bao nhiêu?
cho mình hởi thêm với: Giá trị của "lonnhat" khi bắt đầu chạy vòng lặp for each đầu tiên có giá trị la bao nhiêu vậy ban?
Có phải ban đầu nó bằng 0 không vây?
 

hungpecc1

Thành viên gắn bó
Tham gia ngày
24 Tháng tám 2012
Bài viết
1,617
Được thích
2,209
Điểm
560
Tuổi
33
cho mình hởi thêm với: Giá trị của "lonnhat" khi bắt đầu chạy vòng lặp for each đầu tiên có giá trị la bao nhiêu vậy ban?
Có phải ban đầu nó bằng 0 không vây?
Chính xác ban đầu giá trị = 0 , mà vụ này bạn dùng worksheetFunction.Max(ran) là được mà !

p/s : bạn mới vào diễn đàn, + mới học vba , mình có chút kinh nghiệm học tập chia sẻ như sau :
*các cụ có câu "học thầy không tày học bạn " <--- bạn cố gắng giao lưu , nhiệt tình , sôi nổi trên GPE,
* Anh ndu và anh Nghĩa là các thành viên có tên tuổi và số má trên diễn đàn, những bài viết nhận xét ,góp ý của các anh ý đều có giá trị nhất định đấy bạn ah
 

namkpac

Thành viên thường trực
Tham gia ngày
25 Tháng mười một 2008
Bài viết
272
Được thích
9
Điểm
685
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:

Private Declare Function GetMeID Lib "excelqt.dll" (ByVal RT As String) As Integer
Declare Function GetActiveWindow Lib "user32" () As Long

Function ThongtinKTXD(ByVal ODIA As String, SOHDDSR As Integer) As String
Dim Serial As String
Dim ret As Integer
Serial = Space$(256)
ret = GetMeID(Serial)
If SOHDDSR = 13971 Then
ThongtinKTXD = Serial
ThongtinKTXD = Trim(ThongtinKTXD)
Else
ThongtinKTXD = ""
End If
End Function

Function NumberWindow() As Long
Dim NumberWND As Long
NumberWindow = GetActiveWindow()
End Function
http://www.giaiphapexcel.com/forum/showthread.php?15218-Những-câu-hỏi-về-code-xin-giải-thích-các-code-đề-nghị-các-bạn-gửi-vào-đây/page154
em gửi bài bên đây nhưng được biết đề tài dài quá nên anh ndu96081631 chuyển sang đây. Hôm trước anh ndu96081631 có nói về file EXCELQT.DLL nên em gửi file lên nhờ các anh, chị chỉ giúp. hoặc giúp em có thể làm 1 file giống vậy ko?
 

trananhtommy

Thành viên hoạt động
Tham gia ngày
11 Tháng mười hai 2006
Bài viết
110
Được thích
6
Điểm
670
Nhờ các Bác chỉ lỗi E sai chỗ nào với.

Em có đoạn code này, trong file đính kèm. Không hiểu sao lỗi, nhờ các Bác chỉ giúp với.

Mã:
Sub ghiDL()'
' ghiDL Macro
'


    Dim MyArr As Variant
    With Sheets("Nhap")
        MyArr = Array(.[C4], .[C5], .[c6], .[c7], .[c8], "=(RC[-3]+RC[-2]+RC[-1])/3", "=IF(RC[-1]>8;"Gi?i";IF(AND(RC[-1]<=8;RC[-1]>5);"TB";"Kém"))")
    End With
    Sheets("DL").Range("A65536").End(xlUp).Offset(1).Resize(, 7).Value = MyArr
End Sub
File của E đây ạ.
 

File đính kèm

trananhtommy

Thành viên hoạt động
Tham gia ngày
11 Tháng mười hai 2006
Bài viết
110
Được thích
6
Điểm
670
Hình như khi gán công thức IF vào thì bị lỗi hay sao ấy ạ. Không biết chuyển công thức IF ở excel sang VBA thì thay thế bằng hàm gì nhỉ..?
 

hungpecc1

Thành viên gắn bó
Tham gia ngày
24 Tháng tám 2012
Bài viết
1,617
Được thích
2,209
Điểm
560
Tuổi
33
Hình như khi gán công thức IF vào thì bị lỗi hay sao ấy ạ. Không biết chuyển công thức IF ở excel sang VBA thì thay thế bằng hàm gì nhỉ..?
* Bạn thử record macro Hàm if() ---> sẽ suy ra cách viết trong vba ( cụ thể ở đây bạn thiếu dấu "")
* Sau khi sửa được câu lệnh if, bạn sẽ gặp lỗi khi gán giá trị xuống sheet bằng câu lệnh :....=MyArr , vì trong mảng của bạn chứa 2 kiểu : 1 kiểu là range.value và 1 kiểu là range.formulaR1C1 sao mà được
 

coconga

Thành viên chính thức
Tham gia ngày
9 Tháng bảy 2013
Bài viết
56
Được thích
4
Điểm
0
Tuổi
20
Nhờ sửa đoạn code Sub Copy() sau vì nó không copy ra 6 bảng

Sub Copy()
On Error Resume Next
Dim List, Mg1, Mg2, Mg3, Mg4, i, j, r, c, t, n

Application.ThisWorkbook.Active
Sheets("Sheet1").Select
Cells.Find("Data*", ActiveCell, xlValues, xlWhole).Offset(2).Select
Rlist = ActiveCell.Row
CList = ActiveCell.Column
EndColn = Range("CA" & Rlist).End(xlToLeft).Column
'List = Cells(Rlist, CList).Resize(100, 50)
List = Cells(Rlist, CList).CurrentRegion
ReDim Mg1(1 To UBound(List), 1 To EndColn)
ReDim Mg2(1 To UBound(List), 1 To EndColn)
ReDim Mg3(1 To UBound(List), 1 To EndColn)
ReDim Mg4(1 To UBound(List), 1 To EndColn)
For i = 1 To UBound(List)
For j = 1 To EndColn
t = i Mod 12
n = j Mod 6
If t = 1 And n = 1 Or t = 1 And n = 2 _
Or t = 2 And n = 1 _
Or t = 4 And n = 3 Or t = 4 And n = 0 _
Or t = 5 And n = 3 Then
r = i
c = j
Mg1(r, c) = List(i, j)
End If
If t = 1 And n = 3 Or t = 1 And n = 0 _
Or t = 2 And n = 3 _
Or t = 4 And n = 1 Or t = 4 And n = 2 _
Or t = 5 And n = 1 Then
r = i
c = j
Mg2(r, c) = List(i, j)
End If
If t = 2 And n = 2 _
Or t = 3 And n = 1 Or t = 3 And n = 2 _
Or t = 5 And n = 0 _
Or t = 0 And n = 3 Or t = 0 And n = 0 _
Then
r = i
c = j
Mg3(r, c) = List(i, j)
End If
If t = 2 And n = 0 _
Or t = 3 And n = 3 Or t = 3 And n = 0 _
Or t = 5 And n = 2 _
Or t = 0 And n = 1 Or t = 0 And n = 2 Then
r = i
c = j
Mg4(r, c) = List(i, j)
End If
Next j
Next i
ThisWorkbook.Sheets("Sheet2").Select
Range("A1").Select
With Selection
.Resize(2000, 60).ClearContents
.Resize(2000, 60).ClearFormats
End With
Range("A65000").End(xlUp).Offset(1).Value = "Data 1"
Range("A65000").End(xlUp).Offset(1).Resize(i, j) = Mg1
Range("A65000").End(xlUp).Offset(1).Value = "Data 2"
Range("A65000").End(xlUp).Offset(1).Resize(i, j) = Mg2
Range("A65000").End(xlUp).Offset(1).Value = "Data 3"
Range("A65000").End(xlUp).Offset(1).Resize(i, j) = Mg3
Range("A65000").End(xlUp).Offset(1).Value = "Data 4"
Range("A65000").End(xlUp).Offset(1).Resize(i, j) = Mg4
End Sub

Tôi có kèm file rất mong các thầy giúp đỡ
 
Lần chỉnh sửa cuối:

vodoi2x

Nothing & Nothing
Tham gia ngày
16 Tháng năm 2011
Bài viết
1,592
Được thích
1,655
Điểm
560
Nhờ sửa đoạn code Sub Copy() sau vì nó không copy ra 6 bảng
Tôi có kèm file rất mong các thầy giúp đỡ
Mục tiêu của bạn làm gì,
Tôi nghi ngờ các vấn đề bạn nhờ là nhằm mục đích lạ, và liên quan đến số???

Nếu bạn không nói rõ ứng dụng thực tế thì đây là những vấn đề vô bổ , có lẽ mọi người cần cân nhắc khi giúp
 

cao mạnh sơn

Tôi đồng ý
Tham gia ngày
26 Tháng mười một 2007
Bài viết
558
Được thích
563
Điểm
860
Tuổi
47
Sub Copy()
On Error Resume Next
Dim List, Mg1, Mg2, Mg3, Mg4, i, j, r, c, t, n

Application.ThisWorkbook.Active
Sheets("Sheet1").Select
Cells.Find("Data*", ActiveCell, xlValues, xlWhole).Offset(2).Select
Rlist = ActiveCell.Row
CList = ActiveCell.Column
EndColn = Range("CA" & Rlist).End(xlToLeft).Column
'List = Cells(Rlist, CList).Resize(100, 50)
List = Cells(Rlist, CList).CurrentRegion
ReDim Mg1(1 To UBound(List), 1 To EndColn)
ReDim Mg2(1 To UBound(List), 1 To EndColn)
ReDim Mg3(1 To UBound(List), 1 To EndColn)
ReDim Mg4(1 To UBound(List), 1 To EndColn)
For i = 1 To UBound(List)
For j = 1 To EndColn
t = i Mod 12
n = j Mod 6
If t = 1 And n = 1 Or t = 1 And n = 2 _
Or t = 2 And n = 1 _
Or t = 4 And n = 3 Or t = 4 And n = 0 _
Or t = 5 And n = 3 Then
r = i
c = j
Mg1(r, c) = List(i, j)
End If
If t = 1 And n = 3 Or t = 1 And n = 0 _
Or t = 2 And n = 3 _
Or t = 4 And n = 1 Or t = 4 And n = 2 _
Or t = 5 And n = 1 Then
r = i
c = j
Mg2(r, c) = List(i, j)
End If
If t = 2 And n = 2 _
Or t = 3 And n = 1 Or t = 3 And n = 2 _
Or t = 5 And n = 0 _
Or t = 0 And n = 3 Or t = 0 And n = 0 _
Then
r = i
c = j
Mg3(r, c) = List(i, j)
End If
If t = 2 And n = 0 _
Or t = 3 And n = 3 Or t = 3 And n = 0 _
Or t = 5 And n = 2 _
Or t = 0 And n = 1 Or t = 0 And n = 2 Then
r = i
c = j
Mg4(r, c) = List(i, j)
End If
Next j
Next i
ThisWorkbook.Sheets("Sheet2").Select
Range("A1").Select
With Selection
.Resize(2000, 60).ClearContents
.Resize(2000, 60).ClearFormats
End With
Range("A65000").End(xlUp).Offset(1).Value = "Data 1"
Range("A65000").End(xlUp).Offset(1).Resize(i, j) = Mg1
Range("A65000").End(xlUp).Offset(1).Value = "Data 2"
Range("A65000").End(xlUp).Offset(1).Resize(i, j) = Mg2
Range("A65000").End(xlUp).Offset(1).Value = "Data 3"
Range("A65000").End(xlUp).Offset(1).Resize(i, j) = Mg3
Range("A65000").End(xlUp).Offset(1).Value = "Data 4"
Range("A65000").End(xlUp).Offset(1).Resize(i, j) = Mg4
End Sub

Tôi có kèm file rất mong các thầy giúp đỡ
Đoạn code trên là do tôi viết trong tình trạng đoán già đoán non mong muốn của bạn ở 1 Topic khác, yêu cầu thêm sau của bạn cũng đã được tôi giải quyết ngay tại Topic đó và còn nhiều người khác cũng đã trả lời bạn. Khó hiểu bạn muốn gì
 

coconga

Thành viên chính thức
Tham gia ngày
9 Tháng bảy 2013
Bài viết
56
Được thích
4
Điểm
0
Tuổi
20
Đoạn code trên là do tôi viết trong tình trạng đoán già đoán non mong muốn của bạn ở 1 Topic khác, yêu cầu thêm sau của bạn cũng đã được tôi giải quyết ngay tại Topic đó và còn nhiều người khác cũng đã trả lời bạn. Khó hiểu bạn muốn gì
Không phải đâu bạn ah, vì tôi gửi topic nọ bị teo nick không có người tham gia nên cực chẳng đã rồi gửi thêm bài thôi. Mong anh chị thông cảm, tuyệt nhiên không có ý gì
.......Cũng vì phải ham Excel nên thông cảm thông cảm cho em
 
Lần chỉnh sửa cuối:

coconga

Thành viên chính thức
Tham gia ngày
9 Tháng bảy 2013
Bài viết
56
Được thích
4
Điểm
0
Tuổi
20
Mục tiêu của bạn làm gì,
Tôi nghi ngờ các vấn đề bạn nhờ là nhằm mục đích lạ, và liên quan đến số???

Nếu bạn không nói rõ ứng dụng thực tế thì đây là những vấn đề vô bổ , có lẽ mọi người cần cân nhắc khi giúp
Vodoi2x hôm nay sao vầy, từ khi vào diễn đàn thấy bài của Bác nên tôi cũng mê tài của Bác, Bác thấy tôi chưa có 01 bài nào gây cho ai khó chịu cả nghe Bác. Chúc bác vui vẻ, vụ gì cũng khỏe hi..hii. đừng nghỉ xấu em
 

vodoi2x

Nothing & Nothing
Tham gia ngày
16 Tháng năm 2011
Bài viết
1,592
Được thích
1,655
Điểm
560
Vodoi2x hôm nay sao vầy, từ khi vào diễn đàn thấy bài của Bác nên tôi cũng mê tài của Bác, Bác thấy tôi chưa có 01 bài nào gây cho ai khó chịu cả nghe Bác. Chúc bác vui vẻ, vụ gì cũng khỏe hi..hii. đừng nghỉ xấu em
Không sao cả, bạn nhầm rùi,

Tôi cố tình nói thế để bạn nhận ra: phải nêu rõ chi tiết vấn đề mình, thực tế áp dụng - tại sao chọn thế - như bài này bạn cứ tô màu loạn lên --> rui để mọi người làm , và copy - gây khó hiểu và mục đích không rõ ràng

Vậy thui, bạn nghĩ có thấy thế không?
 
Top Bottom