Messagebox OK göstermeme

Katılım
30 Nisan 2019
Mesajlar
3
Excel Vers. ve Dili
ingilizce
Merhaba Arkadaşlar,
Sorum şu normalde bunu nasıl yapacağımı biliyorum ama ben Messagebox'u 2'sn ekranda tuttuktan sonra otomatik kapatma uyguladım ve sorunsuz çalışıyor.
Ama Ben Şunu Kullandım;
If MesajGoster = "Start Macro" Then
MesajIcerik = "Makro başlatıldı." & vbNewLine & vbLf & "2 Saniye sonra otomatik kapanacaktır.": MesajBaslik = "Makro İşlemi"
Call CustomTimeOffMsgBox(0, MesajIcerik, MesajBaslik, vbInformation, 0, 2000)
MesajGoster = ""
End If

Yani Button Name "Start Macro" ise devreye giriyor ve işlemi yapıyor. otomatik kapanacağı için Messagebox'ın altında OK yazısını istemiyorum
Bu konuda bana yardımcı olabilecek arkadaş varsa sevinirim.
Kolay Gelsin

CustomTimeOffMsgBox Kullanan vardır diye düşünüyorum
 

mustafa1205

Altın Üye
Katılım
23 Ekim 2010
Mesajlar
1,399
Excel Vers. ve Dili
Office 2016 / 64 Bit - Türkçe
Altın Üyelik Bitiş Tarihi
18-07-2026
UserForm ile Butonsuz Otomatik Kapanan Mesaj

Bu yöntem, senin istediğin gibi bir “bilgi mesajı” oluşturur; hiçbir buton içermez, 2 saniye sonra kendiliğinden kapanır.
🔧 Adımlar:

  1. VBA’da bir UserForm ekle (örneğin adı frmMesaj olsun).
  2. İçine bir Label (Label1) ekle ve genişliğini mesajın sığacağı kadar yap.
  3. Aşağıdaki kodu forma yapıştır:


Private Sub UserForm_Activate()
Application.Wait (Now + TimeValue("0:00:02"))
Unload Me
End Sub



Şu kodla bu formu istediğin yerden çağırabilirsiniz


Sub ButonsuzMesaj()
With frmMesaj
.Label1.Caption = "Makro başlatıldı." & vbCrLf & "2 saniye sonra otomatik kapanacaktır."
.Caption = "Makro İşlemi"
.Show vbModeless 'Modeless => kullanıcıyı kilitlemez
End With
End Sub

Böylece sadece bilgi amaçlı bir pencere çıkar, kullanıcı hiçbir şey tıklamaz, 2 saniye sonra kendi kapanır.
 
Katılım
30 Nisan 2019
Mesajlar
3
Excel Vers. ve Dili
ingilizce
Teşekkürler ama ben zaten bunu yaptığımı söylemiştim. 2sn sonra zaten kapanıyor. benim istediğim mesaagebox geldiği zaman altında OK yazmaması. Yine de teşekkürler
 
Katılım
30 Nisan 2019
Mesajlar
3
Excel Vers. ve Dili
ingilizce
UserForm ile Butonsuz Otomatik Kapanan Mesaj

Bu yöntem, senin istediğin gibi bir “bilgi mesajı” oluşturur; hiçbir buton içermez, 2 saniye sonra kendiliğinden kapanır.
🔧 Adımlar:

  1. VBA’da bir UserForm ekle (örneğin adı frmMesaj olsun).
  2. İçine bir Label (Label1) ekle ve genişliğini mesajın sığacağı kadar yap.
  3. Aşağıdaki kodu forma yapıştır:


Private Sub UserForm_Activate()
Application.Wait (Now + TimeValue("0:00:02"))
Unload Me
End Sub



Şu kodla bu formu istediğin yerden çağırabilirsiniz


Sub ButonsuzMesaj()
With frmMesaj
.Label1.Caption = "Makro başlatıldı." & vbCrLf & "2 saniye sonra otomatik kapanacaktır."
.Caption = "Makro İşlemi"
.Show vbModeless 'Modeless => kullanıcıyı kilitlemez
End With
End Sub

Böylece sadece bilgi amaçlı bir pencere çıkar, kullanıcı hiçbir şey tıklamaz, 2 saniye sonra kendi kapanır.
Teşekkürler ama ben zaten bunu yaptığımı söylemiştim. 2sn sonra zaten kapanıyor. benim istediğim mesaagebox geldiği zaman altında OK yazmaması. Yine de teşekkürler
 

volki_112

