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:
Em đã thử viết như trên nhưng nó vẫn báo lỗi :(
range("J10").Value = Application.WorksheetFunction.Sum(Sheets("Reference").range(Sheets("Reference").Cells(4 * X - 3, 16), Sheets("Reference").Cells(4 * X, 16)))
Vẫn là Run time error 1004
Bạn ạ, tôi chỉ viết về vấn đề mà huuthang_bd đoán thôi. Còn chuyện của bạn thì chịu. Bạn tung code lên không có một lời mô tả code đó làm gì. Và tung ảnh của một đoạn code. Tôi không chơi ảnh bạn ạ.
 
Upvote 0
Bạn ạ, tôi chỉ viết về vấn đề mà huuthang_bd đoán thôi. Còn chuyện của bạn thì chịu. Bạn tung code lên không có một lời mô tả code đó làm gì. Và tung ảnh của một đoạn code. Tôi không chơi ảnh bạn ạ.

Bạn đọc lại giúp mình phía trên nhé. Mình có ghi rõ là code để tính Sum từ Cells(4 * X - 3,16) cho đến Cells(4 * X,16) của sheet "Reference" - For X = 1 to 5; kết quả sẽ được thể hiện tại activeCell của sheet hiện tại. Code mình viết ra có thể ko đúng và mình hiện tại chưa biết cách sửa.

Ảnh mình post lên để coi như tính minh họa chứ ko có ý làm bất kỳ ai khó chịu.

Nếu như có thể nhận đc feedback hợp lý thì mình rất cảm ơn.
 
Upvote 0
Bạn đọc lại giúp mình phía trên nhé. Mình có ghi rõ là code để tính Sum từ Cells(4 * X - 3,16) cho đến Cells(4 * X,16) của sheet "Reference" - For X = 1 to 5; kết quả sẽ được thể hiện tại activeCell của sheet hiện tại. Code mình viết ra có thể ko đúng và mình hiện tại chưa biết cách sửa.

Ảnh mình post lên để coi như tính minh họa chứ ko có ý làm bất kỳ ai khó chịu.
Vấn đề không ở chỗ khó chịu. Nếu có code thì bao giờ cũng dò ra được chỗ sai, ít nhất là trong 99% trường hợp. Nhưng nhìn ảnh thì nhiều khi bó tay. Có những cái không "nhìn" được từ ảnh.
 
Upvote 0
Vấn đề không ở chỗ khó chịu. Nếu có code thì bao giờ cũng dò ra được chỗ sai, ít nhất là trong 99% trường hợp. Nhưng nhìn ảnh thì nhiều khi bó tay. Có những cái không "nhìn" được từ ảnh.
Cảm ơn batman1 huuthang_bd

Mình đã khắc phục được lỗi trên rồi. Hiện tại còn đoạn code này, mong bạn chỉ giáo:
Mã:
For X = 1 to 5
For Y = 1 to 5

ActiveCell.Value = Application.WorksheetFunction.Sum(Sheets("Reference").range(Sheets("Reference").Cells(5 * X + 10, 12).Offset(Y, 0).Resize(-Y + 6, 1)))
ActiveCell.Offset(1,0).Select

Next
Next

Mục đích của code này là như sau:
Nếu X = 1, Y = 1:
Giá trị của ActiveCell = Sum từ ô L16 đến L20
X = 1, Y = 2:
Giá trị của ActiveCell = Sum từ ô L17 đến L20
...
X = 1, Y = 5:
Giá trị của ActiveCell = giá trị của ô L20

Nếu X = 2, Y = 1:
Giá trị của ActiveCell = Sum từ ô L21 đến L25
Nếu X = 2, Y = 2:
Giá trị của ActiveCell = Sum từ ô L22 đến L25
...
Vòng lặp sẽ chạy theo logic trên đến khi X = 5 và Y =5:
Giá trị của activeCell = giá trị của ô L40

Các giá trị của ô L# nằm ở sheet "Reference". ActiveCell nằm ở sheet hiện tại.
Mình đã chaỵ thử và báo lỗi Run time error 1004.
 
Upvote 0
Mình đã khắc phục được lỗi trên rồi. Hiện tại còn đoạn code này, mong bạn chỉ giáo:
Mã:
For X = 1 to 5
For Y = 1 to 5
ActiveCell.Value = Application.WorksheetFunction.Sum(Sheets("Reference").range(Sheets("Reference").Cells(5 * X + 10, 12).Offset(Y, 0).Resize(-Y + 6, 1)))
ActiveCell.Offset(1,0).Select
Next
Next
ActiveCell.Value = Application.WorksheetFunction.Sum(Sheets("Reference").Range(Sheets("Reference").Cells(5 * X + 10, 12).Offset(Y, 0).Resize(-Y + 6, 1)))

là sai. Nếu muốn dùng Range(...) thì phải là

ActiveCell.Value = Application.WorksheetFunction.Sum(Sheets("Reference").Range(Sheets("Reference").Cells(5 * X + 10, 12).Offset(Y, 0).Resize(-Y + 6, 1).Address))

Nhưng như thế dài dòng văn tự. Đơn giản chỉ là

ActiveCell.Value = Application.WorksheetFunction.Sum(Sheets("Reference").Cells(5 * X + 10, 12).Offset(Y, 0).Resize(-Y + 6))

Nhưng lưu ý rằng Cells(5 * X + 10, 12).Offset(Y, 0) = Cells(5 * X + 10 + Y, 12) nên cuối cùng có là

ActiveCell.Value = Application.WorksheetFunction.Sum(Sheets("Reference").Cells(5 * X + 10 + Y, 12).Resize(-Y + 6))
 
Upvote 0
ActiveCell.Value = Application.WorksheetFunction.Sum(Sheets("Reference").Range(Sheets("Reference").Cells(5 * X + 10, 12).Offset(Y, 0).Resize(-Y + 6, 1)))

là sai. Nếu muốn dùng Range(...) thì phải là

ActiveCell.Value = Application.WorksheetFunction.Sum(Sheets("Reference").Range(Sheets("Reference").Cells(5 * X + 10, 12).Offset(Y, 0).Resize(-Y + 6, 1).Address))

Nhưng như thế dài dòng văn tự. Đơn giản chỉ là

ActiveCell.Value = Application.WorksheetFunction.Sum(Sheets("Reference").Cells(5 * X + 10, 12).Offset(Y, 0).Resize(-Y + 6))

Nhưng lưu ý rằng Cells(5 * X + 10, 12).Offset(Y, 0) = Cells(5 * X + 10 + Y, 12) nên cuối cùng có là

ActiveCell.Value = Application.WorksheetFunction.Sum(Sheets("Reference").Cells(5 * X + 10 + Y, 12).Resize(-Y + 6))
Tuyệt vời bạn ạ. Code của mình đã hoàn thiện và chạy ổn định.
Cảm ơn bạn vì những feedback để giúp mình coding tối ưu hơn và thức đêm giải đáp giúp mình hoàn thiện project này.
 
Upvote 0
1603551097635.png

mọi người giúp dùm , tự nhiên nó bị lỗi vậy , fix như thế nào ạ
 
Upvote 0
Người xịn tiếng Tây thì đáng lẽ phải biết phân biệt dạng sín-ghìu-là và pơ-lú-rồn của danh tự chứ.
 
Upvote 0
mọi người giúp dùm , tự nhiên nó bị lỗi vậy , fix như thế nào ạ
Lần sau bạn đừng đá những từ tiếng Anh nhé. Chỉ dùng khi thật cần.
Code không tự xuất hiện nên đừng nói "tự nhiên nó bị lỗi vậy". Ai đã viết wb As Workbooks? Bạn nhìn kỹ xem có thấy gì bất thường không.
 
Upvote 0
Chào anh chị!
Cho em hỏi.. Khi trong vòng lặp lấy dữ liệu từ 1 danh sách ở vùng chọn có giá trị = 0 thì next bỏ qua dùng câu lệnh gì ạ.
 
Upvote 0
Chào anh chị!
Cho em hỏi.. Khi trong vòng lặp lấy dữ liệu từ 1 danh sách ở vùng chọn có giá trị = 0 thì next bỏ qua dùng câu lệnh gì ạ.
PHP:
For i=1 to ...
If gia_tri <> 0 Then
'code cũ
End If
Next i
Hoặc
PHP:
For i = 1 to ...
If gia_tri = 0 Then goto ẻm_mới
'code cũ
ẻm_mới:
Next i
 
Upvote 0
Chào anh chị!
Cho em hỏi.. Khi trong vòng lặp lấy dữ liệu từ 1 danh sách ở vùng chọn có giá trị = 0 thì next bỏ qua dùng câu lệnh gì ạ.
Vòng lặp của VBA không có lệnh tương tự như Continue (chạy xuống Next) như nhiều ngôn ngữ khác.
Có hai cách cho VBA:
1. dùng block IF
2. đặt một cái label ngay chỗ next và dùng lệnh goto
(xem bài #2780)
 
Upvote 0
PHP:
For i=1 to ...
If gia_tri <> 0 Then
'code cũ
End If
Next i
Hoặc
PHP:
For i = 1 to ...
If gia_tri = 0 Then goto ẻm_mới
'code cũ
ẻm_mới:
Next i

Như này à anh
VetMini
befaint

Mã:
Sub In_MaChonLoc()
    Dim sRng As Range, cell_ As Range
    Dim Ws As Worksheet
  
    On Error GoTo Thoat
    ActiveSheet.DisplayPageBreaks = False
    Set sRng = Application.InputBox(Prompt:="Chon Du lieu IN", Title:="Vung Data", Type:=8)
    For Each cell_ In sRng
        Set Ws = ActiveSheet
        With Ws
            .Range("AZ1").Value = cell_.Value
            .PrintOut 'Vung in Set
        End With
    Next cell_
Thoat:
End Sub
 
Upvote 0
Như này à anh
VetMini
befaint

Mã:
Sub In_MaChonLoc()
    Dim sRng As Range, cell_ As Range
    Dim Ws As Worksheet
 
    On Error GoTo Thoat
    ActiveSheet.DisplayPageBreaks = False
    Set sRng = Application.InputBox(Prompt:="Chon Du lieu IN", Title:="Vung Data", Type:=8)
    For Each cell_ In sRng
        Set Ws = ActiveSheet
        With Ws
            .Range("AZ1").Value = cell_.Value
            .PrintOut 'Vung in Set
        End With
    Next cell_
Thoat:
End Sub
bạn thêm điều kiện vào rồi thỏa mãn thì goto ... cái gì đó ở dưới cùng bạn cho nó cái label như bác vietmini nói đấy
 
Upvote 0
bạn thêm điều kiện vào rồi thỏa mãn thì goto ... cái gì đó ở dưới cùng bạn cho nó cái label như bác vietmini nói đấy
Sub In_MaChonLoc_KL()
Dim sRng As Range, cell_ As Range
Dim Ws As Worksheet

On Error GoTo Thoat
ActiveSheet.DisplayPageBreaks = False
Set sRng = Application.InputBox(Prompt:="Chon Du lieu IN", Title:="Vung Data", Type:=8)
For Each cell_ In sRng
Set Ws = ActiveSheet
With Ws
If cell_ = 0 Then GoTo DiTiep
.Range("AZ1").Value = cell_.Value
Call HidedongProKL
.PrintOut 'Vung in Set
DiTiep:
End With
Next cell_
Thoat:
End Sub
như này đùng chưa anh nhỉ
 
Upvote 0
Cảnh giới về code ở bài #2784:

1. để thực hiện cách thức giống "Continue" ở các ngôn ngữ khác, cái label luôn luôn đặt ngay trước lệnh Next.
(code ở bài #2784 đặt nó cách Next một dòng End With. Đây là cách làm việc nguy hiểm)

2. dùng ký hiệu gạch dưới ( _ ) trong tên biến:
- Đặt giữa từ thì không sao. Đấy là một trong những cách ngăn từ cho dễ đọc. Ví dụ: s_totite
- Đặt trước hoặc sau từ thì có ý nghĩa khác. Thường thường người ta đặt trước tên biến để ngầm ý rằng đây là biến nội. Đối với lập trình hướng đối tượng, người ta thường đặt hai dấu gạch dưới trước tên biến (hoặc một dấu trước, một dấu sau) để phân biệt loại biến nội và không truyền sang các lớp con. Ví dụ: __totite, _totite_
Nói chung, ký tự gạch dưới đặt trước hoặc sau tên biến thường để đánh dấu loại biến đặc biệt nào đó.
 
Upvote 0
Web KT

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

Back
Top Bottom