2008-10-07 38 views
19

Excel ile VBA'da bir hücreye tıklamak için bir yol var mı? Worksheet_SelectionChange olayına başvurmuyorum, çünkü hücrenin birden çok kez tıklanması durumunda birden çok kez tetiklenmeyecektir. BeforeDoubleClick benim de sorunumu çözmüyor, çünkü kullanıcının buna uygun olarak çift tıklamasını istemiyorum.OnClick in Excel VBA

Geçerli çözümüm, SelectionChange olayıyla çalışır, ancak genel değişkenlerin ve diğer alt uygulama kodlama uygulamalarının kullanılmasını gerektirir. Ayrıca hataya eğilimli görünüyor.

cevap

18

Açıkçası, mükemmel bir yanıt yoktur.Ancak,

  1. kullanıcı
  2. onları bu hücreleri, ve
  3. tuzak her bir tıklama, hatta tekrarlanan tıklamalar aynı hücre üzerinde değiştirmesine izin belirli hücreleri seçmek izin vermek istiyorsanız

o zaman en kolay yol odağı seçili hücrenin dışına taşımaktır, böylece tıklatıldığında bir Select olayı tetiklenir.

Bir seçenek, yukarıda önerdiğim şekilde odağı taşımaktır, ancak bu, hücre düzenlemesini engeller. Başka bir seçenek, seçimin bir hücre tarafından (sol/sağ/yukarı/aşağı) genişletilmesidir, çünkü bu, orijinal hücrenin düzenlenmesine izin verir, ancak bu hücre tekrar tek başına tıklandığında bir Select olayını tetikler.

Yalnızca tek bir hücre sütununun seçimini yakalamak istediğinizde, sağ tarafa gizli bir sütun ekleyebilir, kullanıcı tıklatıldığında gizli hücreyi sağa eklemek için seçimi genişletebilir ve bu size düzenlenebilir bir seçenek sunar. her tıklandığında yakalanabilen hücre. Bu benim için çalıştı

Private Sub Worksheet_SelectionChange(ByVal Target As Range) 
    'prevent Select event triggering again when we extend the selection below 
    Application.EnableEvents = False 
    Target.Resize(1, 2).Select 
    Application.EnableEvents = True 
End Sub 
+0

Mükemmel, teşekkürler :) – haslo

0

Sanırım öyle değil. Ancak bir şekil nesnesini (ya da benzer bir şeyi) oluşturabilirsiniz. Tıklatın olayı ve nesneyi belirtilen hücrenin konumuna getirin.

+0

Hm, bununla ilgili olan şey, hangi hücrenin yakalanacağını ve yakalanmak istediğim çizgi ile birlikte yakalamak istediğim sıralı sayıda çizgiye sahip olmak (SelectionChange bana güzel bir menzile sahip olmak). Bunun için ... – haslo

+0

Kullanıcı, sayfayı kolayca düzenleyebilmeli, "bu düğmeyi tıklamanız gerekecek, elle yeni bir satır ekleyecekseniz işe yaramayacak". Ama kesinlikle emin değilim gerçekten hiçbir şekilde (VBA henüz beni şaşırtmak değil), ben de resmen cevap olarak kabul edebilirim ... – haslo

1

SelectionChange, bunun için Excel Nesne modelinde yerleşik olan olaydır. Kullanıcının istediği zaman istediği zaman ateş etmesini sağlar ...

Burada global değişkenlere yönelik itirazlarınızı anladığımdan emin değilim, Application.SelectionChange olayını kullanırsanız sadece 1'e ihtiyacınız olacaktır. . Ancak, Workbook sınıf kodunu (Workbook.SelectionChange olayı kapmak için) veya çalışma sayfası sınıf kodunu (Worksheet.SelectionChange) olayının arkasında tutmak için kullanmanız gerekmez. (Sorununuz VBA'daki "global değişken sıfırlama" problemi olmadığı sürece, bunun için tek bir çözüm var: her yerde hata işleniyor. İşlenmemiş hatalara izin vermeyin, bunun yerine bunları günlüğe kaydedin ve/veya bir hatayı "soft-report" olarak bildirin user (kullanıcı) kutusu.