Altın Üye
Katılım
29 Eylül 2023
Mesajlar
771
Excel Vers. ve Dili
2019 Türkçe
Altın Üyelik Bitiş Tarihi
13-12-2029
Teşekkürler ama ben zaten bunu yaptığımı söylemiştim. 2sn sonra zaten kapanıyor. benim istediğim mesaagebox geldiği zaman altında OK yazmaması. Yine de teşekkürler
hocam siz msg box ile yapmışssınız. 2 nolu mesajda arkadaşın önerdiği yöntem msg box ile değil. userform ile yapılması. userform ile yaparsanız ekrana msgbox gibi bir pencere gelir. bu pencerede ok yazmaz zaten 2sn sonra pencere kapansın dersiniz. resimdeki örnek gibi259525
 
Katılım
20 Ekim 2005
Mesajlar
499
s.a.

Excel VBA'da butonsuz bir MsgBox (ileti kutusu) oluşturulabilir, ancak doğrudan standart MsgBox fonksiyonu ile butonsuz bir ileti kutusu yapmak mümkün değildir, çünkü MsgBox varsayılan olarak en az bir düğme (genellikle "Tamam") içerir.

Windows API ile tamamen butonsuz bir mesaj kutusu oluşturabilirsiniz, ancak bu daha karmaşıktır ve platforma özgüdür. MessageBoxTimeout gibi bir API fonksiyonu kullanarak belirli bir süre sonra otomatik kapanan bir mesaj kutusu yapabilirsiniz.

Kod:
Declare PtrSafe Function MessageBoxTimeout Lib "user32" Alias "MessageBoxTimeoutA" ( _

    ByVal hwnd As LongPtr, _

    ByVal lpText As String, _

    ByVal lpCaption As String, _

    ByVal uType As Long, _

    ByVal wLanguageId As Long, _

    ByVal dwMilliseconds As Long) As Long

Sub ShowTimedMessageBox()

    MessageBoxTimeout 0, "Bu bir butonsuz mesaj kutusu!", "Bilgi", 0, 0, 2000 ' 2 saniye

End Sub
 

Zeki Gürsoy

Uzman
Uzman
Katılım
31 Aralık 2005
Mesajlar
4,399
Excel Vers. ve Dili
Office 365 (64 bit) - Türkçe
WinAPI ile bir mesaj kutusunun butonu "Disable" ya da "Invisible" yapılabilir. Görsellini aşağıda verdim...

Şimdi soru şu: Basit bir UserForm ile bunu saniyeler içinde yapmak varken, WinAPI dökümanlarını okuyup yorumlamak gibi meşakkatli bir işe girişmek gerçekten gerekli mi? Diğer bir sorun, bu pencere ile kod çalışmaya ara verir. Makro kodu durduğu bu sırada, buton handle'ını tespit edip efekt uygulamak ayrı bir zahmet...

259588

259589

.
 

Zeki Gürsoy

Uzman
Uzman
Katılım
31 Aralık 2005
Mesajlar
4,399
Excel Vers. ve Dili
Office 365 (64 bit) - Türkçe
Üstteki mesajı yolladıktan sonra, geçtiğimiz günlerde tartışma konusu olan yapay zekaya kod yazdırma fikri aklıma geldi...

Ne yapmanız ve ne yazmanız gerektiğini biliyorsanız, yazılımcı diliyle yapay zekaya sorduğunuzda doğru sonuç alabilme şansınız yüksek. Bu sizi bilgisiz yapmaz; size zaman kazandırır. Eğer gelen kodlarda aksaklık varsa, bunu bilginizle düzeltirsiniz

Aşağıda, test edip çalıştırdığım yapay zeka kodlarını aynen ekliyorum. Standart modulde kullanmalısınız

C#:
Option Explicit

'--- API Deklarasyonları (64-bit uyumlu) ---

' Pencere bulma ve yönetme
Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
Private Declare PtrSafe Function EnumChildWindows Lib "user32" (ByVal hWndParent As LongPtr, ByVal lpEnumFunc As LongPtr, ByVal lParam As LongPtr) As Boolean
Private Declare PtrSafe Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As LongPtr, ByVal lpString As String, ByVal cch As Long) As Long
Private Declare PtrSafe Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As LongPtr, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long

' Pencere stilini değiştirmek için
Private Declare PtrSafe Function GetWindowLong Lib "user32" Alias "GetWindowLongPtrA" (ByVal hwnd As LongPtr, ByVal nIndex As Long) As LongPtr
Private Declare PtrSafe Function SetWindowLong Lib "user32" Alias "SetWindowLongPtrA" (ByVal hwnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As LongPtr) As LongPtr

' Asenkron timer için
Private Declare PtrSafe Function SetTimer Lib "user32" (ByVal hwnd As LongPtr, ByVal nIDEvent As LongPtr, ByVal uElapse As Long, ByVal lpTimerFunc As LongPtr) As LongPtr
Private Declare PtrSafe Function KillTimer Lib "user32" (ByVal hwnd As LongPtr, ByVal nIDEvent As LongPtr) As Boolean

'--- API Sabitleri ---
Private Const GWL_STYLE As Long = -16
Private Const WS_VISIBLE As Long = &H10000000

