vbamania.pl
login:
hasło:
 
  *Rejestracja *Zapomniane hasło
 Dziś jest środa, 18 czerwca 2025 roku.
Ustaw jako stronę startową Ulubione Napisz
PowrótPowrót do serwisu  RegulaminRegulamin rssRSS

  tytuł wątku:
Wątki dyskusji

worksheet_Change - połączenie z SUB


otwartyotwarty rozpoczął: kilis postów: 9



napisał: kilis
postów: 12


umieszczony:
13 marca 2010
15:02

  
łomatko !

sprawdzę to ale zajmie mi to troszkę czasu :)
dzięki
napisał: Rycho
postów: 291


umieszczony:
14 lutego 2010
22:43

  
Z procedurami zdarzeniowymi jest trochę zachodu.

U mnie arkusz wzorcowy nazywa się 'wzor'.
Przetestuj kod:
Option Explicit
'
'referencje do: Microsoft Visual Basic for Applications Extensibility 5.3
'
'źródło wiedzy: http://www.cpearson.com/excel/vbe.aspx
'

Sub test()
  Dim ws As Worksheet
  
  'wstawienie nowego arkusza ale może to być istniejący arkusz w innym pliku
  Set ws = Worksheets.Add
  ws.Name = "Nowy Arkusz"

  Copy_Event_Procedure Worksheets("wzor"), ws, "SelectionChange"
End Sub

Sub Copy_Event_Procedure(shS As Worksheet, shD As Worksheet, EventName As String)

  On Error GoTo Copy_Event_Procedure_Error

  'moduł arkusza źródłowego shS
  Dim CodeMod As VBIDE.CodeModule

  Set CodeMod = shS.Parent.VBProject.VBComponents(shS.CodeName).CodeModule

  'nazwa procedury obsługi zdarzenia
  Dim ProcName As String
  ProcName = "Worksheet_" & EventName

  With CodeMod
    Dim StartLine As Long
    StartLine = .ProcStartLine(ProcName, vbext_pk_Proc)

    Dim NumLines As Long
    NumLines = .ProcCountLines(ProcName, vbext_pk_Proc)

    'pobranie kodu procedury do zmiennej tekstowej
    Dim ProcCode As String
    ProcCode = .Lines(StartLine:=StartLine, Count:=NumLines)
  End With

  '=== Oczyszczenie kodu procedury z pustych linii i nagłówka
  'kod liniami do tablicy
  Dim T
  T = Split(ProcCode, vbCrLf)
  ProcCode = ""

  Dim i As Integer
  For i = 0 To UBound(T)
    Dim s As String
    s = Trim(T(i))

    If Not (s = "" Or Left(s, 11) = "Private Sub" Or Left(s, 7) = "End Sub") _
       Then
      ProcCode = ProcCode & T(i) & vbCrLf
    End If
  Next
  '===
  'MsgBox ProcCode

  'moduł arkusza docelowego shD
  Set CodeMod = shD.Parent.VBProject.VBComponents(shD.CodeName).CodeModule
  With CodeMod
    Dim LineNum As Long
    'utworzenie nagłówka prodcedury zdarzeniowej
    LineNum = .CreateEventProc(EventName, "Worksheet")
    LineNum = LineNum + 1
    'wstawienie kodu procedury
    .InsertLines LineNum, ProcCode
  End With

  On Error GoTo 0
  Exit Sub

Copy_Event_Procedure_Error:
  MsgBox "Error " & Err.Number & " (" & Err.Description & _
         ") in procedure Copy_Event_Procedure"
End Sub

napisał: kilis
postów: 12


umieszczony:
13 lutego 2010
23:32

  
dzięki za stronkę wczytam się ale już widzę że to nie moja liga ;)
napisał: Rycho
postów: 291


umieszczony:
12 lutego 2010
23:34

  
ok.
Poczytaj na stronie Chip'a Pearson'a. Zwóć uwagę na Creating An Event Procedure
napisał: kilis
postów: 12


umieszczony:
12 lutego 2010
21:26

  
No właśnie jest jakby odwrotnie. Pobieram arkusz już z danymi i go przerabiam za pomocą makro a potem chcę z niego zrobić
"żyjący" arkusz za pomocą worksheet_Change.
napisał: Rycho
postów: 291


umieszczony:
12 lutego 2010
12:50

  
Hej,
rozumiem, że zaczynasz od nowego pustego skoroszytu, do którego ściągasz dane?

