2015-08-27 23 views
5

Każdy pomysł, dlaczego wstawianie punktów przerwania i zatrzymywanie nie zatrzymuje już mojego kodu vba przed uruchomieniem?Punkty przerwania i zatrzymania programu Excel Excel nie działają

Kod działa ok, aż do końca (ja testowałem to), ale ignoruje złamać punkty i Stop.

kroku również na właśnie sprawia, że ​​bieg kodu w jego całości, ignorując punktów przerwę i zatrzymuje się.

Kiedy zamykam skoroszyt gdzie kwestia wydaje się pochodzić z tego samego problemu występuje w innych skoroszytach makr.

gdybym całkowicie zamknąć program Excel i otworzyć ją ponownie z normalnie pracujących makro skoroszycie problem nie występuje aż ponownie otwarta książka praca problem.

Dodałam punkty przerwania na:

TotP1 = 0 

z następującego kodu:

Option Explicit 

Private Country As String 
Private Measure As String 
Private P1 As String 
Private P2 As String 
Private TotP1 As Double 
Private TotP2 As Double 


Sub VennDisplayIt() 

Dim SI() As String 
Dim SICount As Integer 
Dim x As Integer 
Dim OSh As Worksheet 
Dim BrandListBox As Object 
Dim VennGroup As Shape 

TotP1 = 0 
TotP2 = 0 


Set OSh = ThisWorkbook.Sheets("Venn") 

Set BrandListBox = OSh.OLEObjects("BrandListBox").Object 

ReDim SI(2, 0) 

For x = 0 To BrandListBox.ListCount - 1 

    If BrandListBox.Selected(x) = True Then 
     'If UBound(SI) < 4 Then 
      ReDim Preserve SI(2, UBound(SI, 2) + 1) 

      SI(1, UBound(SI, 2)) = BrandListBox.List(x) 
      SI(2, UBound(SI, 2)) = x + 1 
     'End If 

    End If 

Next x 


If UBound(SI, 2) < 2 Then 
    BrandListBox.Selected(BrandListBox.ListIndex) = True 
    Exit Sub 
ElseIf UBound(SI, 2) > 4 Then 
    BrandListBox.Selected(BrandListBox.ListIndex) = False 
    Exit Sub 
End If 

For x = 1 To UBound(SI, 2) 
    OSh.Range("o8").Offset(x, 0).Value = SI(1, x) 
    OSh.Range("o8").Offset(x + 5, 0).Value = SI(1, x) 
Next x 

For x = UBound(SI, 2) + 1 To 4 
    OSh.Range("o8").Offset(x, 0).Value = "" 
    OSh.Range("o8").Offset(x + 5, 0).Value = "" 
Next x 


SICount = UBound(SI, 2) 

For x = 1 To OSh.Shapes.Count 
    If Right(OSh.Shapes(x).Name, 5) = "Group" Then 
    If LCase(OSh.Shapes(x).Name) = SICount & "waygroup" Then 
     Set VennGroup = OSh.Shapes(x) 
     OSh.Shapes(x).Visible = True 
    Else 
     OSh.Shapes(x).Visible = False 
    End If 
    End If 

Next x 

For x = 1 To SICount 

    VennGroup.GroupItems.Item(SICount & "WayBrand" & x).DrawingObject.Text = SI(1, x) 

Next x 


Country = ThisWorkbook.Sheets("Venn").Range("D4").Value 
Measure = ThisWorkbook.Sheets("Venn").Range("E32").Value 
P2 = ThisWorkbook.Sheets("Venn").Range("E31").Value 
P1 = ThisWorkbook.Sheets("Selections").Range("B5").Value 


End Sub 
+1

Czy możesz pokazać kod i miejsce, w którym są umieszczone punkty przerwania? –

+0

Właśnie dodałem kod. –

+2

Uruchomiłem twój kod z punktem przerwania na 'TotP1 = ​​0' i złamał się tam dokładnie tak, jak powinien. Zgaduję więc, że w skoroszycie rzeczywiście coś jest uszkodzone. –

Odpowiedz

1

Jeśli wartości graniczne są w kodzie, to kod powinien przestać działać tak szybko, jak to uderza tej linii. Możliwe przyczyny problemu:

a) Kod nigdy nie dojdzie do przerwania. Wydaje się bardzo mało prawdopodobne, że widzisz, gdy przerywasz pierwszą linię kodu. Może przejrzyj podpunkt (F8), aby sprawdzić, czy działa tak, jak powinien.

