Tôi có thể đồng thời khai báo và gán một biến trong VBA không?


163

Tôi mới sử dụng VBA và muốn biết liệu tôi có thể chuyển đổi khai báo và chuyển nhượng sau thành một dòng không:

Dim clientToTest As String
clientToTest = clientsToTest(i)

hoặc là

Dim clientString As Variant
clientString = Split(clientToTest)

Câu trả lời:


237

Thật không may là không có tốc ký trong VBA, Điều gần nhất bạn sẽ nhận được là một thứ hoàn toàn trực quan bằng cách sử dụng :ký tự tiếp tục nếu bạn muốn nó trên một dòng để dễ đọc;

Dim clientToTest As String:  clientToTest = clientsToTest(i)
Dim clientString As Variant: clientString = Split(clientToTest)

Gợi ý (tóm tắt các câu trả lời / nhận xét khác): Cũng hoạt động với các đối tượng (Excel 2010):

Dim ws  As Worksheet: Set ws = ActiveWorkbook.Worksheets("Sheet1")
Dim ws2 As New Worksheet: ws2.Name = "test"

13
+1, tôi nhớ Microsoft đã đề xuất trong quá trình tích hợp lên .NET rằng các nhà phát triển VB6 bắt đầu làm điều này để sẵn sàng cho VB.NET.
John M Gant

Đây là khiếu nại lớn nhất của tôi về VBA; Tôi cá rằng sẽ chỉ mất một ngày lập trình viên cơ sở để thêm phím tắt này vào VBA nếu quản lý quan tâm để thêm nó.
Pete Alvin

21

Bạn có thể sắp xếp làm điều đó với các đối tượng, như sau.

Dim w As New Widget

Nhưng không phải với chuỗi hoặc biến thể.


Điều này là không chính xác, như một toàn thể. Bạn có thể khai báo và khởi tạo một biến trên cùng một dòng với bất kỳ kiểu dữ liệu (giá trị hoặc đối tượng) nào, bằng cách tách biệt "hành động" với dấu chấm phẩy :. Có một số hạn chế vì bạn không thể có nhiều khai báo giá trị trên cùng một dòng (nghĩa là var1 = val1: var2 = val2). Nó sẽ sửa lỗi đôi khi và cho phép bạn thực hiện loại bài tập này đôi khi nhưng nói chung không được đề xuất bởi ký hiệu này.
GoldBishop

2
@GoldBishop, vâng, sử dụng dấu hai chấm để kết hợp nhiều câu lệnh thành một dòng duy nhất thường hoạt động (như Alex K. đã nói). Điều tôi đang nói sẽ không hoạt động với chuỗi hoặc biến thể (hoặc có thể với các nguyên thủy khác) là Dim x As New Tcú pháp, chỉ hoạt động với các đối tượng.
John M Gant

yeah sẽ không hoạt động trên dòng Khởi tạo Con Contor nhưng nó sẽ hoạt động với các phép gán Biến và Chuỗi. Tôi sử dụng tất cả thời gian cho các loại giá trị và một số loại đối tượng. dim str as String: str = "value"dim str as Worksheet: set str = ActiveWorkbook.worksheets("Sheet1")cả hai làm việc nhiều lần. Mặc dù, nếu tôi thực hiện khởi tạo đối tượng dim ws as New Worksheet: set ws = ActiveWorkbook.Worksheets("Sheet1")sẽ lỗi như bất kỳ hoạt động không hợp lệ nào khác trong VBA.
GoldBishop

3
Thủ thuật đại tràng hoạt động với các bài tập biến thể và chuỗi. Các Newtừ khóa không. Đó là tất cả những gì tôi đang nói.
John M Gant

2
@JohnMGrant có thể muốn làm rõ câu trả lời của bạn, khi tôi đọc nó, nói rằng: bạn không thể thực hiện gán cùng dòng với khởi tạo hàm tạo và các loại giá trị chuỗi / biến thể. Có thể là một chút bối rối với một số.
GoldBishop

2

trong thực tế, bạn có thể, nhưng không phải theo cách đó.

Sub MySub( Optional Byval Counter as Long=1 , Optional Byval Events as Boolean= True)

'code...

End Sub

Và bạn có thể đặt các biến khác nhau khi gọi phụ hoặc để chúng ở các giá trị mặc định của chúng.


5
Đây là đối số, không phải biến cục bộ.
ivan_pozdeev

1

Trong một số trường hợp, toàn bộ nhu cầu khai báo một biến có thể tránh được bằng cách sử dụng Withcâu lệnh .

Ví dụ,

    Dim fd As Office.FileDialog
    Set fd = Application.FileDialog(msoFileDialogSaveAs)
    If fd.Show Then
        'use fd.SelectedItems(1)
    End If

điều này có thể được viết lại như

    With Application.FileDialog(msoFileDialogSaveAs)
      If .Show Then
        'use .SelectedItems(1)
      End If
    End With

0

Bạn có thể xác định và gán giá trị như hiển thị bên dưới trong một dòng. Tôi đã đưa ra một ví dụ về hai biến được khai báo và gán trong một dòng. nếu kiểu dữ liệu của nhiều biến giống nhau

 Dim recordStart, recordEnd As Integer: recordStart = 935: recordEnd = 946
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.