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

Liên hệ QC
Status
Không mở trả lời sau này.

ST-Lu!

Love Wingchun
Tham gia
19/8/08
Bài viết
730
Được thích
546
Nghề nghiệp
Xích lô một thời
Kể từ hôm nay, tất cả những câu hỏi nhờ giải thích dùm một đoạn code, hay là hỏi những vấn đề linh tinh gì liên quan đến cách viết code, đề nghị các bạn gửi chung vào đây.

Những đề tài mới với tiêu đề: "Nhờ giải thích dùm đoạn code", mà không nói rõ là code gì, code dùng để làm gì, sẽ bị xóa.

BQT

----------------------------------------------------------------------------------------------------------------


Em xin được hỏi 2 đoạn code sau có tương đương nhau ?

Cells(Cells.Rows.Count, 1).End(xlUp).Row có tương đương với [A65000].End(xlup).row

Cám ơn các anh chỉ giáo
 
Chỉnh sửa lần cuối bởi điều hành viên:
Cảm ơn bạn, nhưng còn chỗ này mình chưa hiểu:


Gồm 02 phần là Evaluate () và row(R:R) như vậy:
- Evaluate nghĩa là gì? Chức năng của nó ntn?
- Bản thân hàm Row() thì mình biết, nhưng đối só của nó R:R có nghĩa là sao bạn?

Rất mong bạn giải thích rõ hơn giúp mình, do mới học nên hỏi hơi ngớ ngẩn.
Bạn thử đọc giải thích của anh Lê Văn Duyệt xem có giúp gì được bạn gì không
http://www.giaiphapexcel.com/forum/...g-thức-Evaluate-Understanding-Evaluate-Method
Thân
 
Upvote 0
Ndu ơi.
mình có đoạn code này (ngày trước dùng excel 2003) thì dùng được.
Nhưng bây giờ mình dùng excel 2007 thì nó báo lỗi
Sub FindMinValue()
Dim oRg As Range, iMin As Variant
Dim tmpStr1 As String
Dim tmpStr2 As String
Set oRg = Columns(10)
'Finding the minimum value
'change Application.Min(oRg) into Application.Max(oRg) to find the maximum value
iMin = Application.Min(oRg)
'Select cell containing the min value
oRg.Find(What:=iMin, _
After:=oRg.Range("A1"), _
LookIn:=xlValues, _
LookAt:=xlPart, _
SearchOrder:=xlByRows, _
SearchDirection:=xlNext, MatchCase:=True, _
MatchByte:=True _
).Select

'Displaying min value info
With Selection
tmpStr1 = "A" & .Row & ":J" & .Row
End With

