Excel Forum - Porady, Pomoc,  Excel Help, Excel FAQ Strona Główna
 FAQ  RegulaminRegulamin  Szukaj   Użytkownicy   Grupy   Rejestracja   Profil   Twoje wiadomości   Zaloguj 


Poprzedni temat «» Następny temat
ID tematu: 27695 Skopiuj do schowka numer linii w edytorze VBA
Autor Wiadomość
golly 
ExcelGaduła 500+


Wersja: Win Office 365
Pomógł: 1 raz
Posty: 595
Wysłany: 31-01-2012, 10:48   numer linii w edytorze VBA

Witajcie,

Jaką komendą znajdę numer aktualnej linii kodu w edytorze ?

Chcę to wykorzystać do kontroli błędów.
Kod:
cells(1,1).value = NumerBiezacejLiniWEdytorzeVBA


pozdrawiam
golly
_________________
O365
ID posta: 146799 Skopiuj do schowka
 
 
tkuchta1 
Excel Expert



Pomógł: 1751 razy
Posty: 2888
Wysłany: 31-01-2012, 10:55   

ERL

Twój temat ;-)
http://www.excelforum.pl/...2521.htm#118878
_________________
Tomek



Moja Stronka
A po co ten Excel
Ostatnia aktualizacja: 2015-09-04
ID posta: 146803 Skopiuj do schowka
 
 
golly 
ExcelGaduła 500+


Wersja: Win Office 365
Pomógł: 1 raz
Posty: 595
Wysłany: 31-01-2012, 11:45   

jeju, sorry :oops:
wiedziałem że już gdzieś kiedyś tego używałem tylko na szybkości nie sprawdziłem.

Dziękuję i przepraszam

pozdrawiam
golly

Jednak muszę dopytać.
1. Rozumiem że koniecznym jest numerowanie linii kodu ?
2. Znasz jakiś szybki sposób na wstawienie numeracji linii ?:)
3. A jak już jest numeracja to jaką komendą mogę uzyskać numer bieżącej linii ...? W tam tym wątku użyłeś (erl).


pozdrawiam
golly
_________________
O365
ID posta: 146815 Skopiuj do schowka
 
 
Zbiniek 
Excel Expert



Zaproszone osoby: 2
Wersja: Win Office 2013
Pomógł: 417 razy
Posty: 2677
Wysłany: 31-01-2012, 12:16   

golly napisał/a:
2. Znasz jakiś szybki sposób na wstawienie numeracji linii ?:)
MZ-Tools - http://www.mztools.com/v3...etDocumentation
"Line Numbering
You can add or remove line numbers to a procedure, module, project or project group through the corresponding context menu in the Project Explorer. This feature is useful if you use the (undocumented) Erl function in your error handlers to know the line that caused the error. You can define in the Options window the increment used and if global numbers should be used."

i tłumaczenie za pomocą Google:
"Numeracja wierszy
Możesz dodać lub usunąć numery linii do grupy procedura, moduł, lub projekt przez odpowiednie menu kontekstowego w Eksploratorze projektu. Funkcja ta jest przydatna w przypadku korzystania z (nieudokumentowane) w funkcji Erl obsługi błędów wiedzieć linii, która spowodowała błąd. Można zdefiniować w oknie Opcje przyrost używane i jeśli globalne numery powinny być stosowane."
_________________
pozdrawiam
Zbiniek

Pisz po polsku! Jest różnica czy siedzisz w sadzie czy w sądzie. "Język polski jest ą-ę" :-)

Prawdopodobieństwo otrzymania satysfakcjonującej odpowiedzi jest proporcjonalne do właściwego sformułowania problemu (popartego załącznikiem).

Jest załącznik - jest impreza

http://rtfm.killfile.pl/
ID posta: 146821 Skopiuj do schowka
 
 
golly 
ExcelGaduła 500+


Wersja: Win Office 365
Pomógł: 1 raz
Posty: 595
Wysłany: 31-01-2012, 12:27   

Dziękuję zbiniek.

Niestety kom jest w sieci korporacyjnej i nie mam uprawnień administratorskich jakich wymaga ten tool przy instalacji. A uzyskanie takich uprawnień to ... lepiej sobie darować.

ale dziękuję za podpowiedź. W domu sobie zainstaluję :)

pozdrawiam
golly
_________________
O365
ID posta: 146825 Skopiuj do schowka
 
 
Zbiniek 
Excel Expert



Zaproszone osoby: 2
Wersja: Win Office 2013
Pomógł: 417 razy
Posty: 2677
Wysłany: 31-01-2012, 12:30   

