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:
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
Chắc là vầy: =IF(OR(RC15=A,RC15=B),0,RC16-RC17)
Mà A, B của bạn gì vậy, để trơ như vậy cũng được hả ta.
 
Upvote 0
Chắc là vầy: =IF(OR(RC15=A,RC15=B),0,RC16-RC17)
Mà A, B của bạn gì vậy, để trơ như vậy cũng được hả ta.
em khai báo bên trên, a và b là chuỗi VD như a có thể là TN30
em mới thử nhưng nó báo lỗi #NAME bác ạ :((( có cách nào khác không ạ
Range("R" & Worksheets("Sheet1").Cells(1, 1)).Formula = "=IF((RC15=""TN30""),0,(RC16-RC17))"
Hiện tại câu lệnh của em là như trên và chỉ biết chọn một giá trị
 
Lần chỉnh sửa cuối:
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
Bạn không nên tìm cách viết hoặc sửa công thức như vậy. Cách đơn giản nhất là bạn cứ nhập công thức mà bạn muốn vào một ô nào đó, chọn ô đó và chuyển sang môi trường VBE gõ vào cửa sổ Immediate (nếu không có cửa sổ này thì nhấn Ctrl + G) dòng lệnh sau
PHP:
?ActiveCell.FormulaR1C1
 
Upvote 0
Sửa code định dạng biểu đồ ?

Xin chào tất cả các bạn,
Tôi muốn chạy code dưới đây để định dạng cho 18 biểu đồ (Chart1~ chart 18) trong 1 sheets
Xin hỏi có có cách viết nào cho code bên dưới để có thể định dạng toàn bộ 18 biểu đồ này theo nội dung bên dưới không ạ?
Mã:
Sub Macro1()
    ActiveSheet.ChartObjects("Chart 1").Activate
    ActiveChart.SeriesCollection(1).DataLabels.Select
    Selection.NumberFormat = "0.00%"
    ActiveChart.SeriesCollection(2).DataLabels.Select
    Selection.NumberFormat = "0.00%"
    ActiveChart.SeriesCollection(5).DataLabels.Select
    Selection.NumberFormat = "0.00%"
End Sub

Rất mong nhận được sự hỗ trợ của các bạn.
Trân trọng cảm ơn.
 
Upvote 0
Xin chào tất cả các bạn,
Tôi muốn chạy code dưới đây để định dạng cho 18 biểu đồ (Chart1~ chart 18) trong 1 sheets
Xin hỏi có có cách viết nào cho code bên dưới để có thể định dạng toàn bộ 18 biểu đồ này theo nội dung bên dưới không ạ?
Mã:
Sub Macro1()
    ActiveSheet.ChartObjects("Chart 1").Activate
    ActiveChart.SeriesCollection(1).DataLabels.Select
    Selection.NumberFormat = "0.00%"
    ActiveChart.SeriesCollection(2).DataLabels.Select
    Selection.NumberFormat = "0.00%"
    ActiveChart.SeriesCollection(5).DataLabels.Select
    Selection.NumberFormat = "0.00%"
End Sub

Rất mong nhận được sự hỗ trợ của các bạn.
Trân trọng cảm ơn.

Rất khó để giúp bạn khi mà không có file đính kèm để test, thôi thì bạn thử chạy đoạn này xem có giúp gì được cho bạn không nhé.
Mã:
Sub Macro1()
               Dim n As Byte
                With ActiveSheet
                    For n = 1 To 14
                        With .ChartObjects("Chart " & n).Activate
                            With ActiveChart
                                .SeriesCollection(1).DataLabels.NumberFormat = "0.00%"
                                .SeriesCollection(2).DataLabels.NumberFormat = "0.00%"
                                .SeriesCollection(5).DataLabels.NumberFormat = "0.00%"
                            End With
                        End With
                    Next n
                End With
End Sub
 
Upvote 0
Rất khó để giúp bạn khi mà không có file đính kèm để test, thôi thì bạn thử chạy đoạn này xem có giúp gì được cho bạn không nhé.
Mã:
Sub Macro1()
               Dim n As Byte
                With ActiveSheet
                    For n = 1 To 14
                        With .ChartObjects("Chart " & n).Activate
                            With ActiveChart
                                .SeriesCollection(1).DataLabels.NumberFormat = "0.00%"
                                .SeriesCollection(2).DataLabels.NumberFormat = "0.00%"
                                .SeriesCollection(5).DataLabels.NumberFormat = "0.00%"
                            End With
                        End With
                    Next n
                End With
