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:
Đâ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:
Upvote 0
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:
Upvote 0
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?
 
Upvote 0
Lần chỉnh sửa cuối:
Upvote 0
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
Thanks 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.
 
Upvote 0
Để 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à đủ
 
Upvote 0
#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:
Upvote 0
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?
 
Upvote 0
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
 
Upvote 0
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/...-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?
 
Upvote 0
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

  • SoDiem.rar
    13.6 KB · Đọc: 89
Upvote 0
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ỉ..?
 
Upvote 0
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
 
Upvote 0
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:
Upvote 0
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
 
Upvote 0
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ì
 
Upvote 0
Đ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:
Upvote 0
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
 
Upvote 0
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?
 
Upvote 0
Web KT
Back
Top Bottom