Khai báo biến như thế nào là vừa đủ

Liên hệ QC

Phamnghi07

Thành viên mới
Tham gia
20/5/19
Bài viết
10
Được thích
1
Thưa các anh chị! Em thường xuyên khai báo biến workbook và Worksheet như với cấu trúc như thế này. Vì em tự học VBA nên không biết về lâu dài có gì bất ổn không? Mong các anh chị có biết thêm xin bàn luận để em đỡ hoang mang! Em cảm ơn nhiều

Private Sub ListBox8_Change()
Application.ScreenUpdating = False
Dim wb As Workbook, ws As Worksheet
Set wb = ThisWorkbook
Set ws = SKho1
With wb
With ws
Dim id As Integer
id = ListBox8.ListIndex
With Me.ListBox8
If Not dic.exists(.List(id, 0)) Then
dic.Add .List(id, 0), .List(id, 0) & ";" & .List(id, 1) & ";" & .List(id, 2) & ";" & .List(id, 6)
arr = dic.items
ws.Range("K1251").Select
ws.Cells(ActiveCell.Row, "K").Resize(, 1) = Split(arr(0), ";")
dic.Remove (.List(id, 0))
End If
End With
End With
End With
Set wb = Nothing
Set ws = Nothing
Application.ScreenUpdating = True
End Sub
 
Sao set ws = Skho1 mà nó vẫn chịu à
 
Upvote 0
Và thêm With chồng With (của wb, ws) nên thừa?
Biến chưa khai báo?
 
Upvote 0
Và thêm With chồng With (của wb, ws) nên thừa?
Biến chưa khai báo?
"Skho1" là tên Codename ạ. Một số biến toàn cục là "dic" và "arr". Em cảm ơn, With chồng lên With trường hợp của em là thừa ạ? Nghĩa là bỏ đi "With wb" phải không ạ?
Bài đã được tự động gộp:

Code trên sử dụng một đống biến hoặc không khai báo, hoặc khai báo theo kiểu toàn cục.
Có thể cái Skho1 là biến toàn cục, được khai báo và set ở trong module chính.
"Skho1" là tên Codename ạ. Một số biến toàn cục là "dic" và "arr". Em cảm ơn
Bài đã được tự động gộp:

Sao set ws = Skho1 mà nó vẫn chịu à
"Skho1" là tên Codename ạ. Một số biến toàn cục là "dic" và "arr". Em cảm ơn
 
Lần chỉnh sửa cuối:
Upvote 0
"Skho1" là tên Codename ạ. Một số biến toàn cục là "dic" và "arr". Em cảm ơn, With chồng lên With trường hợp của em là thừa ạ? Nghĩa là bỏ đi "With wb" phải không ạ?
Bài đã được tự động gộp:


"Skho1" là tên Codename ạ. Một số biến toàn cục là "dic" và "arr". Em cảm ơn
Bài đã được tự động gộp:


"Skho1" là tên Codename ạ. Một số biến toàn cục là "dic" và "arr". Em cảm ơn
Thừa tất , cả 2 with wb, ws
 
Upvote 0
Nếu ứng dụng của bạn có số lượng code "Khổng lồ" thì bạn nên tập cách viết code không khai báo trước Biến. Để tiết kiệm dung lượng file.
Cách viết không cần khai báo biến sẽ giúp bạn có một kĩ năng lập trình siêu việt hơn.

Thường thì Các biến toàn cục sẽ có chữ "g" ở đầu tên biến.
Các hằng số sẽ được viết Hoa toàn bộ kết hợp dấu gạch dưới:
Public Const MY_NICKNAME = "Sanbi"

Ví dụ:
Public gObj => IsEmpty(gObj) thay cho: Public gObj As Object => gObj Is nothing

Public gVarValue
Thay vì
Public gVarValue As Variant

Dùng ký hiệu để khai báo nếu cần, và kèm tên kiểu nếu cần
Public gIntValue%
Public gLngValue&
Public gLng64Value^
Public gDblValue#
Public gSngValue!
Public gStrValue$
Public gCurValue@

Khao báo mảng sẽ được viết như sau:
Dim Arr$() tương đương với: Dim Arr() As String


Hàm sẽ được viết như sau:
Function GetString$()
GetString = "String"​
End Function


Các cách khai báo trên sẽ giúp bạn tiết kiệm dung lượng.

Dùng toán tử hai dấu ngoặc vuông ([ ]) để tiết kiệm dung lượng:
ws.Range("A1") tương đương ws.[A1]

Dùng dấu ngoặc vuông để mô phỏng một biến không được khai báo
[Worksheet].Name

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

