VBATools

VBS Wywołanie polecenia w tle

by on Feb.20, 2012, under Excel, Porady

Zastanawiacie się jak można wykonać modyfikację pliku, tak aby użytkownik się nie zorientował? Jest wiele metod, począwszy od napisania dodatku który uruchomimy wraz z komputerem lub z autostartem Excela, można podmienić plik po GPO (komputer w domenie) lub uruchomić plik polecenia skryptowego.

Ta porada będzie właśnie poświęcona wykorzystaniem języka skryptowego do modyfikacji istniejącego pliku Excela.

Poniżej znajdziemy treść pliku tekstowego z rozszerzeniem vbs, który z łatwością po odpaleniu zrozumie nasz procesor działający w systemie Windows.

'MVP OShon from VBATools.pl
Dim XLApp 'As Object 'Excel.Application
Dim wkb 'As Object 'Workbook
Dim wks 'As Object 'Worksheet
Dim sciezka 'As String
sciezka = "c:\temp\test.xlsx"
Set XLApp = CreateObject("Excel.Application")
XLApp.Visible = False
XLApp.Workbooks.Open sciezka
Set wkb = XLApp.ActiveWorkbook
Set wks = wkb.Sheets(1)
wks.Cells(1,1) = "Hello Word"
wkb.Close True
XLApp.Quit
Set wkb = Nothing
Set wks = Nothing
Set XLApp = Nothing

Co on właściwie robi?

Otwiera aplikacje Excel w trybie ukrytym, następnie odwołuje się do pierwszego arkusza i modyfikuje komórkę A1 wstawiając tam stringa. Po zakończeniu operacji wyłącza aplikację i czyści pamięć. Można zauważyć że w języku skryptowym nie odwołujemy się określając zmienne – pozostawiamy to procesorowi. Niestety taka forma nie jest mile widziana ani w VB ani VBA, gdzie prędkość działania jest uzależniona od prawidłowej deklaracji.

Aby uruchomić plik *.vbs należy go zapisać i albo umieścić stosowną komendę ze ścieżką jego przetrzymywania w rejestrze użytkownika:

HKEY_CURRENT_USER\Software\Microsoft\Windows\Current\Version\RunOnce

“C:\jakis_katalogplik.vbs” /nosplash /minimized

albo umieścić plik lub jego link w autostarcie (zwracając uwagę na późniejszą dezintegracje pliku, aby proces ten nie powtarzał się za każdym razem podczas uruchomienia komputera).

Import danych oraz aktywacja przypomnień dla terminów po imporcie z MS Excel

napisane przez Oskar w dniu poniedziałek, 21 Czerwiec, 2010, w kategorii Porady – Excel, Porady – Outlook

MS Outlook pozwala zaimportować większą ilość terminów do kalendarza dzięki utworzonej wcześniej bazie danych w programie Excel.

Aby przystąpić do pracy należy wyselekcjonować dane, jakie będą istotne do utworzenia obiektu kalendarzowego. Poniższy rysunek pokazuje przykładową bazę elementów (arkusz: Dane), jakie wykorzystamy przy imporcie do Outlooka.

Rys 1. Przykładowa baza danych do importu jako obiekty kalendarza

Poniżej przykład uporządkowanego obszaru bazy, np. wielkości tablicy „A:J” (od Temat do Opis). Pola nazw kolumn zgodne z importem rozumianym przez Outlooka to:

Temat, Datarozpoczęcia, Czasrozpoczęcia, Datazakończenia, Czaszakończenia, Przypomnienie wł/wył, Dataprzypomnienia, Czasprzypomnienia, Kategorie, Opis

Rys 2. Przygotowanie linii – odpowiedniki nowych obiektów

Warunkiem koniecznym do prawidłowego importu jest nadanie obszaru roboczego o nazwie Kalendarz (arkusz: Outlook).

W przypadku, kiedy nasza baza zwiększa swoją objętość, aktualizacje obszaru możemy realizować za pomocą poniższej instrukcji umieszczonej w module Excela:

Dim oName As Name

For Each oName In ActiveWorkbook.Names
If oName.Name = „Kalendarz” Then oName.Delete
Next
ActiveWorkbook.Names.Add Name:=”Kalendarz”, _
RefersTo:=Range(„A1:J” & Cells(Rows.Count, „A”).End(xlUp).Row)

