Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Excel - VB makro powoduje Run-time error 1004 lub -2147417848 (80010108)

jega 29 Jan 2020 23:37 858 4
  • #1
    jega
    Level 24  
    Witam!
    To mój pierwszy post w tej części forum. Natrafiłem na problem, znalazłem rozwiązanie, może komuś to się przyda.

    Zarejestrowałem proste makro, które w pierwszej części (tylko ta jest istotna) miało u dołu tabeli, ale przed wierszem podsumowania tworzyć dodatkowy wiersz będący kopią jednego z wierszy powyżej. Wydawało się, że sprawa jest prosta, makro od razu zaczęło działać poprawnie, ale przy dalszych testach zaczęło się zawieszać zgłaszając dziwne błędy (jak w nagłówku). Potrafiło przy tym zawiesić Excel tak (brak reakcji na próbę wybrania komórki), że konieczne było wyjście z programu i ponowne otwarcie arkusza.

    Próby zmian nie pomogły, numer błędu się zmienił, poza tym nadal było to samo. Czasem błąd się pojawiał, czasem nie, zauważyłem jednak, że przy pierwszym wywołaniu po uruchomieniu programu zawsze wykonanie makro kończyło się powodzeniem. W końcu doszedłem do tego, że błąd powoduje usuwanie zbędnych wierszy w tabeli tworzonych podczas prób.

    Nie widzę powiązania, traktuję to jako błąd Excela, zwłaszcza w powiązaniu z absurdalną treścią komunikatów opisujących te błędy. Może ta informacja przyda się komuś, kto boryka się z podobnym problemem.

    Pozdrawiam :)

    Poprawka - jednak nie jest tak pięknie, błędy nadal się pojawiają. Wydaje się, że skuteczne jest zapisywanie pliku każdorazowo po wykonaniu makra. Ponawiałem próby kilkanaście razy a błąd nie wystąpił ani raz. Korzystam z tego makro raz na miesiąc, więc to nie problem od strony użytkowej, ale denerwuje mnie, że nie widzę przyczyny. Ktoś ma jakiś pomysł?
  • #3
    jega
    Level 24  
    Przepraszam, faktycznie podałem mało informacji, ale pisząc post zakładałem, że problem jest już rozwiązany, nie szukałem pomocy, chciałem osobom, którym Excel sprawi podobne kłopoty zasugerować, co może pomóc. A to ma sens na dużym poziomie ogólności, wątpię, żeby kod tu wiele pomógł, zwłaszcza mało zaawansowanym użytkownikom makr, takim jak ja.
    Do rzeczy:
    Microsoft Office Professional 2013
    2013 (15.0.4420.1017) MSO (64-bitowa)
    Windows 10 Pro, 1903, 18362.592
    kod:
    ' wstawianie kopii wiersza sprzed 3 miesięcy
    Application.Goto Reference:="EOD"
    ActiveCell.Offset(-3, 0).Range("A1").Select
    Range(Selection, Cells(ActiveCell.Row, 1)).Select
    Selection.Copy
    Application.Goto Reference:="EOD"
    Range(Selection, Cells(ActiveCell.Row, 1)).Select
    Selection.Insert Shift:=xlDown
    ' kopiowanie daty
    Application.Goto Reference:="Odczyt"
    ActiveCell.Offset(0, -2).Range("A1").Select
    Application.CutCopyMode = False
    Selection.Copy
    Application.Goto Reference:="EOD"
    ActiveCell.Offset(-1, -18).Range("A1").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
    ' kopiowanie stanu licznika
    Application.Goto Reference:="Odczyt"
    Application.CutCopyMode = False
    Selection.Copy
    Application.Goto Reference:="EOD"
    ActiveCell.Offset(-1, -16).Range("A1").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
    ' kopiowanie opłaty za dostawę wody
    Application.Goto Reference:="bruttoW"
    Application.CutCopyMode = False
    Selection.Copy
    Application.Goto Reference:="EOD"
    Selection.End(xlToLeft).Select
    Selection.End(xlToLeft).Select
    ActiveCell.Offset(-1, 0).Range("A1").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
    ' kopiowanie opłaty za odprowadzenie ścieków
    Application.Goto Reference:="bruttoS"
    Application.CutCopyMode = False
    Selection.Copy
    Application.Goto Reference:="EOD"
    Selection.End(xlToLeft).Select
    ActiveCell.Offset(-1, 0).Range("A1").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
    ' zerowanie pola zużycia w/g liczników mieszkańców (ma znaczenie na koniec kwartału)
    ActiveCell.Offset(0, 6).Range("A1").Select
    Application.CutCopyMode = False
    Selection.ClearContents

    Komórka "EOD" to prawy dolny róg tabeli, koniec wiersza podsumowania. Akurat ta wersja odszukuje koniec wiersza do skopiowania, zaznacza go, włącza kopiowanie, przechodzi do wiersza podsumowania, zaznacza go i wstawia kopię ponad nim. Wcześniej tworzyłem pusty wiersz i dopiero później wykonywałem kopię, ale gdy wystąpiły problemy zmieniłem rozwiązanie na powyższe. I tak i tak raz wykonuje się poprawnie, w kolejnych wykonaniach (o ile się nie zapisze arkusza po poprzednim wykonaniu) MOGĄ , ale nie muszą pojawić się błędy. Nie doszukałem się żadnej przyczyny, czemu czasem błąd występuje a czasem nie. Dalej jest tylko kopiowanie kilku wartości z wskazanych komórek do właściwych miejsc w dodanym wierszu. Sądziłem, że to pierwszy fragment, odpowiedzialny za kopiowanie wiersza jest wadliwy, bo tam, na wklejaniu wiersza następuje przerwanie wykonania makro. Dopiero teraz, kiedy chciałem wypreparować z całego makro tylko tę część dla potrzeb wpisu stwierdziłem, że gdy ograniczę makro do samego kopiowania wiersza, bez późniejszego kopiowania wybranych wartości makro się nie zawiesza. Chciałem dołączyć plik, ale całego skoroszytu nie mogę z uwagi na ochronę danych osobowych a jak wypreparowałem tylko ten arkusz to makro nagle zaczęło działać bez żadnych problemów, więc najwyraźniej to interakcja z innymi arkuszami w tym skoroszycie coś zmienia. Nie wiem jak, skoro arkusz nawet nie odwołuje się do innych arkuszy ani one do niego. Tak więc dołączony plik, choć zawiera arkusz i makro niekoniecznie coś wnosi.
    To miał być szybki numerek, mierziło mnie powtarzanie co miesiąc tych samych - w sumie prostych - operacji. Zamiast tego trafiłem na zagadkową (dla mnie) sytuację. Niestety, nie mogę poświęcić na to zbyt wiele czasu. Rozwiązanie quick and dirty, dla mnie w sumie bezproblemowe, to zapisanie arkusza po wykonaniu makro. Jeżeli dla kogoś jest oczywiste, co jest nie tak to będę wdzięczny za wskazanie błędu, warto się uczyć całe życie :) Jeżeli komuś ta podpowiedź się przyda - świetnie. Jeżeli ktoś stracił przeze mnie czas - przepraszam.
  • #4
    Maciej Gonet
    VBA, Excel specialist
    Jakiegoś ewidentnego błędu w tym kodzie nie znalazłem, być może jakieś przypadkowe interakcje z innym kodem. Natomiast generalnie ten kod wykonuje mnóstwo niepotrzebnych czynności i można go znacznie skrócić. Może w tej skróconej formie będzie działał lepiej (a przynajmniej w razie wystąpienia błędu łatwiej będzie go zlokalizować).
    Code: vbscript
    Log in, to see the code
  • #5
    jega
    Level 24  
    Dzięki, spróbuję przetestować, ale teraz nie mam na to czasu. Oczywiście wiem, że kod jest nadmiarowy, ale nie napisałem go, jest wynikiem rejestracji czynności. Do tego chciałem, by tak zarejestrowane makro było odporne na niewielkie zmiany np. dodatkową kolumnę w tabeli. Stąd to zaznaczanie "od końca". Nie chciałem też definiować zbyt wielu komórek, stąd to przechodzenie do nazwanej komórki a potem dwie komórki w lewo itp.

    Przede wszystkim jednak założeniem było zarejestrować na szybko i używać bez dociekania jak działa. W końcu robię to raz na miesiąc, więc nie warto inwestować zbyt wiele czasu w makro. Dopiero niezrozumiałe (dla mnie) problemy przy ponownym wykonaniu zaintrygowały mnie na tyle, że grzebię w tym, żeby się czegoś nauczyć.

    Na razie jednak nawet nie wiem jakie czynniki są istotne, jak napisałem poprzednio już dwukrotnie, gdy próbuję wypreparować to, co powoduje błąd z całego skoroszytu (najpierw część makro, teraz tylko arkusz, w którym działa) to nagle problemy znikają. A całego skoroszytu wprost przesłać na publiczne forum nie mogę, muszę najpierw zrobić anonimizację danych osobowych. Pytanie, czy wtedy problem znów tajemniczo nie zniknie.