Jeśli tak, ręcznie przygotuj sobie pusty arkusz z makrem Worksheet_Change i ściągaj dane do jego kopii.
Ponieważ w tym arkuszu jest procedura zdarzeniowa (uruchamiana po zmianie w komórkach arkusza), w swoim makrze musisz wyłączyć obsługę zdarzeń i włączyć ją na końcu makra.
Sub MojeMakro()
  Application.EnableEvents = False
  '... jakieś instrukcje
  Application.EnableEvents = True
End Sub

napisał: kilis
postów: 12


umieszczony:
12 lutego 2010
11:09

  
Postaram się wyjaśnić o co mi chodzi:

1. mam arkusz z danymi xls - pobieram go z bazy danych kiedy już wiem że znajdują się tam wszystkie potrzebne dane.
2. Odpalam swoje makro i ono ustawia mi te dane tak jak chcę je widzieć, zbędne usuwa rysuje tabele zamienia godziny z czasów lokalnych na UTC i różne inne.
(to jest arkusz odlotów i przylotów samolotów, gdzie znajduję się dane takie jak: godziny odlotów przylotów, numery rejsów, znaki rejestracyjne samolotów etc)

3. Arkusz zapisuje się jako plik o podanej nazwie + data tego arkusza

Teraz co następuje: mogę sobie wydrukować i jechać długopisem co kiedy poleciało i jakie czynności pracownik wykonał i o której. Wypełniam po prostu tę tabelę jak samoloty odlatują i przylatują.

Chciałbym to zrobić tak żeby robić to na żywym arkuszu w komputerze a nie na wydrukowanej kartce. Napisałem sobie worksheet_Change
które koloruje określone komórki na dany kolor jak zbliża się czas odlotu i inne sygnalizacje.

I to działa jak "wklejam" do VBA arkusza moje worksheet_Change.

Chciałbym, żeby działo się to samoczynnie czyli makro mieli dane pierwotne a po przygotowaniu arkusza dodaje jeszcze to co napisałem jakoo worksheet_Chenge i zapisuje gotowy arkusz do pracy.


mam nadzieję że troszkę wyjaśniłem
dzięki
napisał: admin
postów: 613


umieszczony:
11 lutego 2010
05:45

  
Jeśli dobrze Cię zrozumiałem:
Po zakończeniu pracy Twojego makra chcesz uruchomić kod zawarty w procedurze zdarzeniowej worksheet_Change ? Jeśli tak, to...nie rób tego.
Umieść ten kod w innej procedurze, zawartej w zwykłym module, i wtedy, z poziomu Twojego pierwszego wywołaj to drugie makro.

Jeśli jednak chcesz po prostu dodać nową, gotową procedurę zdarzeniową, to.... nie rób tego, na pewno jest jakiś inny, prostszy sposób. Jaki? Musisz jasno opisać co chcesz uzyskać, bo Twój opis niewiele mówi.


Cytat:
Mogę mylić pojęcia i frazeologię ale mam nadzieję że będę zrozumiany ;)

Mam pewien arkusz xls do którego napisałem makro. Ustawia mi wszystko tal jak chcę (jest to tabela różnych danych).

Po "przemieleniu" przez moje makro chciałbym aby do tego arkusz dodać w jakiś sposób drugi makro (znaczy się o ile wiem to już nie jest makro ale coś innego ale wiecie o co chodzi) worksheet_Change. Tak żeby po zakończeniu mojego pierwszego makro do arkusza została dodana konkretna instrukcja worksheet_Change którą już napisałem i która działa poprawnie.

Czy jest taka możliwość ?
napisał: kilis
postów: 12


umieszczony:
11 lutego 2010
03:24

  
Mogę mylić pojęcia i frazeologię ale mam nadzieję że będę zrozumiany ;)

Mam pewien arkusz xls do którego napisałem makro. Ustawia mi wszystko tal jak chcę (jest to tabela różnych danych).

Po "przemieleniu" przez moje makro chciałbym aby do tego arkusz dodać w jakiś sposób drugi makro (znaczy się o ile wiem to już nie jest makro ale coś innego ale wiecie o co chodzi) worksheet_Change. Tak żeby po zakończeniu mojego pierwszego makro do arkusza została dodana konkretna instrukcja worksheet_Change którą już napisałem i która działa poprawnie.

Czy jest taka możliwość ?


<-wstecz  1  dalej->
wszystkich stron: 1


Sortuj posty: z