Przeczytaj jeszcze to:
http://www.excelforum.pl/...edu-vt15337.htm oraz
http://www.coderscity.pl/ftopic42444.html na temat obsługi błędów, bo cosik mi się wydaje, że do tego zmierzasz :lol:
_________________
pozdrawiam
Zbiniek

Pisz po polsku! Jest różnica czy siedzisz w sadzie czy w sądzie. "Język polski jest ą-ę" :-)

Prawdopodobieństwo otrzymania satysfakcjonującej odpowiedzi jest proporcjonalne do właściwego sformułowania problemu (popartego załącznikiem).

Jest załącznik - jest impreza

http://rtfm.killfile.pl/
ID posta: 146826 Skopiuj do schowka
 
 
golly 
ExcelGaduła 500+


Wersja: Win Office 365
Pomógł: 1 raz
Posty: 595
Wysłany: 31-01-2012, 12:54   

Dzięki zbiniek

Fajna sprawa, na pewno wykorzystam sobie tą rozbudowaną obsługę błędów z logowaniem. Szczególnie że z mojego pliku korzysta kilka osób.

Natomiast mi numer linii jest potrzebny szczerze powiem w innym celu ...
próbuję zrobić sobie podwójny ProgressBar. Górny będzie pokazywał postęp poszczególnych pętli w programie natomiast dolny postęp całkowity programu.

Niestety w programie nie ma jednej głównej pętli więc chce sobie pooznaczać pewne punkty aby sprawdzić ile czasu zajmuje wykonanie poszczególnych części kodu. Wrzucam wiec sobie w różnych miejscach timera (znacznik) z obsługą:


Kod:
a(ig) = Timer: wksEml.Cells(ig, 10) = a(ig)
wksEml.Cells(ig, 11) = wksEml.Cells(ig, 10) - wksEml.Cells(ig - 1, 10)
ig = ig + 1: wksEml.Cells(ig, 12) = SZUKANAPRZEZEMNIEFUNKCJA


Moja idea była taka aby nie trzeba było modyfikować tego znacznika przy każdym wklejeniu.

chcę sobie stworzyć wygodną i uniwersalną metodę rozpracowywania czasu wykonywania procedury:)


Nie da się na pewno wyciągnąć jakoś numeru linii ?


pozdrawiam
golly

NumerLinii.JPG
Plik ściągnięto 49 raz(y) 86.49 KB

_________________
O365
Ostatnio zmieniony przez golly 31-01-2012, 13:05, w całości zmieniany 1 raz  
ID posta: 146836 Skopiuj do schowka
 
 
tkuchta1 
Excel Expert



Pomógł: 1751 razy
Posty: 2888
Wysłany: 31-01-2012, 13:05   

nie jestem na bieżąco w waszej rozmowie ale jeżeli nie możesz posłużyć się MZTools do nadawania numerów linii można by się pokusić o napisanie procedury która je wstawi...

Prototyp ;-) dla wszystkich funkcji i procedur w Module2 mógłby wyglądać tak
Kod:
Sub SetLineNr()
    Dim xlObj As Object 'VBIDE.CodeModule
    Dim i As Long
   
    Dim iNr As Long
   
    Set xlObj = ThisWorkbook.VBProject.VBComponents("Module2").CodeModule
    With xlObj
        For i = .CountOfDeclarationLines + 1 To .CountOfLines

            If Len(.Lines(i, 1)) > 0 Then
           
                 If Not (.Lines(i, 1) Like "Dim *" Or _
                         .Lines(i, 1) Like "Const *" Or _
                         .Lines(i, 1) Like "*:" Or _
                         .Lines(i, 1) Like "* _") Then
               
                    If .Lines(i, 1) Like "Sub *" Or .Lines(i, 1) Like "Function *" Then
                        iNr = 10
                    ElseIf .Lines(i, 1) = "End Sub" Or .Lines(i, 1) = "End Function" Then
                        iNr = 0
                    Else
                        Dim strLine As String:
                        strLine = iNr & ": " & .Lines(i, 1)
                        .DeleteLines i, 1
                        .InsertLines i, strLine
                       
                        iNr = iNr + 10
                    End If
                End If
            End If
        Next
    End With
    Set xlObj = Nothing
                       
End Sub


pewnie ze trzeba by jeszcze nad nim posiedzieć.
- nie radzi sobie z liniami podzielonymi przez _ (znak podkreślenia)
- nie kojarzy że procedura/funkcja może rozpoczynać się od Private/Public
- numeruje zmienne statyczne
- i pewnie jeszcze inne ciekawostki..