Ayrıca, Çalışma Sayfası.Activate() ve Worksheet.Deactivate() olaylarını (veya Workbook sınıfındaki karşılığı) ve/veya Workbook.Activate ve Workbook.Deactivate öğelerini de yakalamanız gerekebilir () olayları, kullanıcının çalışma sayfalarını ve/veya çalışma kitaplarını değiştirdiğinde bilmesini sağlayın. Pencereyi etkinleştirme ve devre dışı bırakma etkinlikleri bu yaklaşımı tamamlamalıdır. Hepsi aynı kesin prosedürü arayabilirler, ancak hepsi aynı şeyi gösterir: Kullanıcı yapacak olursanız, kullanıcı “odağı” değiştirdi.

VBA'dan hoşlanmıyorsanız, btw, VB.NET veya C# kullanarak aynısını yapabilirsiniz.

[Düzenle: Dbb, kullanıcı seçili olan hücre içinde tıklattığında bir tıklama almamak üzere SelectionChange olayı hakkında çok iyi bir nokta oluşturur. Bunu almak gerekiyorsa, o zaman subclassing kullanmak gerekir.] tuzak amacıyla

+0

Küresel Değişkenler sadece çirkin, hepsi bu :) Bu yüzden burada bir neden kullanıyorum özellikle, olay işleme sırasında satırları başka bir sayfaya kopyalayıp yapıştırma sırasında da değiştirdim. Gerçekten çok küçük bir uygulama, VB.NET veya C# (onları çok daha iyi iken) biraz üstündedir. – haslo

+0

Bunun dışında, çok iyi bir anlayış, teşekkürler! – haslo

5

aynı hücre üzerinde tıklama tekrarlanan her zaman tıklayın, böylece Farklı bir hücreye odağı taşımak gerekir Aslında seçimi taşıyorsunuz.

Aşağıdaki kod, herhangi bir hücreye tıkladığınızda ekranda görünen sol üstteki hücreyi seçecektir. Açıkçası, sol üst hücrede bir tıklamayı yakalamadığı, ancak bunun yönetilebildiği (örneğin, harekete geçirici üst sol ise üst sağ hücreyi seçerek) kusurları vardır.

Private Sub Worksheet_SelectionChange(ByVal Target As Range) 
    'put your code here to process the selection, then.. 
    ActiveWindow.VisibleRange.Cells(1, 1).Select 
End Sub 
+1

Bu, yapmanız gereken tek şey tıklama almaksa ÇOK iyi bir fikir. Ancak, kullanıcının aynı zamanda bir hücre değerini, vb. Düzenleyebilmesi gerekiyorsa, o zaman bu bir hareket etmeyecektir. (Olmasa bile, v. Kafa karıştırıcı olabilir.) SelectionChange hakkında bir "aynı hücre" tıklaması değil, ancak; Onu özledim. –

0

.....

Private Sub Worksheet_Change(ByVal Target As Range) 

    If Mid(Target.Address, 3, 1) = "$" And Mid(Target.Address, 2, 1) < "E" Then 
     ' The logic in the if condition will filter for a specific cell or block of cells 
     Application.ScreenUpdating = False 
     'MsgBox "You just changed " & Target.Address 

     'all conditions are true .... DO THE FUNCTION NEEDED 
     Application.ScreenUpdating = True 
    End If 
    ' if clicked cell is not in the range then do nothing (if condttion is not run) 
End Sub 

NOT kodu şöyledir: Bir kullanıcı bir veri aralığında bir öğe ekledi eğer gerçek kullanımda bu fonksiyon bir pivot tablo yeniden hesaplanır A4'ten D500'e. Orada korumalı ve edildi tıklama için gerçek çek sütunu alanlardan herhangi sayısını dahil veya hariç tutmak istediğiniz gibi "E" mantığı gibi karmaşık alabilirsiniz azdır yani eğer sayfasında korumasız bölümler

block1 = row > 3 and row < 5 and column column >"b" and < "d" 
block2 = row > 7 and row < 12 and column column >"b" and < "d" 
block3 = row > 10 and row < 15 and column column >"e" and < "g" 

If block1 or block2 or block 3 then 
    do function ..... 
end if