Nếu lập trình Javascript thì không cần lối viết tiết kiệm dung lượng vì đã có chương trình tự động rút gọn code cho bạn.
 
Upvote 0
Thừa tất , cả 2 with wb, ws
Em cảm ơn Tigertiger! Em đã phát hiện ra vẫn đề sai của em. Chúc anh mạnh khỏe
Bài đã được tự động gộp:

Nếu ứng dụng của bạn có số lượng code "Khổng lồ" thì bạn nên tập cách viết code không khai báo trước Biến. Để tiết kiệm dung lượng file.
Cách viết không cần khai báo biến sẽ giúp bạn có một kĩ năng lập trình siêu việt hơn.

Thường thì Các biến toàn cục sẽ có chữ "g" ở đầu tên biến.
Các hằng số sẽ được viết Hoa toàn bộ kết hợp dấu gạch dưới:
Public Const MY_NICKNAME = "Sanbi"

Ví dụ:
Public gObj => IsEmpty(gObj) thay cho: Public gObj As Object => gObj Is nothing

Public gVarValue
Thay vì
Public gVarValue As Variant

Dùng ký hiệu để khai báo nếu cần, và kèm tên kiểu nếu cần
Public gIntValue%
Public gLngValue&
Public gLng64Value^
Public gDblValue#
Public gSngValue!
Public gStrValue$
Public gCurValue@

Khao báo mảng sẽ được viết như sau:
Dim Arr$() tương đương với: Dim Arr() As String


Hàm sẽ được viết như sau:
Function GetString$()
GetString = "String"​
End Function


Các cách khai báo trên sẽ giúp bạn tiết kiệm dung lượng.

Dùng toán tử hai dấu ngoặc vuông ([ ]) để tiết kiệm dung lượng:
ws.Range("A1") tương đương ws.[A1]

Dùng dấu ngoặc vuông để mô phỏng một biến không được khai báo
[Worksheet].Name

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

Nếu lập trình Javascript thì không cần lối viết tiết kiệm dung lượng vì đã có chương trình tự động rút gọn code cho bạn.
Cảm ơn anh, em biết trước điều anh vừa giúp thì hay quá! (Giờ vẫn còn kịp) Bộ nhớ cứ tăng lên sau 3 giờ làm việc liên tiếp (em kiểm tra trên Task manager). Em học anh và chỉnh sửa lại code
 
Lần chỉnh sửa cuối:
Upvote 0
C:
Public gIntValue%
Public gLngValue&
Public gLng64Value^
Public gDblValue#
Public gSngValue!
Public gStrValue$
Public gCurValue@

Khao báo mảng sẽ được viết như sau:
Dim Arr$()  tương đương với: Dim Arr() As String

Hàm sẽ được viết như sau:
Function GetString$()
  GetString = "String"
End Function

Em đọc được bài của thầy rất hay. Thầy cho em hỏi về cách khai báo dùng kí tự kia có nghĩa như nào ạ? Em chưa hiểu về ý nghĩa các kí tự đó.
 
Upvote 0
Upvote 0
@Phạm Doãn Tuyến
-------------------------------------------------------

% Integer
& Long
^ LongLong / LongPtr
# Double
! Single
$ String
@ Currency

Riêng các trường hợp dưới đây không thể viết gọn:
1. Dim S As String * 777
2.
Type VariableType
S As String​
End Type


Khi mới học VBA chưa biết nhiều thì bạn có thể sử dụng Option Explicit để khai báo tường minh, nhưng sau rồi bạn phải bỏ nó đi để rèn luyện kĩ năng chuyên sâu. Như bảo mật code, code sẽ rất khó đọc nếu bạn lập trình mà không khai báo biến hoặc các cách khai báo biến ảo để qua mắt người đọc code.

Tôi thấy một số người đi mã hóa code của mình làm cho ứng dụng tăng dung lượng, đó là một sai lầm của người lập trình.

Cách trên là tôi hướng dẫn đi đến con đường lập trình chuyên nghiệp, mặc dù lúc đầu nó là một khó khăn nhưng khi thông thuộc bộ não sẽ tự kết nối và hoàn thiện.
 
Upvote 0
C:
Nguyên tắc: Luôn luôn và luôn luôn viết tường minh, rõ ràng, trong sáng.