Jednak zabawka nawet w takiej wersji może pomóć :-)

Ps: oczywiście koniecznym jest zaufany dostęp do projektu VBA!

Przykładowy błąd na obrazku
Kurcze :-) spodobał mi się pomysł - jak znajdę czas :-? to będzie art na stronce z bardzij dopracowaną procedurą

bez tytułu.PNG
Plik ściągnięto 51 raz(y) 17.01 KB

_________________
Tomek



Moja Stronka
A po co ten Excel
Ostatnia aktualizacja: 2015-09-04
Ostatnio zmieniony przez tkuchta1 31-01-2012, 13:10, w całości zmieniany 2 razy  
ID posta: 146840 Skopiuj do schowka
 
 
golly 
ExcelGaduła 500+


Wersja: Win Office 365
Pomógł: 1 raz
Posty: 595
Wysłany: 31-01-2012, 13:09   

Wielkie dzięki Tomku!

A jak teraz wyświetlić numer bieżącej linii, jeśli nie ma tam błędu ?

pozdrawiam

golly
_________________
O365
ID posta: 146842 Skopiuj do schowka
 
 
Zbiniek 
Excel Expert



Zaproszone osoby: 2
Wersja: Win Office 2013
Pomógł: 417 razy
Posty: 2677
Wysłany: 31-01-2012, 13:16   

A może tak:

w kodzie w strategicznych miejscach definiujesz zmienną liczbową z określoną wartością. W trakcie wykonywania makra odczytujesz wartość tej zmiennej i przekazujesz do progressbara. Oczywiście masz świadomość, że jedne operacje wykonują się szybciej, inne wolniej.

Obsługa błędów mimo wszystko powinna być - zawsze (no dobrze prawie zawsze).
_________________
pozdrawiam
Zbiniek

Pisz po polsku! Jest różnica czy siedzisz w sadzie czy w sądzie. "Język polski jest ą-ę" :-)

Prawdopodobieństwo otrzymania satysfakcjonującej odpowiedzi jest proporcjonalne do właściwego sformułowania problemu (popartego załącznikiem).

Jest załącznik - jest impreza

http://rtfm.killfile.pl/
ID posta: 146845 Skopiuj do schowka
 
 
golly 
ExcelGaduła 500+


Wersja: Win Office 365
Pomógł: 1 raz
Posty: 595
Wysłany: 31-01-2012, 16:08   

Dziękuję za pomoc tkuchta1, zbiniek

pozdrawiam
golly
_________________
O365
ID posta: 146864 Skopiuj do schowka
 
 
Artik 



Wersja: Win Office 365
Pomógł: 3205 razy
Posty: 10630
Wysłany: 01-02-2012, 05:13   

golly napisał/a:
Nie da się na pewno wyciągnąć jakoś numeru linii ?

(plus rysunek poglądowy)
No nie da się.

Przypominam, że to co napisaliśmy podlega kompilacji, a otrzymana postać skompilowana niewiele ma wspólnego (w wyglądzie) z tym co napisaliśmy. ;-) Dlatego się nie da.

Artik
ID posta: 146942 Skopiuj do schowka
 
 
Artik 



Wersja: Win Office 365
Pomógł: 3205 razy
Posty: 10630
Wysłany: 01-02-2012, 05:15   

