• DİKKAT

    DOSYA İndirmek/Yüklemek için ÜCRETLİ ALTIN ÜYELİK Gereklidir!
    Altın Üyelik Hakkında Bilgi

Public (Global) Değişken Tanımlama

askm

Destek Ekibi
Destek Ekibi
Katılım
4 Haziran 2005
Mesajlar
2,746
Excel Vers. ve Dili
2010-2016
Kolay gelsin.
Bir modül içerisine
Public i as byte
şeklinde i değişkeni tanımlıyorum.
Bu çalışmakitabı kısmına da aşağıdaki kodları yazıyorum
Kod:
Private Sub Workbook_Open()
i = i + 1
MsgBox i
End Sub
Çalışma kitabı kapanıp açılınca i değişkeni 1 den başlıyor. Bu i değişkeninin çalışma kitabı kapanıp açılsa da devam etmesini sağlama imkanı var mı?
 
Sayaç işlemini bir hücreye,harici bir text dosyasına ya da regedite yazdırmanız daha mantıklı olur.
 
Regedit için örnek kod var mı?
 
Sayın Korhan Bey ve Sayın Asri ilginiz için teşekkür ederim. İlgili siteyi inceliyorum.
Anladığım kadarıyla ilk önce Regeditte bir deger kaydetmem gerek. Bu degeri ne yazabilirim. Örneğin Ali yazmam sıkıntı olur mu? İlk açılışta ali değeri olmadığı için ali değerini oluşturacak, 2 açılışta; ali değeri olduğu için sadece okuyacak. Doğru mu?
 
Bir de bu ali degerini nereye yazıyor regeditte. Aşağıdaki bölümlerden hangisinin altına nereye kaydettiğini belirtmiyor örnek kod.
HKCU or HKEY_CURRENT_USER
HKLM or HKEY_LOCAL_MACHINE
HKCR or HKEY_CLASSES_ROOT
HKEY_USERS
HKEY_CURRENT_CONFIG
 
Alternatif kodlar

Kod:
Sub kaydet()

On Error Resume Next
sayac = GetSetting("sayi", "deger", "sayac", 0)
sayac = sayac + 1
MsgBox "DİKKAT!" & Chr(10) & Chr(10) _
& "Bu proğram  " & sayac & "  kere açılmış.", vbOKOnly, "UYARI"

SaveSetting "sayi", "deger", "sayac", sayac

End Sub

Kod:
Sub oku()
On Error Resume Next
sayac = GetSetting("sayi", "deger", "sayac", 0)
MsgBox "DİKKAT!" & Chr(10) & Chr(10) _
& "Bu proğram  " & sayac & "  kere açılmış.", vbOKOnly, "UYARI"
End Sub

Kod:
Sub sil()
On Error Resume Next
DeleteSetting "sayi", "deger", "sayac"

End Sub
 
Halit hocam bu kod çok pratik. Yalnız kaydı nereye yapıyor.
SaveSetting dediği yer neresi. Nereden okuyor.
 
Kod:
[HKEY_CURRENT_USER\Software\VB and VBA Program Settings\sayi\deger]
"sayac"="4"

buraya yapıyor
 
regedit de (HKEY_CURRENT_USER) bölümünde (VB and VBA Program Settings) arama yaptır.
alt bölümlerde göreceksiniz
 
Allah razı olsun. Teşekkürler hocam.
Asrı Hocam regedıte farklı bir kayıt için verdiğiniz sayfa güzel. Yalnız yukarda sorduğum soru geçerli. Regedıtten bir kayıt silmek ya da değiştirmek istersem bunun yolunu nasıl yazmam gerekiyor.
 
Allah razı olsun. Teşekkürler hocam.
Asrı Hocam regedıte farklı bir kayıt için verdiğiniz sayfa güzel. Yalnız yukarda sorduğum soru geçerli. Regedıtten bir kayıt silmek ya da değiştirmek istersem bunun yolunu nasıl yazmam gerekiyor.

Alternatif;