Cho em hỏi em viết vậy không trong sáng câu nào hay từ nào? Vốn kiến thức hạn hẹp nên mình cần học hỏi những người đi trước. Em viết rất rõ ràng tường minh mà. Hay ngôn ngữ của em viết không phải là thuần Việt? Hay em đang viết tắt từ nào??? Bài viết của thầy @HeSanbi em đọc thấy thầy là người hiểu biết đối với em những điều đó mình cần học hỏi. Em cảm thấy hay thì em khen. Như 1 bài hát vậy chỉ có hay thì mới được nghe nhiều lần chứ dở thì ai nghe nhiều lần đâu.
 
Upvote 0
Kiểu viết đó là thắt dây vào cổ và chờ người khác đẩy cái ghế dưới chân. Viết thế kia trông có vẻ 'nguy hiểm' và 'rất dễ lấy lòng' bạn.

Nguyên tắc: Luôn luôn và luôn luôn viết tường minh, rõ ràng, trong sáng.
Em cảm ơn, Vậy theo ý em hiểu là dù kinh nghiệm mấy cũng luôn cảnh giác, luôn viết tường minh trong sáng!
Bài đã được tự động gộp:

C:
Nguyên tắc: Luôn luôn và luôn luôn viết tường minh, rõ ràng, trong sáng.

Cho em hỏi em viết vậy không trong sáng câu nào hay từ nào? Vốn kiến thức hạn hẹp nên mình cần học hỏi những người đi trước. Em viết rất rõ ràng tường minh mà. Hay ngôn ngữ của em viết không phải là thuần Việt? Hay em đang viết tắt từ nào??? Bài viết của thầy @HeSanbi em đọc thấy thầy là người hiểu biết đối với em những điều đó mình cần học hỏi. Em cảm thấy hay thì em khen. Như 1 bài hát vậy chỉ có hay thì mới được nghe nhiều lần chứ dở thì ai nghe nhiều lần đâu.
theo em hiểu ở đây là viết code "tường minh trong sáng" vì nếu không sẽ bị lỗi mà quanh quẩn tháo gỡ hoài! Nhưng với em thì anh nào nói cũng đều là từ 1 bầu trời kinh nghiệm khuyến cáo cho mình hết đấy ạ
 
Upvote 0
@Phạm Doãn Tuyến
-------------------------------------------------------

% Integer
& Long
^ LongLong / LongPtr
# Double
! Single
$ String
@ Currency

Riêng các trường hợp dưới đây không thể viết gọn:
1. Dim S As String * 777
2.
Type VariableType
S As String​
End Type


Khi mới học VBA chưa biết nhiều thì bạn có thể sử dụng Option Explicit để khai báo tường minh, nhưng sau rồi bạn phải bỏ nó đi để rèn luyện kĩ năng chuyên sâu. Như bảo mật code, code sẽ rất khó đọc nếu bạn lập trình mà không khai báo biến hoặc các cách khai báo biến ảo để qua mắt người đọc code.

Tôi thấy một số người đi mã hóa code của mình làm cho ứng dụng tăng dung lượng, đó là một sai lầm của người lập trình.

Cách trên là tôi hướng dẫn đi đến con đường lập trình chuyên nghiệp, mặc dù lúc đầu nó là một khó khăn nhưng khi thông thuộc bộ não sẽ tự kết nối và hoàn thiện.


Em rất cảm ơn thầy đã chỉ bảo. Em cũng là người mới tập tành viết nên nhiều điều còn chưa biết.Hiện tại em vẫn đang học viết khai báo tường minh nhưng sau bài viết này chắc em sẽ phải thay đổi dần. Em cảm ơn thầy nhiều ạ.
 
Upvote 0
Kiểu viết đó là thắt dây vào cổ và chờ người khác đẩy cái ghế dưới chân. Viết thế kia trông có vẻ 'nguy hiểm' và 'rất dễ lấy lòng' bạn.

Nguyên tắc: Luôn luôn và luôn luôn viết tường minh, rõ ràng, trong sáng.

Vâng nếu không phải anh viết vậy để ám chỉ điều gì thì trước tiên cho em xin lỗi vì đã hiều sai ý. Nhưng vấn đề ở đây là bài viết của anh trên thì đang nói về từ "rất hay" và anh cũng đang nói "Kiểu viết đó là thắt dây vào cổ và chờ người khác đẩy cái ghế dưới chân. Viết thế kia trông có vẻ 'nguy hiểm' và 'rất dễ lấy lòng' bạn." Và ngay bên dưới viêt luôn về "Nguyên tắc" vậy anh nghĩ em sẽ hiểu như nào? Nếu đã là "Nguyên tắc khi viết code: Luôn luôn và luôn luôn viết tường minh, rõ ràng, trong sáng." thì hãy viết rõ ràng ngay từ những bài viết của anh nhé tránh sự hiểu nhầm.
 