tkuchta1 napisał/a:
Prototyp
ulepszony :-) , który wydaje się że obchodzi szerokim łukiem wypunktowane problemy.
Całkiem gratis procedura odwrotna.
Kod:
Sub SetLineNr_Artik()
  Dim xlObj    As Object
  Dim i        As Long
  Dim j        As Long
  Dim strLine  As String
  Dim iNr      As Long

  Dim lTypProcedury As Long, sNazwaProcedury As String
  Dim lStartProcedury As Long, lKoniecProcedury As Long
  Dim iOdp     As VbMsgBoxResult

  Set xlObj = ThisWorkbook.VBProject.VBComponents("Module2").CodeModule

  With xlObj
    i = .CountOfDeclarationLines + 1

    Do
      sNazwaProcedury = .ProcOfLine(i, lTypProcedury)
      lStartProcedury = .ProcStartLine(sNazwaProcedury, lTypProcedury)
      lKoniecProcedury = lStartProcedury + .ProcCountLines(sNazwaProcedury, lTypProcedury) - 1

      iOdp = MsgBox("Czy chcesz ponumerować procedurę '" & sNazwaProcedury & _
                    "'?", vbQuestion + vbYesNoCancel)
      Select Case iOdp
        Case vbCancel
          Exit Do
        Case vbNo
          j = lKoniecProcedury
          GoTo NastepnaProcedura
        Case vbYes

          iNr = 10

          'ProcBodyLine - faktyczna linia rozpoczęcia procedury
          For j = .ProcBodyLine(sNazwaProcedury, lTypProcedury) + 1 To lKoniecProcedury - 1

            If Len(Trim(.Lines(j, 1))) > 0 Then

              If Not (Trim(.Lines(j, 1)) Like "Dim *" Or _
                      Trim(.Lines(j, 1)) Like "Const *" Or _
                      Trim(.Lines(j, 1)) Like "Static *" Or _
                      Trim(.Lines(j, 1)) Like "[!0-9]*:") Then

                If Not (Trim(.Lines(j - 1, 1)) Like "* _") Then

                  If Trim(.Lines(j, 1)) = "End Sub" Or _
                     Trim(.Lines(j, 1)) = "End Function" Then
                    j = lKoniecProcedury
                    Exit For
                  End If

                  strLine = iNr & ": " & .Lines(j, 1)
                  .DeleteLines j, 1
                  .InsertLines j, strLine

                  iNr = iNr + 10
                End If  'Not (Trim(.Lines(j - 1, 1)) Like "* _")

              End If
            End If  'Len(Trim(.Lines(j, 1))) > 0
          Next j
      End Select

NastepnaProcedura:
      i = j + 1
    Loop While i < .CountOfLines

  End With

  Set xlObj = Nothing
End Sub


Sub DelLineNr()
  Dim xlObj    As Object  'VBIDE.CodeModule
  Dim i        As Long
  Dim strLine  As String

  Dim j        As Long

  Dim iNr      As Long

  Dim lTypProcedury As Long, sNazwaProcedury As String
  Dim lStartProcedury As Long, lKoniecProcedury As Long
  Dim iOdp     As VbMsgBoxResult

  Set xlObj = ThisWorkbook.VBProject.VBComponents("Module2").CodeModule

  With xlObj
    i = .CountOfDeclarationLines + 1

    Do
      sNazwaProcedury = .ProcOfLine(i, lTypProcedury)
      lStartProcedury = .ProcStartLine(sNazwaProcedury, lTypProcedury)
      lKoniecProcedury = lStartProcedury + .ProcCountLines(sNazwaProcedury, lTypProcedury) - 1

      iOdp = MsgBox("Czy chcesz usunąć numerację w procedurze '" & sNazwaProcedury & _
                    "'?", vbQuestion + vbYesNoCancel)
      Select Case iOdp
        Case vbCancel
          Exit Do
        Case vbNo
          j = lKoniecProcedury
          GoTo NastepnaProcedura
        Case vbYes

          'ProcBodyLine - faktyczna linia rozpoczęcia procedury
          For j = .ProcBodyLine(sNazwaProcedury, lTypProcedury) + 1 To lKoniecProcedury - 1
            If .Lines(j, 1) Like "#*:*" Then
              strLine = Mid(.Lines(j, 1), InStr(1, .Lines(j, 1), ": ") + 2)
              .DeleteLines j, 1
              .InsertLines j, strLine
            End If
          Next j
      End Select

NastepnaProcedura:
      i = j + 1

      If i >= .CountOfLines Then Exit Do
    Loop

  End With

  Set xlObj = Nothing
End Sub
Ale gwarancji nie daję. :-)

Artik
ID posta: 146943 Skopiuj do schowka
 
 
golly 
ExcelGaduła 500+


Wersja: Win Office 365
Pomógł: 1 raz
Posty: 595
Wysłany: 01-02-2012, 16:51   

Wielkie dzięki Artik

Hula. I w jedną i w drugą stronę.

pozdrawiam serdecznie
golly
_________________
O365
ID posta: 147024 Skopiuj do schowka
 
 
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Możesz ściągać załączniki na tym forum
Dodaj temat do Ulubionych
Wersja do druku

Skocz do:  

Powered by phpBB modified by Przemo © 2003 phpBB Group
Theme xandgreen created by spleen& Programosy modified v0.3 by warna
Opieka techniczna www.wip.pl

Archiwum

Strona używa plików cookies.

Kliknij tutaj, żeby dowiedzieć się jaki jest cel używania cookies oraz jak zmienić ustawienia cookie w przeglądarce.
Korzystając ze strony użytkownik wyraża zgodę na używanie plików cookies, zgodnie z bieżącymi ustawieniami przeglądarki.
Sprawdź, w jaki sposób przetwarzamy dane osobowe