Kod:
Sub menu()
    sayacnumarasi = sayacoku
    sayacnumarasi = sayacnumarasi + 1
    sayacyaz (sayacnumarasi)
End Sub

Sub sayacyaz(bilgistr As String)

     Dim myWS As Object
     Set myWS = CreateObject("WScript.Shell")
     myWS.RegWrite "HKEY_CURRENT_USER\Software\DenemePrg\Sayac", bilgistr, "REG_SZ"

End Sub

Function sayacoku() As Integer
  If RegKeyExists("HKEY_CURRENT_USER\Software\DenemePrg\Sayac") = True Then
     sayacoku = 0 + (RegKeyRead("HKEY_CURRENT_USER\Software\DenemePrg\Sayac"))
  Else
     Dim myWS As Object
     Set myWS = CreateObject("WScript.Shell")
     myWS.RegWrite "HKEY_CURRENT_USER\Software\DenemePrg\Sayac", "0", "REG_SZ"
     sayacoku = 0
  End If
End Function

Function RegKeyExists(i_RegKey As String) As Boolean
Dim myWS As Object

  On Error GoTo ErrorHandler
  'access Windows scripting
  Set myWS = CreateObject("WScript.Shell")
  'try to read the registry key
  myWS.RegRead i_RegKey
  'key was found
  RegKeyExists = True
  Exit Function
  
ErrorHandler:
  'key was not found
  RegKeyExists = False
End Function


Function RegKeyRead(i_RegKey As String) As String
Dim myWS As Object

  On Error Resume Next
  'access Windows scripting
  Set myWS = CreateObject("WScript.Shell")
  'read key from registry
  RegKeyRead = myWS.RegRead(i_RegKey)
End Function
 
Asri Hocam Allah razı olsun.
myWS.RegWrite "HKEY_CURRENT_USER\Software\DenemePrg\Sayac", bilgistr, "REG_SZ"
kısmının nasıl yazılacağını merak etmiştim.
Çok teşekkür ederim.
Asri Hocam affınıza sığınarak bir soru daha sormak istiyorum.
"HKEY LOCAL MAGIC KISMINDA SOFTWARE- MICROSOFT - WINDOWS NT- CURRENT VERSIYON - ProfileList" ALTINDA "S-1-5-21-1202660629-1993962763-839522115-11267" şeklinde dizinler mevcut. bunlara tıklayınca sağ tarafta değerler çıkıyor. Bu değerlerden ProfileImagePath değerinde "C:\Users\askm" şeklinde değerler mevcut. bu değeri okuyup eğer istediğim ifade ise "S-1-5-21-1202660629-1993962763-839522115-11267" i komple silme imkanı olur mu? Yani kullanıcı profilini silme imkanı olur mu?
 
Asri Hocam Allah razı olsun.
myWS.RegWrite "HKEY_CURRENT_USER\Software\DenemePrg\Sayac", bilgistr, "REG_SZ"
kısmının nasıl yazılacağını merak etmiştim.
Çok teşekkür ederim.
Asri Hocam affınıza sığınarak bir soru daha sormak istiyorum.
"HKEY LOCAL MAGIC KISMINDA SOFTWARE- MICROSOFT - WINDOWS NT- CURRENT VERSIYON - ProfileList" ALTINDA "S-1-5-21-1202660629-1993962763-839522115-11267" şeklinde dizinler mevcut. bunlara tıklayınca sağ tarafta değerler çıkıyor. Bu değerlerden ProfileImagePath değerinde "C:\Users\askm" şeklinde değerler mevcut. bu değeri okuyup eğer istediğim ifade ise "S-1-5-21-1202660629-1993962763-839522115-11267" i komple silme imkanı olur mu? Yani kullanıcı profilini silme imkanı olur mu?

"Eğer istediğim ifade ise" dediğinizde registry arama özelliğini kullanmak lazım. Bunun ile ilgili GetObject("winmgmts: kodu ile arama var ancak benim sürümümde sorun çıkarıyor.

Profil belli ise silme işlemini aşağıdaki şekilde yapabilirsiniz.
DeleteKey e tırnak koydum. Bu işler çok tehlikelidir. Bilgisayarın açılmamasına kadar sorun çıkarabilir.
Sorumluluk tamamen size aittir. :)

