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:
Xin góp ý code khai báo biến

Chào các bạn,
Đọc các đoạn code của các bạn tôi xin góp ý về cách khai báo biến.
Việc khai báo biến như thế nào để khi truy tìm, hoặc khi Ctrl + Space bar nhanh hơn?

Thông thường khi mới bước vào lập trình thì chúng ta không quan tâm lắm, chỉ làm sao cho chương trình đạt được mục đích của mình là được. Vâng, tôi đồng ý, nhưng như vậy nó sẽ làm cho chúng ta có thói quen lập trình không hay, ảnh hưởng đến các đoạn code của các bạn sau này.

Ví dụ, phân tích đoạn khai biến sau:

Mã:
Option Explicit
Dim Rng As Range, Clls As Range, Str As String
Dim Tmp, i As Long, Er As Long
Rng, Clls --> được khai báo là đối tượng Range.
i, Er --> được khai báo là kiểu Long
Còn Tmp là kiểu Variant
(Chú ý rằng trong VBA, nếu chúng ta khai báo Dim Tmp, i As Long thì chương trình chỉ hiểu là chúng ta khai báo i As Long, còn Tmp là kiểu Variant)
Cách khai báo trên đôi khi sẽ làm chính người lập trình bị lộn xộn.

Chúng ta nên dùng một từ đầu trong tên biến để thể hiện kiểu dữ liệu:

Ví dụ:
Ví dụ kiểu khai báo|Từ đầu tiên|Kiểu dữ liệu
Dim iColumn As Integer|i|Kiểu Integer
Dim lRow As Long|l|Kiểu Long
Dim dProduct As Double|d|Kiểu Double
Dim sName As String|s|String
Dim vValue As Variant|v|Variant
Dim bChoice As Boolean|b|Boolean
Như vậy việc khai báo biến sẽ dễ hiểu hơn. Chú ý, ký tự thứ hai của tên biến, các bạn nên viết Hoa.

Ngoài ra còn các kiểu dữ liệu khác, chúng ta sẽ dùng hai hoặc ba ký tự đầu của tên biến:

Ví dụ kiểu khai báo|Từ đầu tiên|Kiểu dữ liệu
Dim objExcel As Object|obj|Object
Dim rngData As Range|rng|Range
Dim wkbSales As Workbook|wkb|Workbook
Dim wksProducts As Worksheet|wks|Worksheet

Lê Văn Duyệt
 
Lần chỉnh sửa cuối:
Upvote 0
Xin lỗi, cho hỏi một chút về mảng đối tượng với nhé!

Các bạn ơi, chỉ dùm tôi cách lập nên một mảng các đối tượng trong VBA với. Ví dụ tôi có 1 mảng bao gồm các CommandButton ấy. trong 1 Form tôi có dùng khoảng 20 CommandButton có chức năng gần tương tự nhau. Bây giờ tôi muốn quản lý các cmd đó theo dạng mảng thì làm thế nào?
Cảm ơn các bạn nhé@
 
Upvote 0
Các bạn ơi, chỉ dùm tôi cách lập nên một mảng các đối tượng trong VBA với. Ví dụ tôi có 1 mảng bao gồm các CommandButton ấy. trong 1 Form tôi có dùng khoảng 20 CommandButton có chức năng gần tương tự nhau. Bây giờ tôi muốn quản lý các cmd đó theo dạng mảng thì làm thế nào?
Cảm ơn các bạn nhé@
Bạn nghiên cứu bài số 5 của Po_Pikachu về tham số k trong Command Button.
http://www.giaiphapexcel.com/forum/showthread.php?t=15438
 
Upvote 0
Làm sao để hiện thông báo bằng tiếng việt

Mình dùng các lệnh có thông báo VD:
msgbox "Hiện lên thông báo",,"Tiêu đề của thông báo"
inputbox "Nhập số liệu"
Nhưng nó luôn bị mã hóa, Không có hiện lên tiếng việt, Mong các bạn giúp với.
 
Upvote 0
NDU đã viết:
Function Unique(Vung As Range, STT As Long) As String 'Can I change STT as Long to Interger
Dim i As Long, K As Long
Dim Temp As String
For i = 1 To Vung.Cells.Count ' till the last row in the range
If Vung(i) <> "" Then
If i = Application.WorksheetFunction.Match(Vung(i), Vung, 0) Then
K = K + 1 'K was defaulted starting at 0?
End If
If K = STT Then Temp = Vung(i): Exit For
End If
Next i
Unique = Temp
End Function

Chào các anh
Em xin được hỏi trong đoạn code trên:

- Em có thể khai báo STT as interger?
- K = K+1 (có phải K được mặc định bắt đầu = 0?)

Có phải muốn Exit For thì mình phải đặt dấu ":" đằng trước?

Cám ơn các anh chỉ bảo?

ST
 
Lần chỉnh sửa cuối:
Upvote 0
Chào các anh
Em xin được hỏi trong đoạn code trên:

- Em có thể khai báo STT as interger?
- K = K+1 (có phải K được mặc định bắt đầu = 0?)

Có phải muốn Exit For thì mình phải đặt dấu ":" đằng trước?