Jeśli już posiadamy jasno określoną matrycę, przystępujemy do importu danych w Outlooku. Przedtem należy wyjść z pliku bazy danych (zamknąć plik Excela). Mechanizm importu możemy znaleźć w Outlooku: Menu/Plik/Importuj lub eksportuj/Import z innego programu lub pliku/Microsoft Excel.

Wybieramy plik oraz stosowną opcję metody importu.

Wskazujemy folder kalendarza (może to być dowolny folder, inny niż domyślny, o właściwościach kalendarza).

Możemy określić inne pola importu, jednakże powyższy przykład bazy zawiera większość stosowanych.

Niestety import ten posiada jedną wadę. Pozbawiony jest prawidłowego odczytu pola: Przypomnienie wł/wył = PRAWDA, pomimo prawidłowego wskazania. W przypadku umieszczenia anglojęzycznej nazwy parametru pola otrzymujemy identyczny skutek.

Powyższy rysunek nie zawiera zaznaczonego przypomnienia, choć w chwili importu data przypomnienia była wcześniejsza niż data importu danych.

Istnieje ręczna metoda, polegająca na ustawieniu widoku kalendarza: Widok/Widok bieżący/Wszystkie terminy lub Widok/Rozmieść wg/Kategorie i przy wyciągnięciu nowej kolumny Przypomnienie, jest możliwość naciśnięcia w jego puste pole (pojawi się dzwoneczek) oznaczający jego nadanie w dacie i godzinie terminu.

Wyciągnięcie kolumny realizujemy poprzez prawy klik na pasku nazw kolumn/Wybór pola/Przenosimy przytrzymując myszą nazwę kolumny Przypomnienie i puszczając przycisk w odpowiednim miejscu.

Napotykamy na problemem, gdy ilość kliknięć jest równa np. 100 lub więcej. Praca taka wydaje się zbyt mozolna, zwłaszcza mając na uwadze cykliczność naszych działań.

Aby temu zaradzić i proces ten zautomatyzować, należy użyć poniżej napisanej procedury, która zbada czy przypomnienie terminów zaimportowanych do Outlooka jest aktualne w dacie. Wszystkie takie obiekty uaktualni, dodając „dzwoneczek” (włączy dla tych obiektów przypomnienie). Uniwersalność procedury pozwala umieścić ją zarówno w module Outlooka, jak i Excela (w Excelu należy w Referencjach dodać bibliotekę Oulooka Menu/Tools/References -> Microsoft Outlook …Object libary).

Option Explicit
Sub wlaczanie_przypomninia()
'MVP OShon from VBATools.pl
Dim msg$, Response$, q&

msg = "Procedura włączenia przypomnień do terminów w kalendarzu Outlooka" & vbCr & vbCr _
& "Aby kontynuować naciśnij ''Tak''" & vbCr _
& "Aby anulować operacje naciśnij ''Nie''"
On Error GoTo blad
Response = MsgBox(msg, vbYesNo + vbExclamation + vbDefaultButton2, " Aktualizacja dzwoneczków")
If Response = vbYes Then
  Dim OutApp As Object
    Set OutApp = CreateObject("Outlook.Application")
  OutApp.Session.Logon
  Dim oApptFolder As MAPIFolder
    Set oApptFolder = OutApp.Application.GetNamespace("MAPI").GetDefaultFolder(olFolderCalendar)
Dim oCalendar As AppointmentItem
Dim olApp As Items
  Set olApp = oApptFolder.Items
  For q = 1 To olApp.Count
    DoEvents
    Set oCalendar = olApp.Item(q)
    If Not oCalendar.Categories = "" _
      And oCalendar.ReminderSet = False _
      And oCalendar.Start >= Now Then
      'Jeśli nie określimy nazwy dla kategorii należy zmienić pow. warunek.
      oCalendar.ReminderSet = True
      oCalendar.Save
    End If
  Set oCalendar = Nothing
Next q
MsgBox "Dzwoneczki uaktywnione!", vbInformation, "O'Shon machine from VBATools."
Set OutApp = Nothing
Set oApptFolder = Nothing
End If
Exit Sub

blad:
MsgBox "Błąd: " & Err.Number & vbCr & Err.Description, vbExclamation
End Sub

Jeśli automat zainteresuje się naszymi terminami, dla których przypomnienie miało nastąpić o wiele wcześniej, niż data wydarzenia kalendarzowego, należy anulować potwierdzenie przypomnienia naciskając: Odrzuć wszystkie.

W kalendarzu Outlooka pozostaną tylko te, co do których termin przypomnienia będzie skutkował komunikatem w nadanym, aktualnym terminie.

:,

Leave a Reply