b) Twoje punkty przerwania zostały wyczyszczone. Każda linia z punktem przerwania powinna być podświetlona na czerwono na twoim IDE. Twoje punkty przerwania można łatwo wyczyścić, np. zamykanie i otwieranie skoroszytu (zrzut ekranu byłby naprawdę użyteczny).

c) Twój skoroszyt jest w jakiś sposób uszkodzony. Byłoby mało prawdopodobne, aby złamać coś tak fundamentalnego jak zatrzymanie w punktach przerwania i nadal funkcjonować normalnie. Czy na pewno Twój kod działa?

+0

Cześć, wygląda na C). Nie mogę przejść przez kod, ponieważ jest to część problemu. jednak moje punkty przerwania są zdecydowanie na miejscu i wyróżnione na czerwono. kod jest zdecydowanie uruchomiony, ponieważ umieściłem test na samym końcu, aby zmodyfikować komórkę i zadziałało. Właśnie przeniosłem wszystko do nowego skoroszytu i na razie działa poprawnie. –

+0

Dobrze, cieszę się pomóc :) – Kaz

4

Nigdy nie słyszałem o Stop nie działa, ale słyszałem o zerwaniu i doświadczony rzeczą wielokrotnie. Podczas kompilacji VBA tworzy kod p, który jest używany przez interpreter. Masz warstwę składni VBA, którą widać i warstwę kodu p, której nie widać. Kiedy przestają działać punkty przerwań, dzieje się tak, ponieważ kod p jest uszkodzony. Nie wiem, jak to się stało, ale tak się stało.

Poprawka polega na eksportowaniu, usuwaniu i powrotnym importowaniu wszystkich modułów. Wyeksportowanie ich tworzy plik .bas (zwykły tekst, naprawdę). Po ponownym imporcie p-code jest regenerowany od zera. Jeśli masz więcej niż kilka modułów, uzyskaj CodeCleaner (darmowy dodatek), który wyeksportuje i ponownie zaimportuje automatycznie.

+1

Nie tylko nigdy doświadczony 'Stop' (jak napisano w kodzie) nie działa, ale kiedy mam się (często) emisja pułapki nie łamiąc wykonanie i/lub kod aktualizacje nie są wyświetlane podczas wykonywania, dodanie pojedynczego 'Stop' rozwiązuje to natychmiastowo. Ponieważ nie ma prawdziwego napisane 'Stop' w kodzie @OliverHumphreys, zastanawiam się, czy on rzeczywiście mówimy o' Stop' lub myśli o 'pułapki F9'/przerwań warunkowych. – Tibo

0

Jeśli jedno z ustawień nie jest zaznaczone, punkty przerwania nie będą działać. "Plik/opcje/Aktualna baza danych/Opcje aplikacji/użyj specjalnych klawiszy dostępu" powinien być sprawdzony

1

Po prostu "drugi" komentarz Tibo: Miałem problem, gdy miałem formularz z około 5 różnymi podprogramami. Jeden z nich (dołączony do zdarzenia przycisku) nie zatrzymał się po ustawieniu punktu przerwania. w 10 lat pisania VBA, nigdy nie widziałem, aby tak się stało. Co ciekawe, punkty przerwania działały na wszystkie inne podprogramy w tej formie. Po wielu drapaniach głowy i poszukiwaniach natknąłem się na ten wpis i komentarz Tibo. Dodałem polecenie "Zatrzymaj" do podprogramu, którego dotyczy problem, uruchomiłem procedurę (zatrzymało się tak, jak powinno), a następnie punkty przerwania znów zaczęły działać! Mam nadzieję, że to pomoże komuś w przyszłości.

1

Dzielę się zabawną rzeczą, która mi się przytrafiła na wypadek, gdyby komuś pomogło. Błąd, który popełniłem, polegał na tym, że po prostu wziąłem czyjś kod metodowy przeznaczony dla zdarzenia otwartego ze skoroszytu i wkleiłem go na obszarze kodu obiektu Excel. Nie było więc możliwości, by metoda Workbook_Open została zwolniona.

Private Sub Workbook_Open() 
    Stop 
    On Error Resume Next 
    Call ActiveSheet.Worksheet_Activate 
    On Error GoTo 0 
End Sub 

Co miałem zrobić, to wklej ten sposób po dwukrotnym kliknięciu ThisWorkbook węzeł pod Microsoft Excel Objects w okienku Projektu, jak pokazano poniżej:

enter image description here

Uwaga: efektem ubocznym kopiowaniem wklejanie inny kod może czasami być dziwaczny.