konto usunięte

Temat: Czy makro może zaczekać aż arkusz się przeliczy?

Przygotowałem makro, które dokonuje edycji danych w tabeli zawierającej przeszło 7 tys. rekordów. Następnie na tej tabeli wykonywane są pewne obliczenia, które trwają dłuuuuuuuższą chwilę z racji objętości tabeli. Na pasku stanu przez kilkadziesiąt sekund widać komunikat 'Obliczanie'. Następnie makro powinno wykonać kolejne polecenia, np. kopiuj / wklej wartości. I tu brakuje mi wiedzy: czy istnieje możliwość uzależninia wykonywania kolejnych poleceń makra od zakończenia 'Obliczania'?
Tomasz Gryzio

Tomasz Gryzio Dyrektor
zarządzający/Trener/
Konsultant - It
School

Temat: Czy makro może zaczekać aż arkusz się przeliczy?

Witam,

Jeśli przeliczenie zostanie wywołane metodą Calculate (np. Worksheets(1).Rows(2).Calculate), to makro przejdzie do kolejnych lini kodu dopiero po przeliczeniu zakresu (czyli po wykonaniu metody calculate), także oczywiście możliwość istnieje - wywołać kalkulację z kodu VBA.

Pozdrawiam

konto usunięte

Temat: Czy makro może zaczekać aż arkusz się przeliczy?

Witam,

Niestety wydaje mi się, że w takim rozwiązaniu pojawi się problem z automatycznym przeliczaniem ponieważ po tym jak makro dokona edycji w arkuszy zostanie on automatycznie przeliczony bez względu na to czy w kodzie będzie metoda Calculate czy nie. Rozwiązaniem tego może być umieszczenie w kodzie przed edycją danych fragmentu:

Application.Calculation = xlManual

a po edycji i przed dalszą częścią kodu przeliczenie o którym wspomina Tomasz:

Worksheets(1).Rows(2).Calculate

Aby uniknąć niespodzianek przy dalszej pracy na arkuszu proponuję na samym końcu kodu przestawienie parametru kalkulacji z powrotem na automatyczną

Application.Calculation = xlAutomatic

Pozdrawiam
Krzysztof

Temat: Czy makro może zaczekać aż arkusz się przeliczy?

Panie Tomaszu
a co w przypadku gdy calculate nie zadziała tak jak Pan pisze?

mam poniższy kod:
Private Sub Workbook_Open()
Application.DisplayAlerts = False
If Month(Date) < 4 Then
ThisWorkbook.Sheets("Kwota Brutto za dział").Range("B1") = Year(Date) - 1
Else: ThisWorkbook.Sheets("Kwota Brutto za dział").Range("B1") = Year(Date)
End If
ThisWorkbook.Sheets("Kwota Brutto za dział").Range("B2") = Month(Date) - 1
Call importDanychNadgodzinKierownik
Calculate
Call GenerujPlikdlaMarka
Application.DisplayAlerts = True
End Sub

i problem taki że makro: Call importDanychNadgodzinKierownik
zaciąga mi dane z bazy sql, oraz z innych plików excela
później formułami "obrabiam dane" żeby uzyskać to czego potrzebuję i nastepnie
makro: Call GenerujPlikdlaMarka
ma wygenerować plik excela z samymi danymi ( kopiuję w nim wartości do nowego arkusza)
żeby współpracownik widział dane a nie miał dostępu do źródła

i problem jest taki że przeliczenie arkusza miedzy makrami jest tylko częściowe
cały arkusz zostaje przeliczony dopiero po zakończeniu działania makra
Oskar Shon

Oskar Shon Dodatki do Office
www.VBATools.pl

Temat: Czy makro może zaczekać aż arkusz się przeliczy?

W VBA masz 3 przełączniki powodujące przyśpieszenie realizacji kodu.
Faktem jest że reakcja na zdarzenia (np edycja komórki), które powodują automatyczne przeliczenie spowalnia realizację kodu (no bo za każdym wrzuceniem czegoś do kolejnych komórek arkusz Excel wynik). Mając zatem np 1000 elementów do wypełnienia skazujemy sie na 1k wywołań przeliczeń. Aby to przyśpieszyć wyłączamy auto przeliczenie oraz zdarzenia.
Na wyłączonych zdarzeniach, można jednak od czasu do czasu uruchomić przeliczenie i będzie ono działać na rozkaż a nie za każdą edycją następnych obszarów arkusza.
Tomasz słusznie się pokierował.
Po wykonaniu modyfikacji włączamy przeliczenia i włączamy zdarzenia.
Trzecim przełącznikiem jest miganie - czyi praca naszej VGA która też potrafi opóźnić proces oraz ukryć kulisy obliczeń.

with application
.EnableEvents = False 'True
.Calculation = xlCalculationManual 'xlCalculationAutomatic
.ScreenUpdating = False 'True
end with

Jeśli jednak nie musisz korzystać z obliczeń wynikających z kalkulacji formuł i ich stałym utrzymywaniu to lepiej jest przeliczyć w VBA. Zamiast więc formuły polecenie
application.worksheetfunction....

Następna dyskusja:

funkcja text. / może makro?




Wyślij zaproszenie do