Renato z Włoch pyta:
Jak mogę otworzyć skoroszyt w VBA wybierając z listy? Kiedy nagrywam makro, na stałe koduje nazwę wybranego pliku w makrze.
W języku VBA znajduje się polecenie o nazwie GetOpenFileName. Wyświetla okno Otwórz plik. Możesz przejść do katalogu, wybrać plik, a następnie kliknąć Otwórz. W tym momencie polecenie nie otwiera pliku, a jedynie przekazuje nazwę z powrotem do programu. Oto przykład używanego kodu:
Sub TestIt() NewFN = Application.GetOpenFilename(FileFilter:="Excel Files (*.xls), *.xls", Title:="Please select a file") If NewFN = False Then ' They pressed Cancel MsgBox "Stopping because you did not select a file" Exit Sub Else Workbooks.Open Filename:=NewFN End If End Sub
Roger pyta:
Jak mogę uruchomić makro przed zamknięciem lub zapisaniem pliku?
Makro należy wprowadzić w okienku kodu skojarzonym z „ThisWorkbook”. Z menu po prawej stronie wybierz BeforeClose lub BeforeSave.
Ken pisze:
Mam program obsługi zdarzeń arkusza, który zapętla się co najmniej 16 razy. Co się dzieje?
Program obsługi Kena był prosty - jeśli wpis byłby nienumeryczny, zmieniłby wpis na wielkie litery. Tu jest problem. Kiedy zmienił wartość wpisu na wielkie litery, oznacza to kolejną zmianę w arkuszu i zdarzenie uruchomi się ponownie. Za każdym razem, gdy uruchamiane było zdarzenie zmiany, Ken zmieniał arkusz, a makro było wywoływane rekurencyjnie, aż w stosie wywołań zabrakło pamięci.
Rozwiązaniem jest tymczasowe zatrzymanie uruchamiania zdarzeń podczas zmiany wartości na wielkie litery. Możesz to zrobić, zmieniając wartość Application.EnableEvents na False. Oto poprawione makro:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Excel.Range) If Not IsNumeric(Target.Value) Then Application.EnableEvents = False Target.Value = UCase(Target.Value) Application.EnableEvents = True End If End Sub
Andy z Wielkiej Brytanii zadaje dziś najciekawsze pytanie.
Mam program VBA w jednym skoroszycie, który tworzy kilka innych skoroszytów. Chciałbym móc dynamicznie dodawać hiperłącze do każdego nowego skoroszytu, które będzie wskazywało z powrotem do skoroszytu, który wygenerował nowe skoroszyty.
Andy - to fajny pomysł. Bez korzyści z zobaczenia twojego kodu mogę sobie wyobrazić, że coś takiego zadziałałoby:
Sub Testit() Creator = ActiveWorkbook.FullName '… . Andy's code to create the new workbook… . ActiveSheet.Hyperlinks.Add Anchor:=Range("A1"), Address:= _ Creator, TextToDisplay:="Click Here to Return to " & Creator End Sub