Range(tmpStr1).Select
Selection.Copy
Range("L3").Select
ActiveSheet.Paste
End Sub
nó báo dòng mình in đậm đấy và đó là lỗi (run - time error 91.......Object Varilable or with block Varilable not set.
Bạn làm ơn giúp mình nhé.
Thanhks​
 
Upvote 0
Theo mình thì

Câu lệnh này sẽ báo là lỗi, nếu nó không tìm ra ô cần tìm
Mã:
[B]oRg.Find(What:=iMin, [/B][B]After:=oRg.Range("A1"), LookIn:=xlValues, LookAt:=xlPart, _
SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=True, _
MatchByte:=True ).Select [/B]

Vô ngay đầu chương trình, bạn thử khai báo thêm 1 biến đối tượng như
PHP:
 Dim sRng As Range
Sau đó dùng lệnh
PHP:
Set sRng = oRg.Find(What:=iMin, After:=oRg.Range("A1"), LookIn:=xlValues, LookAt:=xlPart, _
SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=True, MatchByte:=True )

 If Not sRng Is Nothing Then sRng.Select
 
Lần chỉnh sửa cuối:
Upvote 0
Xin lỗi bạn, bài này mình đã từng đọc, nhưng do khả năng hạn hẹp nên mình không hiểu lắm. Bạn có thể nói nôm na cho mình ý nghĩa của Evaluate là gì không?

Còn vụ đối số R:R nữa.

Hic hic.
 
Upvote 0
Xin lỗi bạn, bài này mình đã từng đọc, nhưng do khả năng hạn hẹp nên mình không hiểu lắm. Bạn có thể nói nôm na cho mình ý nghĩa của Evaluate là gì không?

Còn vụ đối số R:R nữa.

Hic hic.
Có thể hiểu nôm na Evaluate là 1 hàm dùng để chuyển 1 chuổi biểu thức sang giá trị
Ví dụ: Evaluate("1+2+3") sẽ cho kết quả = 6 hoặc Evaluate("SUM(A1:A10)") sẽ cho kết quả là tổng vùng A1:A10
Còn thằng R:R thì là vùng R:R thôi ---> Bạn có thể thay nó thành cái gì tùy ý, chẳng hạn là Evaluate("ROW(A:A)") cũng được vậy (tôi thì thích viết chữ R cho nó có vẻ là.. ROW, thế thôi)
 
Upvote 0
Hic, chắc tại mình dốt nên tới giờ vẫn chưa hiểu lắm.

Cụ thể như sau: Nếu Evaluate được hiểu theo cách hiểu trên thì tại sao người ta lại sử dụng nó? Như trong vD dưới đây:

Sao không dùng Range("A1").value= 1+2+3, mà lại dùng Range("A1").value = Evaluate("1+2+4")?
Tương tự, sao không dùng Range("A1").value= SUM(A1:A10) mà lại dùng Range("A1").value=evaluate("Sum(A1:A10)")?

Vậy phải chăng mục đích sử dụng của nó là để dùng các hàm mà VBA không sử dụng được? VD: countif hay sumif gì đó?

Còn vụ R:R là ký tự đại diện thôi hả bạn, hay là chữ R đó là lấy cột R? Nếu thay bằng A:A thì sẽ lấy cột A? thay bằng A:B sẽ lấy cột A và B hả bạn.

Mình không hiểu thiệt nên hỏi quài, rất xin lỗi các bạn nha.
 
Lần chỉnh sửa cuối:
Upvote 0
Câu lệnh này sẽ báo là lỗi, nếu nó không tìm ra ô cần tìm
Mã:
[B]oRg.Find(What:=iMin, [/B][B]After:=oRg.Range("A1"), LookIn:=xlValues, LookAt:=xlPart, _
SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=True, _
MatchByte:=True ).Select [/B]

Vô ngay đầu chương trình, bạn thử khai báo thêm 1 biến đối tượng như
PHP:
 Dim sRng As Range
Sau đó dùng lệnh
PHP:
Set sRng = oRg.Find(What:=iMin, After:=oRg.Range("A1"), LookIn:=xlValues, LookAt:=xlPart, _
SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=True, MatchByte:=True )

 If Not sRng Is Nothing Then sRng.Select


Mình đã sửa như Chanh nói nhưng nó vẫn chạy không đúng.
mỗi lần chạy ra các kết quả khác nhau
 
Upvote 0
Hic, chắc tại mình dốt nên tới giờ vẫn chưa hiểu lắm. Cụ thể như sau: Nếu Evaluate được hiểu theo cách hiểu trên thì tại sao người ta lại sử dụng nó? Như trong vD dưới đây: Sao không dùng Range("A1").value= 1+2+3, mà lại dùng Range("A1").value = Evaluate("1+2+4")? Tương tự, sao không dùng Range("A1").value= SUM(A1:A10) mà lại dùng Range("A1").value=evaluate("Sum(A1:A10)")? Vậy phải chăng mục đích sử dụng của nó là để dùng các hàm mà VBA không sử dụng được? VD: countif hay sumif gì đó? Còn vụ R:R là ký tự đại diện thôi hả bạn, hay là chữ R đó là lấy cột R? Nếu thay bằng A:A thì sẽ lấy cột A? thay bằng A:B sẽ lấy cột A và B hả bạn. Mình không hiểu thiệt nên hỏi quài, rất xin lỗi các bạn nha. Ps: diễn đàn bị sao mà enter xuống rồi, mà khi post vẫn nhảy lên thành 01 đoạn vậy nè trời.
Ví dụ chỉ là ví dụ thôi. Còn ứng dụng như thế nào là tùy vào khả năng của mỗi người. Trong file là một ví dụ đơn giản phải dùng Evaluate.
To tuangiang25022008:
Bạn chỉ cần dùng một câu lệnh này thôi:
PHP:
Range("A" & WorksheetFunction.Match(WorksheetFunction.Min([J:J]), [J:J], 0)).Resize(, 10).Copy [L3]
 

File đính kèm

  • VD ve Evaluate.xls
    46.5 KB · Đọc: 9
Lần chỉnh sửa cuối:
Upvote 0
Mình đã sửa như Chanh nói nhưng nó vẫn chạy không đúng.
mỗi lần chạy ra các kết quả khác nhau

Vậy bạn hãy cho biết thêm vài thông tin như sau:

(1) Vùng để fương thức tim là vùng như thế nào? Nhiều hàng của 1 cột, hay nhiều cột của 1 hàng hoặc cả hai?

(2) Trong vùng đó trước khi tìm ta có làm gì để nó biến đổi số liệu không? Ở đây bạn dùng tham số xlPart nên mình mới hỏi vậy

(3) Cũng là chuyện đề fòng nên cũng fải hỏi: Vùng để tìm kiếm có những ô trộn lại không?

(3.1) Số liệu mà bạn tìm có dạng ngày tháng fải không? hay chỉ là số trị hoặc chuỗi?

Chờ tin từ bạn!
 
Upvote 0
Hic, chắc tại mình dốt nên tới giờ vẫn chưa hiểu lắm.

Cụ thể như sau: Nếu Evaluate được hiểu theo cách hiểu trên thì tại sao người ta lại sử dụng nó? Như trong vD dưới đây:

Sao không dùng Range("A1").value= 1+2+3, mà lại dùng Range("A1").value = Evaluate("1+2+4")?
Tương tự, sao không dùng Range("A1").value= SUM(A1:A10) mà lại dùng Range("A1").value=evaluate("Sum(A1:A10)")?

Vậy phải chăng mục đích sử dụng của nó là để dùng các hàm mà VBA không sử dụng được? VD: countif hay sumif gì đó?

Còn vụ R:R là ký tự đại diện thôi hả bạn, hay là chữ R đó là lấy cột R? Nếu thay bằng A:A thì sẽ lấy cột A? thay bằng A:B sẽ lấy cột A và B hả bạn.

Mình không hiểu thiệt nên hỏi quài, rất xin lỗi các bạn nha.
Chỉ là 1 ví dụ nhỏ cho bạn hình dung về Evaluate mà thôi. Đương nhiên, tùy tình huống mà quyết định dùng cái gì
Lấy ví dụ với công thức là dạng công thức mảng thì làm sao bạn gán theo cách thông thường? Chẳng hạn như trường hợp gán STT ở ví dụ trên (=ROW(R:R) chính là công thức mảng)
Hoặc giả sử có trường hợp ứng dụng trong việc diễn giải công thức: Cột A người ta ghi diễn giải (ví dụ như (3*5+10)/8 +9) còn cột B người ta muốn tính kết quả của chuổi biểu thức đã ghi tại cột A ---> Trường hợp này có phải dùng Evaluate là hợp lý không?
 
Upvote 0
Rất chân thành cảm ơn 02 bạn: Huuthang_bd và bạn ndu9681631 nhờ 02 bạn mà người mới bắt đầu học VBA như mình mới hiểu được một số vấn đề liên quan đến evaluate.

Nhân đây mình hỏi luôn, sao code này của mình lại trả về một cái giá trị là Empty và một cái giá trị là 0 vậy ta? Vậy cuối cùng lúc chưa gán, giá trị của nó là gì?

HTML:
Dim BeginR, EndR As Integer
Sub Giai()
   MsgBox BeginR
   MsgBox EndR
End Sub

Thêm nữa là sự khác nhau giữa các giá trị sau trong VBA như thế nào?
- Empty (cái này chắc giống "")
- Null
- Is nothing
Và nếu mình muốn một ô có giá trị là không là gì cả (đại loại giống một ô chưa nhập dữ liệu gì hết kể cả khoản trắng) thì sẽ gán cho nó giá trị nào trong 03 giá trị trên?
 
Lần chỉnh sửa cuối:
Upvote 0
Vậy bạn hãy cho biết thêm vài thông tin như sau:

(1) Vùng để fương thức tim là vùng như thế nào? Nhiều hàng của 1 cột, hay nhiều cột của 1 hàng hoặc cả hai?

(2) Trong vùng đó trước khi tìm ta có làm gì để nó biến đổi số liệu không? Ở đây bạn dùng tham số xlPart nên mình mới hỏi vậy

(3) Cũng là chuyện đề fòng nên cũng fải hỏi: Vùng để tìm kiếm có những ô trộn lại không?

(3.1) Số liệu mà bạn tìm có dạng ngày tháng fải không? hay chỉ là số trị hoặc chuỗi?

Chờ tin từ bạn!

1. Vùng tìm kiếm ở đây là tìm giá trị nhỏ nhất của cột thứ 10. (dòng đầu tiên của cột 10 là chữ, những dòng còn lại của cột 10 là số)
Khi tìm được giá trị nhỏ nhất thì tìm tham chiếu các cột khác (giả sử cột 10 có giá trị nhỏ nhất ở dòng 100, thi sẽ lấy các giá trị (hay chữ ở dòng 100 của các cột A,B,C, ....,J)tức là tham chiếu dòng 100 của cột A đến cột J và copy sang cột S.
2. Các số liệu của mình không phải là ngày tháng.
Mong tin bạn
 
Upvote 0
Những gì bạn mô tả có thể giống như macro này:

PHP:
Option Explicit
Sub TimMinInColumn()
 Dim Rng As Range, sRng As Range
 Dim Min_ As Double
 
 Set Rng = Columns("J:J")
 Min_ = Application.WorksheetFunction.Min(Rng)
 Set sRng = Rng.Find(Min_, , xlFormulas, xlWhole)     '<=|'
 If Not sRng Is Nothing Then
   MsgBox sRng.Address, , "GPE Xin Chào Ban!"
   Cells(sRng.Row, "A").Resize(, 10).Copy Destination:=Cells(sRng.Row, "S")
 End If
End Sub

Bạn thử xem sao!
 
Upvote 0
PHP:
Option Explicit
Sub TimMinInColumn()
 Dim Rng As Range, sRng As Range
 Dim Min_ As Double
 
 Set Rng = Columns("J:J")
 Min_ = Application.WorksheetFunction.Min(Rng)
 Set sRng = Rng.Find(Min_, , xlFormulas, xlWhole)     '<=|'
 If Not sRng Is Nothing Then
   MsgBox sRng.Address, , "GPE Xin Chào Ban!"
   Cells(sRng.Row, "A").Resize(, 10).Copy Destination:=Cells(sRng.Row, "S")
 End If
End Sub

Bạn thử xem sao!

giá trị cần tìm thì đúng nhưng nó không copy giá trị mình cần tìm sang cột S3 (tìm được giá trị min tại dòng 100 thì sẽ copy cột A100, B100, ...J100 vào cột S3,T3,.....,AB3
Bạn ơi cho mình hỏi.
bây giờ mình có 50 sheet
trong đó có 4 sheet Có tên là AS, DB, GH, JL là mình không muốn tìm giá trị min (nhỏ nhất)
còn lại các sheet khác thì tìm theo như trên thì mình làm như thế nào.
mong câu trả lời của bạn
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn thử với cái ni xem sao!

PHP:
Option Explicit
Sub TimMinInColumn10OffWorkSheets()
 Dim Rng As Range, sRng As Range, Sh As Worksheet
 Dim Min_ As Double
 Const ShName As String = "AS@DB@GH@JL@"
 
 For Each Sh In ThisWorkbook.Worksheets
   If InStr(ShName, Sh.Name) Then
   Else
      Set Rng = Columns("J:J")
      Min_ = Application.WorksheetFunction.Min(Rng)
      Set sRng = Rng.Find(Min_, , xlFormulas, xlWhole)     '<=|'
      If Not sRng Is Nothing Then
         MsgBox Sh.Name, , "GPE Xin Chào Ban!"
         Cells(sRng.Row, "A").Resize(, 10).Copy Destination:=Cells(sRng.Row, "S")
      End If
   End If
 Next Sh
End Sub
 
Upvote 0
PHP:
Option Explicit
Sub TimMinInColumn10OffWorkSheets()
 Dim Rng As Range, sRng As Range, Sh As Worksheet
 Dim Min_ As Double
 Const ShName As String = "AS@DB@GH@JL@"
 
 For Each Sh In ThisWorkbook.Worksheets
   If InStr(ShName, Sh.Name) Then
   Else
      Set Rng = Columns("J:J")
      Min_ = Application.WorksheetFunction.Min(Rng)
      Set sRng = Rng.Find(Min_, , xlFormulas, xlWhole)     '<=|'
      If Not sRng Is Nothing Then
         MsgBox Sh.Name, , "GPE Xin Chào Ban!"
         Cells(sRng.Row, "A").Resize(, 10).Copy Destination:=Cells(sRng.Row, "S")
      End If
   End If
 Next Sh
End Sub
Bạn ơi.
giá trị cần tìm thì đúng nhưng nó không copy giá trị mình cần tìm sang cột S3 (tìm được giá trị min tại dòng 100 thì sẽ copy cột A100, B100, ...J100 vào cột S3,T3,.....,AB3
 
Upvote 0
Hiện nó copy 10 ô liền kề kể từ ô đầu tiên trong hàng tìm thấy chép đến 10 bắt đầu từ cột 'S' cùng hàng;

Bạn thử tự đưa về chổ nào đó theo í bạn xem sao!

Còn đây là Copy đến hàng thứ 3 cũng bắt đầu từ cột 'S'

Mã:
[COLOR=#000000][COLOR=#DD0000] [/COLOR][COLOR=#0000BB]Cells[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]sRng[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]Row[/COLOR][COLOR=#007700], [/COLOR][COLOR=#DD0000]"A"[/COLOR][COLOR=#007700]).[/COLOR][COLOR=#0000BB]Resize[/COLOR][COLOR=#007700](, [/COLOR][COLOR=#0000BB]10[/COLOR][COLOR=#007700]).[/COLOR][COLOR=#0000BB]Copy Destination[/COLOR][COLOR=#007700]:=[/COLOR][COLOR=#0000BB]Cells[/COLOR][COLOR=#007700]([/COLOR][B][COLOR=#0000BB]3[/COLOR][/B][COLOR=#0000BB][/COLOR][COLOR=#007700], [/COLOR][COLOR=#DD0000]"S"[/COLOR][COLOR=#007700])
[/COLOR][/COLOR]
 
Upvote 0
nhờ các bạn check dùm tại sao không hiện lên giá trị max

Nhờ Ndu mà mình đã add được các file excel vào trong các sheet của một file.
Nhưng không hiểu sao khi mình tìm giá trị max thì lại không làm được (chính xác là không lên kết quả).
Mong các bạn check hộ.
Mong sớm hồi âm
 

File đính kèm

  • file.rar
    137.4 KB · Đọc: 30
Upvote 0
1 file là đủ rồi!

Bạn đưa lên quá nhiều file làm chi vậy, chỉ tổ loãng vấn đề & dễ gây fiền chán!
 
Upvote 0
Không phải đâu bạn àh.
file tổng verson 1 là tổng kết của 3 file kia. (viết bằng vba)
bạn vào file này thì sẽ biết bạ àh.
mong sớm hồi âm của bạn
 
Lần chỉnh sửa cuối:
Upvote 0
Status
Không mở trả lời sau này.
Web KT

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

Back
Top Bottom