Bagaimana cara mendeklarasikan variabel global dalam VBA?

132

Saya menulis kode berikut:

Function find_results_idle()

    Public iRaw As Integer
    Public iColumn As Integer
    iRaw = 1
    iColumn = 1

Dan saya mendapatkan pesan kesalahan:

"atribut tidak valid di Sub atau Fungsi"

Apakah Anda tahu apa yang saya lakukan salah?

Saya mencoba menggunakan Globalbukan Public, tetapi mendapat masalah yang sama.

Saya mencoba menyatakan fungsi itu sendiri sebagai `Publik, tetapi itu juga tidak ada gunanya.

Apa yang harus saya lakukan untuk membuat variabel global?

Nimrod
sumber

Jawaban:

177

Anda perlu mendeklarasikan variabel di luar fungsi:

Public iRaw As Integer
Public iColumn As Integer

Function find_results_idle()
    iRaw = 1
    iColumn = 1
Slaks
sumber
Ketika saya mencoba mendeklarasikan sebuah array sebagai publik dikatakan: array dan tipe data yang ditentukan pengguna tidak dapat dideklarasikan sebagai publik.
kapilddit
Di atas yang pertama Function/ Sub, tidak hanya di luar: "Variabel tingkat modul dapat dideklarasikan dengan pernyataan Redup atau Pribadi di bagian atas modul di atas definisi prosedur pertama." (dari Cakupan variabel dalam Visual Basic for Applications )
Nickolay
119

Ini adalah pertanyaan tentang ruang lingkup .

Jika Anda hanya ingin variabel bertahan seumur hidup dari fungsi, gunakan Dim(kependekan dari Dimensi ) di dalam fungsi atau sub untuk mendeklarasikan variabel:

Function AddSomeNumbers() As Integer
    Dim intA As Integer
    Dim intB As Integer
    intA = 2
    intB = 3
    AddSomeNumbers = intA + intB
End Function
'intA and intB are no longer available since the function ended

Sebuah global yang variabel (seperti SLaks menunjukkan) dinyatakan di luar fungsi menggunakan Publickata kunci. Variabel ini akan tersedia selama aplikasi berjalan Anda. Dalam kasus Excel, ini berarti variabel akan tersedia selama buku kerja Excel tertentu terbuka.

Public intA As Integer
Private intB As Integer

Function AddSomeNumbers() As Integer
    intA = 2
    intB = 3
    AddSomeNumbers = intA + intB
End Function
'intA and intB are still both available.  However, because intA is public,  '
'it can also be referenced from code in other modules. Because intB is private,'
'it will be hidden from other modules.

Anda juga dapat memiliki variabel yang hanya dapat diakses dalam modul (atau kelas) tertentu dengan mendeklarasikannya dengan Privatekata kunci.

Jika Anda membuat aplikasi besar dan merasa perlu menggunakan variabel global, saya akan merekomendasikan membuat modul terpisah hanya untuk variabel global Anda. Ini akan membantu Anda melacak mereka di satu tempat.

Ben McCormack
sumber
4
+1 Masih bermanfaat 7 tahun kemudian. Tapi apakah ada nuansa tambahan tentang variabel objek versus variabel data? Saya mengalami masalah terkait dengan pelingkupan variabel objek yang memicu pertanyaan baru. Sangat dihargai jika Anda memiliki waktu untuk melihatnya. stackoverflow.com/q/46058096/5457466
Egalth
2
Penjelasan singkat tentang deklarasi variabel dalam VBA.
PhillipOReilly
Saya mencoba semua saran lain tentang "ruang lingkup" dan tidak ada yang berhasil. Satu-satunya hal yang berfungsi adalah Modul baru khusus untuk vars global dan berfungsi!
Fandango68
18

Pertanyaannya sebenarnya tentang ruang lingkup, seperti yang dikatakan orang lain.

Singkatnya, pertimbangkan "modul" ini:

Public Var1 As variant     'Var1 can be used in all
                           'modules, class modules and userforms of 
                           'thisworkbook and will preserve any values
                           'assigned to it until either the workbook
                           'is closed or the project is reset.

Dim Var2 As Variant        'Var2 and Var3 can be used anywhere on the
Private Var3 As Variant    ''current module and will preserve any values
                           ''they're assigned until either the workbook
                           ''is closed or the project is reset.

Sub MySub()                'Var4 can only be used within the procedure MySub
    Dim Var4 as Variant    ''and will only store values until the procedure 
End Sub                    ''ends.

Sub MyOtherSub()           'You can even declare another Var4 within a
    Dim Var4 as Variant    ''different procedure without generating an
End Sub                    ''error (only possible confusion). 

Anda dapat memeriksa referensi MSDN ini untuk informasi lebih lanjut tentang deklarasi variabel dan Pertanyaan Stack Overflow lainnya untuk mengetahui lebih lanjut tentang bagaimana variabel keluar dari ruang lingkup.

Dua hal cepat lainnya:

  1. Terorganisir saat menggunakan variabel level buku kerja, sehingga kode Anda tidak membingungkan. Lebih suka fungsi (dengan tipe data yang tepat) atau melewati argumen ByRef .
  2. Jika Anda ingin variabel mempertahankan nilainya di antara panggilan, Anda dapat menggunakan pernyataan Statis .
FCastro
sumber
Apakah Anda yakin bahwa variabel Global dapat digunakan di buku kerja yang berbeda? Tidak bekerja untuk saya
Seb
Poin bagus! Saya perhatikan saya tidak menambahkan referensi di mana saya mendapatkan informasi itu ... Saya juga tidak menemukannya lagi. Lebih baik mengedit jawabannya ...: / Oh, dan terima kasih Seb.
FCastro
14

Jika fungsi ini ada dalam modul / kelas, Anda bisa menuliskannya di luar fungsi, jadi sudah Global Scope. Lingkup Global berarti variabel dapat diakses oleh fungsi lain di modul / kelas yang sama (jika Anda menggunakan dimsebagai pernyataan deklarasi, gunakan publicjika Anda ingin variabel dapat diakses oleh semua fungsi di semua modul):

Dim iRaw As Integer
Dim iColumn As Integer

Function find_results_idle()
    iRaw = 1
    iColumn = 1
End Function

Function this_can_access_global()
    iRaw = 2
    iColumn = 2
End Function
Zai
sumber
1

Buat bilangan bulat publik dalam Deklarasi Umum.

Kemudian dalam fungsi Anda, Anda dapat meningkatkan nilainya setiap kali. Lihat contoh (berfungsi untuk menyimpan lampiran email sebagai CSV).

Public Numerator As Integer

Public Sub saveAttachtoDisk(itm As Outlook.MailItem)
Dim objAtt As Outlook.Attachment
Dim saveFolder As String
Dim FileName As String

saveFolder = "c:\temp\"

     For Each objAtt In itm.Attachments
            FileName = objAtt.DisplayName & "_" & Numerator & "_" & Format(Now, "yyyy-mm-dd H-mm-ss") & ".CSV"
                      objAtt.SaveAsFile saveFolder & "\" & FileName
                      Numerator = Numerator + 1

          Set objAtt = Nothing
     Next
End Sub
Dan Bidner
sumber
0

Cara yang baik untuk membuat variabel Publik / Global adalah dengan memperlakukan Formulir seperti objek kelas dan mendeklarasikan properti dan menggunakan Public Property Get [variabel] untuk mengakses properti / metode. Anda juga mungkin perlu referensi atau meneruskan Referensi ke modul Formulir instantiated. Anda akan mendapatkan kesalahan jika Anda memanggil metode ke formulir / laporan yang ditutup.
Contoh: lulus Me.Form.Module.Parent ke dalam sub / fungsi tidak di dalam formulir.

Option Compare Database 
Option Explicit
''***********************************''
' Name: Date: Created Date Author: Name 
' Current Version: 1.0
' Called by: 
''***********************************''
' Notes: Explain Who what when why... 
' This code Example requires properties to be filled in 
''***********************************''
' Global Variables
Public GlobalData As Variant
''***********************************''
' Private Variables
Private ObjectReference As Object
Private ExampleVariable As Variant
Private ExampleData As Variant
''***********************************''
' Public properties
Public Property Get ObjectVariable() As Object
   Set ObjectVariable = ObjectReference
End Property 
Public Property Get Variable1() As Variant 
  'Recommend using variants to avoid data errors
  Variable1 = ExampleVariable
End property
''***********************************''
' Public Functions that return values
Public Function DataReturn (Input As Variant) As Variant
   DataReturn = ExampleData + Input
End Function 
''***********************************''
' Public Sub Routines
Public Sub GlobalMethod() 
   'call local Functions/Subs outside of form
   Me.Form.Refresh
End Sub
''***********************************''
' Private Functions/Subs used not visible outside 
''***********************************''
End Code

Jadi di modul lain Anda akan dapat mengakses:

Public Sub Method1(objForm as Object)
   'read/write data value
   objForm.GlobalData
   'Get object reference (need to add Public Property Set to change reference object)
   objForm.ObjectVariable
   'read only (needs Public property Let to change value)
   objForm.Variable1
   'Gets result of function with input
   objForm.DataReturn([Input])
   'runs sub/function from outside of normal scope
   objForm.GlobalMethod
End Sub

Jika Anda menggunakan Late Binding seperti saya selalu memeriksa nilai Null dan objek yang tidak ada sebelum mencoba melakukan pemrosesan apa pun.

CPU E Ganda
sumber
0

Anda juga dapat menggunakan -

Private Const SrlNumber As Integer = 910

Private Sub Workbook_Open()
    If SrlNumber > 900 Then
        MsgBox "This serial number is valid"
    Else
        MsgBox "This serial number is not valid"
    End If
End Sub

Ini diuji di kantor 2010

IshaniNet
sumber