End Sub

Cảm ơn bạn nhiều nhé,code trên chạy ra kết quả đúng ý tôi muốn rồi.
 
Upvote 0
Em có 1 thắc mắc nhỏ sau. Mong anh/chị giải thích.
ví dụ: một số anh chị viết vòng lặp For... Next...
For i = 1 to ubound(xxx)
...
Next
sau chữ next có người viết là
Next i
có người viet Next

Anh/chị có thể giải thích 2 cách này có j khác nhau không ạ?
 
Upvote 0
Em có 1 thắc mắc nhỏ sau. Mong anh/chị giải thích.
ví dụ: một số anh chị viết vòng lặp For... Next...
For i = 1 to ubound(xxx)
...
Next
sau chữ next có người viết là
Next i
có người viet Next

Anh/chị có thể giải thích 2 cách này có j khác nhau không ạ?
Vụ này mình để ý thấy đúng là thi thoảng cũng có người viết Next thay vì Next i nhưng VBA vẫn hiểu được và CODE thì vẫn chạy đúng. Tuy nhiên nếu CODE có nhiều hơn 1 vòng lặp For thì ta nên viết rõ là Next i , Next k,... hay Next biến gì đó. Viết vầy cho tường minh
 
Upvote 0
Em có 1 thắc mắc nhỏ sau. Mong anh/chị giải thích.
ví dụ: một số anh chị viết vòng lặp For... Next...
For i = 1 to ubound(xxx)
...
Next
Nhưng sau chữ next có người viết là
Next i

Theo mình, cách nào VBA cũng hiểu; nhưng với bản thân người viết & người xem người khác viết có khác nhau.

Cách sau nó 'tường minh' hơn.
Khẳng định là đến đó (từ đó trở về sau) thì tham biến i ta có thể xài vô việc khác nếu muốn​
Fân biệt được khối dòng lệnh của vòng lặp này với khối lệnh của vòng lặp khác (dễ nhìn hơn).

Tóm lại là dễ quản các dòng lệnh giành cho những người mới bắt đầu như mình.

Những mong ít nhiều giúp được bạn.
 
Upvote 0
Em chưa hiểu ý của anh lắm.

Đã đếm chưa? sau khi đếm rồi mà vẫn không hiểu thì hãy hỏi tiếp.

số người viết "Next" trên diễn đàn GPE đông hơn nhiều so với số người viết "Next i" . không biết em nên tự suy ra điều gì đây anh ?

Suy ra: có thể hỏi thẳng những người viết "next i"

Bởi vì tôi là một trong những người đó, cho nên trường hợp của tôi như sau:
Theo lý thuyết, đó chỉ là một thói quen cũ của những người quen với BASIC thời thượng cổ. Ngày xưa, chưa có màn hình động cho nên code phải viết từng dòng. "Next i" giúp trình dịch BASIC biết chỗ để nối với cái chỗ "For i="
Với màn hình động mấy chục năm nay, VBA không cần điểm này nữa. "Next i" chỉ mất công thôi.
Tuy nhiên, tôi vẫn giữ thói quen này là vì nó giúp cho dễ hơn khi cần cắt dán code - dễ nhận ra khi copy/cut-paste thiếu, trật chỗ. Nếu bạn không cut-paste nhiều thì hoàn toàn không cần.

Việc có hay không có thì dễ nhìn, tường minh này nọ chỉ là quan niệm thôi. Có nhiều cách để khác viết code dễ nhìn.
 
Upvote 0
Đã đếm chưa? sau khi đếm rồi mà vẫn không hiểu thì hãy hỏi tiếp.



Suy ra: có thể hỏi thẳng những người viết "next i"

Bởi vì tôi là một trong những người đó, cho nên trường hợp của tôi như sau:
Theo lý thuyết, đó chỉ là một thói quen cũ của những người quen với BASIC thời thượng cổ. Ngày xưa, chưa có màn hình động cho nên code phải viết từng dòng. "Next i" giúp trình dịch BASIC biết chỗ để nối với cái chỗ "For i="
Với màn hình động mấy chục năm nay, VBA không cần điểm này nữa. "Next i" chỉ mất công thôi.
Tuy nhiên, tôi vẫn giữ thói quen này là vì nó giúp cho dễ hơn khi cần cắt dán code - dễ nhận ra khi copy/cut-paste thiếu, trật chỗ. Nếu bạn không cut-paste nhiều thì hoàn toàn không cần.