Cám ơn các anh chỉ bảo?

ST
Hãy Google để tìm interger, long
K=0, nếu chuẩn thì nên khai trước vì UDF nằm trong 1 Sub nào mà có biến K => sẽ sai.
":" thay vì xuống hàng.
cells( )=1: exit sub
đó là
cells( )=1
exit sub

 
Upvote 0
Em xin được hỏi trong đoạn code trên:
- Em có thể khai báo STT as interger?
- K = K+1 (có phải K được mặc định bắt đầu = 0?)
* Integer hay Long tùy thuộc vào số lượng records bạn đang & sẽ có trong CSDL;
* Một khi khai 1 biến kiểu Long hay Interger thì có lả đúng vậy, chúng = 0 khi chưa đụng đến nó.
Có phải muốn Exit For thì mình phải đặt dấu ":" đằng trước?
Cám ơn các anh chỉ bảo? ST
Dấu ':' dùng đề phân cách hai lệnh (ngắn) đang chung 1 dòng;
Ngược lại, dấu '_' dùng để báo cho VBA biết tôi có dòng lệnh quá dài, nên phải viết tiếp ở dòng dưới liền kề.
Ví dụ:
PHP:
Dim GGGGGGGGGGGGGGGPPPPPPPPPPPPPPPPPEEEEEEEEEEE As String
 GGGGGGGGGGGGGGGPPPPPPPPPPPPPPPPPEEEEEEEEEEE = "AAA" & _
         GGGGGGGGGGGGGGGPPPPPPPPPPPPPPPPPEEEEEEEEEEE & ".COM"
 
Upvote 0
Long (long integer) variables are stored as signed 32-bit (4-byte) numbers ranging in value from -2,147,483,648 to 2,147,483,647. The type-declaration character for Long is the ampersand (&).

Em đã đọc Integer và Long nên em mới hỏi. Excel 2003 chỉ có 65536 dòng thì làm sao phải dùng đến Long ạ?

Các anh chỉ thêm.

Xin cám ơn

ST
 
Upvote 0
Bổ sung:
dấu hai chấm :)) còn dùng cho việc đặt nhãn (label) trong câu lệnh goto.

-hvl-
 
Upvote 0
Upvote 0
Em đã đọc và đúng thật rất sôi nổi...nhưng có một số bài em đọc không vừa ý lắm...
Nhưng không sao, là diễn đàn mà

Có lẽ do ta chỉ đứng từ mỗi góc độ khác nhau nên đánh giá dáng vẻ của một " pho tượng" không đúng lắm

Đối với Em Anh thực sự là một cao thủ mà không biết bao giờ em đạt tới được.

Cám ơn anh
 
Lần chỉnh sửa cuối:
Upvote 0
Em đã đọc và đúng thật rất sôi nổi...nhưng có một số bài em đọc không vừa ý lắm...
Nhưng không sao, là diễn đàn mà

Có lẽ do ta chỉ đứng từ mỗi góc độ khác nhau nên đánh giá dáng vẻ của một " pho tượng" không đúng lắm

Đối với Em Anh thực sự là một cao thủ mà không biết bao giờ em đạt tới được.

Cám ơn anh
Một số bài trong Topic đó thật sự tôi cũng chưa hiểu nổi, vì trình độ của tôi còn quá hạn hẹp... Nhưng đại khái các cao thủ đã khẳng định rằng:
- Các biến Byte, Integer, Long ... tất cả đều sẽ được chuyển thành Long trước khi tính toán
- Vì lẽ đó mà thay vì khai báo Integer, ta khai báo là Long luôn cho nó nhanh
- Đương nhiên nếu ta khai báo Integer cũng chẳng ai nói gì (với trình độ của tôi và bạn)... nếu như vùng nhớ Integer chứa đủ
- Cũng từ sau bài viết ấy, tôi đã tập thói quen khai báo Long cho mấy biến loại trên
Còn 1 nguyên nhân khác: Chử Long gõ.. dể và sướng tay hơn chử Integer...
Ẹc.. Ẹc...
 