'--- Global Değişkenler ---
' Timer ve arama işlemleri için modül seviyesinde değişkenler
Private g_sMsgBoxTitle As String
Private g_sButtonToHide As String
Private g_TimerID As LongPtr

'==============================================
' ANA TEST PROSEDÜRÜ
'==============================================
Public Sub HideMsgBoxButton_Test()
    ' Gizlenecek butonun metni (İşletim sistemi diline göre değişir)
    ' İngilizce OS için: "Cancel", "No", "OK"
    ' Türkçe OS için: "İptal", "Hayır", "Tamam"
    g_sButtonToHide = "Tamam"
    
    ' Bulunacak MsgBox'ın başlığı
    g_sMsgBoxTitle = "API Buton Gizleme Testi"
    
    ' Timer'ı kur. 10 milisaniye sonra TimerProc'u çalıştır.
    ' Bu süre MsgBox'ın ekrana gelmesi için yeterlidir.
    g_TimerID = SetTimer(0, 0, 10, AddressOf TimerProc)
    
    ' Timer kurulduktan HEMEN SONRA MsgBox'ı çağır.
    ' Kod burada duraklayacak, ancak timer arka planda çalışacak.
    Dim response As VbMsgBoxResult
    response = MsgBox("Tamam butonu birazdan gizlenecek.", vbOKOnly, g_sMsgBoxTitle)
    
    ' Timer'ın düzgün kapatıldığından emin ol (genelde TimerProc içinde yapılır)
    If g_TimerID <> 0 Then
        KillTimer 0, g_TimerID
        g_TimerID = 0
    End If
    
    ' Kullanıcının seçimini göster
    Debug.Print "Kullanıcı seçimi: " & response
End Sub

'==============================================
' TIMER CALLBACK PROSEDÜRÜ
'==============================================
' Bu fonksiyon, SetTimer tarafından belirlenen süre (10ms) sonunda
' Windows tarafından çağrılır. MsgBox modal olsa bile bu kod çalışır.
'
Private Sub TimerProc(ByVal hwnd As LongPtr, ByVal uMsg As Long, ByVal idEvent As LongPtr, ByVal dwTime As Long)
    ' Timer'ı hemen durdur, sadece bir kez çalışması gerekiyor.
    KillTimer 0, g_TimerID
    g_TimerID = 0
    
    Dim hwndMsgBox As LongPtr
    
    ' MsgBox penceresini başlığına ve sınıfına göre bul.
    ' Standart MsgBox sınıfı "#32770" (Dialog) dur.
    hwndMsgBox = FindWindow("#32770", g_sMsgBoxTitle)
    
    If hwndMsgBox <> 0 Then
        ' Pencere bulunduysa, içindeki alt pencereleri (butonları)
        ' bulmak için EnumChildWindows'u çağır.
        ' EnumChildProc fonksiyonunu adres olarak gösteriyoruz.
        EnumChildWindows hwndMsgBox, AddressOf EnumChildProc, 0
    End If
End Sub

'==============================================
' ENUMERATION CALLBACK PROSEDÜRÜ
'==============================================
' Bu fonksiyon, EnumChildWindows tarafından bulunan HER alt pencere
' (buton, label vb.) için ayrı ayrı çağrılır.
'
Private Function EnumChildProc(ByVal hwndChild As LongPtr, ByVal lParam As LongPtr) As Boolean
    Dim sClass As String * 256
    Dim sText As String * 256
    Dim lClassLen As Long, lTextLen As Long
    
    ' 1. Alt pencerenin sınıfını (class) al
    lClassLen = GetClassName(hwndChild, sClass, 256)
    
    ' Sadece "Button" sınıfındakilerle ilgileniyoruz
    If Left(sClass, lClassLen) = "Button" Then
        
        ' 2. Butonun metnini (caption) al
        lTextLen = GetWindowText(hwndChild, sText, 256)
        
        ' 3. Buton metni, global değişkende sakladığımız metinle eşleşiyor mu?
        If Left(sText, lTextLen) = g_sButtonToHide Then
            
            ' Eşleşme bulundu. Butonu gizle.
            '
            ' YÖNTEM: Pencere stilini değiştirme (istediğiniz gibi)
            Dim style As LongPtr
            style = GetWindowLong(hwndChild, GWL_STYLE)
            
            ' WS_VISIBLE bit'ini stilden çıkarmak için AND (Not ...) kullanılır.
            SetWindowLong hwndChild, GWL_STYLE, style And (Not WS_VISIBLE)
            
            ' (Alternatif olarak ShowWindow(hwndChild, SW_HIDE = 0) da kullanılabilirdi)

            ' Aramayı durdurmak için False döndür
            EnumChildProc = False
            Exit Function
        End If
    End If
    
    ' Aramaya devam etmek için True döndür
    EnumChildProc = True
End Function
.
 
Üst