Việc có hay không có thì dễ nhìn, tường minh này nọ chỉ là quan niệm thôi. Có nhiều cách để khác viết code dễ nhìn.

ồ , những người lớn tuổi cũng có nhiều câu chuyện hay quá nhỉ ? hi hi
với em thì cái thời chưa có màn hình động đó thì em chưa có mặt trên đời nữa .
 
Upvote 0
ồ , những người lớn tuổi cũng có nhiều câu chuyện hay quá nhỉ ? hi hi
với em thì cái thời chưa có màn hình động đó thì em chưa có mặt trên đời nữa .

Thỉnh thonagr bạn có thấy cái từ vbLF, vbCR. LF là Line Feed (10), CR là Carriage Return (13). Biết mấy từ đó ở đâu ra không?
 
Upvote 0
Thời bảo đại ở truồng, người ta gõ văn bản trên cái bàn đánh máy chữ.
Bàn này có 2 cơ phận chính: cơ phận điều khiển gõ lý tự và cơ phận điều khiển tờ giây.
Diễn tả rất dài dòng, nên chỉ đại khái là cơ phận điều khiển giấy có nhiệm vụ dời giấy như thế nào để ký tự có thể tiếp tục gõ mà không chôgf lên nhau. Sau khi hết dòng hoặc gặp lúc cần sang dòng mới thì cần 2 việc:
Thứ nhât, cuộn dòng cũ lên để có thể sang dòng mới.
Thứ hai, bắt đầu từ vị trí đầu tiên của dòng mới.
Cái cơ phận làm công việc này được gọi là cái carriage. Hành động cuộn lên dòng mới là line feed. Hành động kéo về vị trí đầu dòng là carriage return.

Qua thời đại điện tử thhif các từ này vẫn còn được dùng. Hiện nay, tuỳ theo hệ thóng vận hành mà bạn có thể định nghĩa dòng mới khác nhau:
1. Line feed, hoặc
2. Carriage Return, hoặc
3. LF + CR. Chính đám này cũng chia 2, nhóm đặt LF trước và nhóm đặt CR trước.

Khi làm việc cần tìm hiểu luật của hệ thống vận hành diễn tả dòng mới là ký hiệu nào.
 
Upvote 0
Ôi, không ngờ mọi người lại thảo luận vế đề này , hihi
Em rất thích những câu hỏi kiểu này đó ạ, những câu hỏi tưởng chừng dễ đến mức không ai muốn hỏi nhưng lại là vấn đề có thể nhiều người không để ý biết đến.
Ngay trước câu hỏi này em cũng có viết:
Rất khó để giúp bạn khi mà không có file đính kèm để test, thôi thì bạn thử chạy đoạn này xem có giúp gì được cho bạn không nhé.
Mã:
Sub Macro1()
               Dim n As Byte
                With ActiveSheet
                    For n = 1 To 14
                        With .ChartObjects("Chart " & n).Activate
                            With ActiveChart
                                .SeriesCollection(1).DataLabels.NumberFormat = "0.00%"
                                .SeriesCollection(2).DataLabels.NumberFormat = "0.00%"
                                .SeriesCollection(5).DataLabels.NumberFormat = "0.00%"
                            End With
                        End With
                    Next n
                End With
End Sub

Thật sự em cũng không biết về vấn đề viết next n và next có gì khác nhau hay không. Nhưng em thấy 2 cách viết này nó đều không có lỗi gì vẫn hoạt động bình thường nên cứ viết kiểu next n thôi ạ.
Viết như thế này sẽ giúp cho những người kém cói như em khi nhìn vào code có thể dễ nhìn thấy sự kết thúc của vòng lặp nào nếu trong đoạn code có từ 2 vong lặp trở lên... chỉ đơn giản như vậy thôi ạ.
 
Upvote 0
...
Viết như thế này sẽ giúp cho những người kém cói như em khi nhìn vào code có thể dễ nhìn thấy sự kết thúc của vòng lặp nào nếu trong đoạn code có từ 2 vong lặp trở lên... chỉ đơn giản như vậy thôi ạ.

Dễ và khó là từ ngữ có tính cách chủ quan. Như tôi đã đề cập, có nhiều cách để làm cho dễ nhìn. Cách hữu hiệu nhất là dùng dấu cách để đẩy code sâu vào. 2 hay 3, 4 vòng lặp đều được. Trong code của bạn có một đống with. Tại sao cần phân biệt được chỗ kết vòng lặp mà không phân biệt chỗ kết with?
 
Upvote 0
Web KT

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

Back
Top Bottom