Kod:
Public Enum RegistryRootEnum
    rrClassesRoot = &H80000000
    rrCurrentConfig = &H80000005
    rrCurrentUser = &H80000001
    rrDynData = &H80000006
    rrLocalMachine = &H80000002
    rrUsers = &H80000003
End Enum

#If VBA7 Then
   Private Declare PtrSafe Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
   Private Declare PtrSafe Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As Long, phkResult As Long) As Long
   Private Declare PtrSafe Function SHDeleteKey Lib "shlwapi.dll" Alias "SHDeleteKeyA" (ByVal hKey As Long, ByVal pszSubKey As String) As Long
#Else
   Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
   Private Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As Long, phkResult As Long) As Long
   Private Declare Function SHDeleteKey Lib "shlwapi.dll" Alias "SHDeleteKeyA" (ByVal hKey As Long, ByVal pszSubKey As String) As Long
#End If

Sub menu()

    'DeleteKey "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\S-1-5-21-1057239996-948184712-2972324034-1001", rrLocalMachine
End Sub

Public Sub DeleteKey(ByVal Key As String, Optional ByVal Root As RegistryRootEnum = rrCurrentUser)
    Const ERROR_SUCCESS = 0&
    Const KEY_ALL_ACCESS = &H3F
    Dim strKey As String
    Dim lngPos As Long
    Dim lngHandle As Long

    lngPos = InStrRev(Key, "\")
    If lngPos = 0 Then
        strKey = Key
        Key = ""
    Else
        strKey = Mid$(Key, lngPos + 1)
        Key = Left$(Key, lngPos - 1)
    End If
    If RegOpenKeyEx(Root, Key, 0&, KEY_ALL_ACCESS, lngHandle) = ERROR_SUCCESS Then
        SHDeleteKey lngHandle, strKey
        RegCloseKey lngHandle
    End If
End Sub
 
Asri Hocam "S-1-5-21-1057239996-948184712-2972324034-1001" dizini kullanıcı adına göre değişken oluyor. Bu nedenle bu dizinin içerisine girip "ProfileImagePath" adının karşısındaki "C:\Users\askm" ifadesine bakmak gerekiyor. bu ifadeyi okutup örneğin A1 hücresine yazdığımız değer ile aynı ise "'DeleteKey "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\S-1-5-21-1057239996-948184712-2972324034-1001", rrLocalMachine" komutunu çalıştırması gerek. Yoksa her bilgisayar ve her kullanıcı için ayrı kod yazmak gerekir.
Yani bir döngü ile ""HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\" içerisindeki dizinleri kontrol edecek. Eğer "ProfileImagePath.name=Range("A1" ise delete işlemi yapacak.
 
Asri Hocam "S-1-5-21-1057239996-948184712-2972324034-1001" dizini kullanıcı adına göre değişken oluyor. Bu nedenle bu dizinin içerisine girip "ProfileImagePath" adının karşısındaki "C:\Users\askm" ifadesine bakmak gerekiyor. bu ifadeyi okutup örneğin A1 hücresine yazdığımız değer ile aynı ise "'DeleteKey "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\S-1-5-21-1057239996-948184712-2972324034-1001", rrLocalMachine" komutunu çalıştırması gerek. Yoksa her bilgisayar ve her kullanıcı için ayrı kod yazmak gerekir.
Yani bir döngü ile ""HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\" içerisindeki dizinleri kontrol edecek. Eğer "ProfileImagePath.name=Range("A1" ise delete işlemi yapacak.

"dediğinizde registry arama özelliğini kullanmak lazım. Bunun ile ilgili GetObject("winmgmts: kodu ile arama var ancak benim sürümümde sorun çıkarıyor."

Onun bende farkındayım da nasıl? Sorusunun cevabını bulmak lazım :)
 
Asri hocam çok teşekkür ederim. GetObject komutunu araştırayım.
 
Geri
Üst