Upvote 0
Kiểu viết đó là thắt dây vào cổ và chờ người khác đẩy cái ghế dưới chân. Viết thế kia trông có vẻ 'nguy hiểm' và 'rất dễ lấy lòng' bạn.

Nguyên tắc: Luôn luôn và luôn luôn viết tường minh, rõ ràng, trong sáng.
'nguy hiểm' và 'lấy lòng' là chuyện của từng người. Hầu hết code ở diễn đàn này vốn dĩ chỉ là loại "dùng một lần, đặc thù cho trường hợp". Mỗi lần có vấn đề khác thì người ta viết lại. Một số code viết với mục đích "dùng nhiều lần" thì lại viết quá nhiều chọn lựa (options) mà giải thích giao diện thì rất giới hạn cho nên chả mấy người hiểu được cách dùng.
Nói thẳng ra, GPE chỉ là môi trường giúp đỡ code và tập viết code thôi. Muốn thực sự nắm vững các cách thức quản lý code thì nên học căn bản từ nơi khác.

Điểm mà thớt đáng lẽ cần biết là TẦM VỰC của biến. Bài này sử dụng biến nội bộ, toàn cục lẫn lộn. Việc thớt viết code lồng một đống With's cho thấy kiến thức về không gian tầm vực là zê-rô.

Chú thích:
VBA dùng dấu ngoặc vuông [ ] làm ký hiệu tắt của lệnh Evaluate.
Tuy nhiên, dấu hiệu này chỉ 'evaluate' trị trực tiếp chứ không thể sử dụng cho biến.
[A1] tính ra thành Range("A1"). Nhưng:
bien = "A1"
Range(bien) --> chấp nhận
[bien] --> lỗi
 
Upvote 0
Nói chung có 2 trường phải
Cổ điển: Viết đầy đủ khai báo
Đương đại: Viết đầy đủ khai báo / hoặc viết tự do / hoặc viết theo kiểu lập trình hàm (thì còn gọn gàng hơn)

Viết thế nào , quản lý code thế nào, thì lại do người chủ viết code đó ra -- mà người chủ thì thích gì yêu gì thì nó dễ nó hay và còn có người nói nó khoa học với chính họ (lộn xộn trong trật tự móc chéo nhau của nơ ron của óc họ)

Nhưng Cái chung và chuyên nghiệp thì bao giờ cũng gọn: Rõ ràng, không mập mờ, không giấu diếm, code càng mở càng dễ hiểu/ dễ quản lý / dễ bảo trì càng tốt (lưu ý bảo mật theo ý chuyên nghiệp là khác xa với kiểu bảo mật giấu code, mã hóa code - cái đó dành cho dân thường)

Trên cũng là ý kiến hạn hẹp, và phạm vi bài viết diễn đàn không thể mô tả hết, thiếu xót mong các bạn thông cảm và bổ sung.
 
Upvote 0
1. Evaluate là một Hàm trong lớp đối tượng Application, không phải Lệnh.
2. Cặp ngoặc vuông là một toán tử của VBA, không phải Lệnh thay thế cho hàm hay dòng nào cả.
3. VBA và Application là khác nhau, Application là một lớp đối tượng, VBA là một ngôn ngữ Script
4.
bien = "A1"
[bien] không xảy ra lỗi, [bien] sẽ nhận giá trị là chuỗi A1


Để tôi ví dụ chứ nói xuông người ta bàn:
----------------------------------------
JavaScript:
Option Explicit
Private Sub test1()
  Dim A, B
  'Thử đặt một giá trị ảo xem có lỗi không
  B = [bb]
  ' Tạo một mảng như thế này xem có Hàm hay lệnh nào bắt chước được hay không
  A = [{1,2,3,4}]
  'Viết khống thế này xem nó là toán tử hay hàm, và có lỗi gì không'
[ABCDEFGHIJMNL]
  'Tạo một đối tượng Ảo không được khai báo trước mặc dù đặt Option Explicit khai báo tường minh'
  Debug.Print [ABCDEFGHIJMNL].Name
End Sub
--------------------------------------------------

Application.Evaluate không thể bắt chước khả năng của cặp ngoặc vuông.

Ngược lại cặp ngoặc vuông cũng không thể bắt chước khả năng của Hàm tính toán Application.Evaluate

Nhưng tôi không dám nói:
Application.Evaluate("1+2") khác [2+1]
Vì một đứa con nít cũng biết 1+2 = 2+1

__________________________________________________
Ptm0412 xoá 3 câu có tính công kích cá nhân và cỡ chữ lớn
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Web KT

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

Back
Top Bottom