Upvote 0
Nếu dữ liệu của bạn < 65.000 dòng thì hai đoạn code trên là tương đương.
Khi dữ liệu >=65.000 dòng thì Khác biệt sẽ thấy rõ đấy bạn à! Bạn hãy thử với hai đoạn code sau (chép vào sheet, không chép vào module), rồi cho chạy SUB này để thấy sự khác biệt.
PHP:
Sub Test()
a = Cells(Cells.Rows.Count, 1).End(xlUp).Row
b = [A65000].End(xlUp).Row
MsgBox a
MsgBox b
End Sub
Minh không biết post bai chu đề riêng cua mình nen mươn đề tài của bạn vậy. Xin lỗi ban nha.
Các bạn ơi giup minh giải thích đoan code này nha! hàm đổi số ra chữ: không biết có sai cái gi mà đoan code mình không chạy.
Public Sub VND(BaoNhieu)
If Val(BaoNhieu) = 0 Then
KetQua = "Kh«ng ®ång"
Else
If Abs(BaoNhieu) > 1E+15 Then
KetQua = "Sè qu¸ lín"
Else
If BaoNhieu < 0 Then KetQua = "Trwf&Space(1) Else KetQua=Space(0)"
SoTien = Format(Abs(BaoNhieu), "##############0.00") '18 cét sè, 2 sè lÎ
SoTien = Right(Space(15) & SoTien, 18)
Hang = Array("None", "Tr¨m", "m&shy;¬i", "g× ®ã")
DonVi = Array("None", "ngµn tû", "tû", "triÖu", "ngµ", "®ång", "xu")
Dem = Array("None", "mét", "hai", "ba", "bèn", "n¨m", "s¸u", "b¶y", "t¸m", "chÝn")
For N = 1 To 6
Nhom = Mid(SoTien, N * 3 - 2, 3)
If Nhom <> Space(3) Then
Select Case Nhom
Case "000"
If N = 5 Then
Chu = "®ång" & Space(1)
Else
Chu = Space(0)
End If
Case "00", ",00"
Chu = "Ch½n"
Case Else
S1 = Left(Nhom, 1): S2 = Mid(Nhom, 2, 1): S3 = Right(Nhom, 1)
Chu = Space(0): Hang(3) = DonVi(N)
For K = 1 To 3
Dich = Space(0): S = Val(Mid(Nhom, K, 1))
If S > 0 Then
Dich = Dem(S) & Space(1) & Hang(K) & Space(1)
Else
If K = 1 And N > 1 And N < 6 And Val(Mid(SoTien, (N - 1) * 3 - 2, 3)) > 0 Then
Dich = "Kh«ng""& space(1)& Hang(K)& Space(1)"
End If
End If
Select Case K
Case 2 And S = 1
Dich = "m&shy;êi" & Space(1)
Case 3 And S = 0 And Nhom <> Space(2) & "0"
Dich = Hang(K) & Space(1)
Case 3 And S = 5 And Val(S2) > 0
Dich = "I" & Mid(Dich, 2) 'Ký Tù en lê'
Case 2 And S = 0 And S3 <> "0"
If N > 1 And Val(Mid(SoTien, (N - 1) * 3 - 2, 3)) > 0 Or (S1) > 0 Then
Dich = "lÓ" & Space(1)
End If
End Select
Chu = Chu & Dich
Next K
End Select
Vitri = InStr(1, Chu, "m&shy;êi mét")
KetQua = KetQua & Chu
End If
Next N
End If
End If
VND = UCase(Left(KetQua, 1)) & Trim(Mid(KetQua, 2))
End Function
(Đoạn này của Ông Văn Thông "giáo trình thực hành"
Không biết thao tác mình có đánh sai doan code không. Các bạn giúp mình với.
 
Upvote 0
Minh không biết post bai chu đề riêng cua mình nen mươn đề tài của bạn vậy. Xin lỗi ban nha.
Các bạn ơi giup minh giải thích đoan code này nha! hàm đổi số ra chữ: không biết có sai cái gi mà đoan code mình không chạy.
Public Sub VND(BaoNhieu)
If Val(BaoNhieu) = 0 Then
....
VND = UCase(Left(KetQua, 1)) & Trim(Mid(KetQua, 2))
End Function
(Đoạn này của Ông Văn Thông "giáo trình thực hành"
Không biết thao tác mình có đánh sai doan code không. Các bạn giúp mình với.
Thay Public Sub VND(BaoNhieu) là Public Function VND(BaoNhieu)
Đầu là Sub mà cuối là Function
 
Upvote 0
Procedures có hai loại:
_ Sub
_ Function

Cả hai loại đều thực hiện một số lệnh (hay người ta còn thường gọi chúng ta các Macro), nhưng Function sẽ trả về một giá trị. Chính vì vậy để tính toán người ta sẽ dùng Function mà tiếng việt chúng ta thường gọi là Hàm. Còn Sub gọi là thủ tục.

Mã:
Function Vnd(SoTien) As String

End Function

Mã:
Sub DinhDang()

End Sub

Vbavn
 
Upvote 0
Nhờ các bạn sửa giúp!

Các bác ơi em có đoạn code sau :
PHP:
Private Sub CommandButton1_Click()
Dim i As Long
    i = 3
    Do While Range("A" & i + 1).Value <> ""
    i = i + 1
    Loop
    Range(" " A " & i : " E " & i").Select
End Sub
Chạy không được, các bác sửa lại dùm em với nhé, em chả biết sai như thế nào để mà sửa
 
Upvote 0
Các bác ơi em có đoạn code sau :
PHP:
Private Sub CommandButton1_Click()
Dim i As Long
    i = 3
    Do While Range("A" & i + 1).Value <> ""
    i = i + 1
    Loop
    Range(" " A " & i : " E " & i").Select
End Sub
Chạy không được, các bác sửa lại dùm em với nhé, em chả biết sai như thế nào để mà sửa
Sai ở câu này:
Range(" " A " & i : " E " & i").Select
Phải là

PHP:
 Range("A" & i & ":E" & i ).Select
 
Upvote 0
Status
Không mở trả lời sau này.
Web KT
Back
Top Bottom