Archiwum autora
Windows Phone
napisane przez Oskar w dniu piątek, 30 Marzec, 2012, w kategorii Informacje
Od jakiegoś czasu użytkuje telefon z nowym systemem Microsoftu WP7.5. Chciałem się z wami podzielić kilkoma spostrzeżeniami.
Do ręki wpadł mi model Samsung Omnia W z pow. systemem, jednakże przeglądając oferty operatorów można zauważyć iż coraz więcej słuchawek promuje ten system. Dlaczego i co przemawia za koniecznością jego posiadania jak i co potrafi zrazić spróbuje przekazać poniżej – ocenicie sami. (czytaj dalej …)
Zmiana nagłówków tabeli
napisane przez Oskar w dniu czwartek, 22 Marzec, 2012, w kategorii Porady - Excel
Zamiana nagłówków tabeli danych to dość trywialny temat, często spotykany po pozyskaniu danych z qwerendy, gdzie nie zmieniamy ich w zapytaniu SQL.
Można podpiąć podobną procedurę po odświeżeniu tabeli przestawnej w procedurze zdarzeniowej lub po imporcie wymuszonej kodem.
Oto kod:
Sub zamien_nazwy_naglowkow() 'MVP Oskar Shon from VBATools.pl Dim rng As Range 'od komórki A1 do ostatniej w wierszu 1 Set rng = Range(Cells(1, 1), Cells(1, Cells(1, Columns.Count).End(xlToLeft).Column)) 'Set rng = Range("a4:z4") 'przykład innego zakresu On Error Resume Next 'zmiana nazw Cells(1, rng.Find("nazwa_kol").Column) = "Nowa nazwa" Cells(1, rng.Find("inna nazwa").Column) = "Nowa inna nazwa" 'rng.Replace "nazwa_kol", "Nowa nazwa", xlWhole 'inny sposób 'zmiana znaków np: "_" w zadanym zakresie rng.Replace "_", " ", xlPart Set rng = Nothing End Sub

oraz pow przykład, który obrazuje działanie kodu.
(c) Shon Oskar – www.VBATools.pl
Wszelkie prawa zastrzeżone. Żadna część ani całość tego artykułu nie może być powielana ani publikowana bez zgody autora.
Podzielenie i połączenie dowolnego zakresu z danmi
napisane przez Oskar w dniu środa, 21 Marzec, 2012, w kategorii Porady - Excel
W programie Excel można użyć mechanizmu wbudowanego o nazwie „Tekst jako kolumny”. Gorzej jest z połączeniem danych. Nie ma takiej opcji w interfejsie Excela.
Poleca ci w takim razie małą procedurkę VBA do oddzielenia i połączenia jakichkolwiek danych w zakresie.
Podzielenie:
Sub podziel() Call Seperate(Selection, ",") 'range("a1:a7"), ",", True End Sub Sub Seperate(zakr As Range, seperator As String, _ Optional kill_spaces As Boolean) Dim el As Range, ile&, x&, s$ With Application .ScreenUpdating = False .EnableEvents = False End With For Each el In zakr s = el.Value If InStr(1, s, seperator) > 0 Then ile = UBound(Split(s, seperator)) For x = ile To 0 Step -1 If kill_spaces Then el.Offset(, x).Value = Trim(Split(s, seperator)(x)) Else el.Offset(, x).Value = Split(s, seperator)(x) End If Next x End If Next el With Application .ScreenUpdating = True .EnableEvents = True End With End Sub

Połączenie:
Sub polacz() Call Join_str(Selection, ",") 'range("a1:d7"), ",", True End Sub Sub Join_str(zakr As Range, seperator As String, _ Optional empty_too As Boolean) Dim x&, y&, tresc$ With Application .ScreenUpdating = False .EnableEvents = False End With For y = 0 To zakr.Rows.Count - 1 For x = 1 To zakr.Columns.Count If empty_too = False Then If Len(Trim(Cells(zakr.Row + y, zakr.Column + x - 1).Text)) = 0 Then GoTo dalej End If tresc = tresc & seperator & Cells(zakr.Row + y, zakr.Column + x - 1).Text Cells(zakr.Row + y, zakr.Column + x - 1).ClearContents Cells(zakr.Row + y, zakr.Column) = Right$(tresc, Len(tresc) - Len(seperator)) dalej: Next x tresc = "" Next y With Application .ScreenUpdating = True .EnableEvents = True End With End Sub

(c) Shon Oskar – www.VBATools.pl
Wszelkie prawa zastrzeżone. Żadna część ani całość tego artykułu nie może być powielana ani publikowana bez zgody autora.
Allegro i zagrożenia dla sprzedających
napisane przez Oskar w dniu piątek, 16 Marzec, 2012, w kategorii Informacje
Pojawił się nowy pomysł na ataki osób angażujących się w sprzedaż/zakup na największym, polskim portalu aukcyjnym Allegro.
Pomysłowość godna podziwu, jednakże skutki opłakane. Spamerzy jak i osoby atakujące wzięły się na sposób aby zamiast robotów generujących słownikowe zlepki przesyłać na adresy pozyskane ze słabo zabezpieczonych baz maile o ściśle określonym tekście: „Kupiłam od Państwa…” (czytaj dalej …)
Dodanie nowej linii tekstu do dokumentu
napisane przez Oskar w dniu piątek, 16 Marzec, 2012, w kategorii Porady - Word
Zastanawiacie się jak dodać tekst do istniejącego już dokumentu?
Otóż nic prostszego, jak użyć Ctrl+H i zastąpienie frazy, ta samą frazą + dodatkowymi wyrazami. Problem stanowi jednak dodanie znaku nowej linii, ponieważ nie jest ona możliwa tą metodą. Należy w tym celu sięgnąć do VBA. Poniżej znajduje się trywialny przykład ilustrujący taką edycje.
Pierwsza procedura tworzy tekst dokumentu (jaki możecie sobie darować) oraz wywołanie drugiej procedury z parametrami warunków osadzenia nowego tekstu.
Kd bez trudu można dopracować pod kątem dodania tekstu do każdego wyrazu lub podania do którego w kolejności ma być dodana pożądana fraza.
Sub Add_text() ActiveDocument.Select Selection.Text = "Ala ma kota" & vbNewLine & "a kot ma Ale" & vbNewLine & "itd" Call dodaj_tresc("ma kota", "Wacka", True, False, False) End Sub Sub dodaj_tresc(co_szukamy$, co_wsadzamy$, _ Optional z_tylu As Boolean, Optional z_przodu As Boolean, _ Optional wszystkie As Boolean) Dim doc As Document, gdzie&, zt, zp If z_tylu = True Then zt = vbNewLine If z_przodu = True Then zp = vbNewLine Set doc = ActiveDocument If wszystkie = True Then With Selection.Find .Text = co_szukamy .Replacement.Text = co_szukamy & zp & co_wsadzamy & zt .Wrap = wdFindContinue End With Selection.Find.Execute Replace:=wdReplaceAll Else gdzie = InStr(1, doc.Range.Text, co_szukamy) + Len(co_szukamy) If gdzie > 0 Then doc.Range(gdzie, gdzie).Select Selection.TypeText Text:=zp & co_wsadzamy & zt Exit Sub End If End If End Sub
Kod nadaje się świetnie do rozszerzenia funkcjonalności formularzy.
(c) Shon Oskar – www.VBATools.pl
Wszelkie prawa zastrzeżone. Żadna część ani całość tego artykułu nie może być powielana ani publikowana bez zgody autora
Drzewo arkuszy
napisane przez Oskar w dniu piątek, 2 Marzec, 2012, w kategorii Freeware (bezpłatne), Informacje, Narzędzia Excel
Przechodzenie pomiędzy arkuszami aktywnych skoroszytów
Oto dodatek, który po uruchomieniu reaguje na otwarte skoroszyty Excela. Przekazuje do niego nazwy arkuszy tych skoroszytów i daje możliwość kliknięcia w strukturze drzewa aby automatycznie przenieść użytkownika do tego arkusza. Jest to mechanizm samo aktualizujący się podczas zmiany nazwy czy dodania nowych arkuszy.
Możliwość przechodzenia jest dość pomocne w przypadku, kiedy użytkujemy wiele plików na raz i poruszanie się po arkuszach niesie za sobą nieusprawiedliwioną utratę czasu. Teraz przejście będzie możliwe za dwoma kliknięciami: skrót wywołujący okno i klikniecie myszy. (czytaj dalej …)
Przeprowadzka – czyli wiosenne porządki
napisane przez Oskar w dniu czwartek, 1 Marzec, 2012, w kategorii Informacje
Aktualnie odbywają się przenosiny na nowy serwer.
To też mogą wystąpić pewne niedogodności z pobieraniem plików czy komunikacji z portalem.
Proszę o uzbrojenie się w cierpliwość – do jutra problem powinien być zażegnany.
Jeśli w czasie tego okresu nie pojawiły się elementy przez was wstawione proszę wykonać czynność ponownie, a my bierzemy się do pracy….
Lista folderów Outlooka
napisane przez Oskar w dniu wtorek, 21 Luty, 2012, w kategorii Porady - Outlook
Poniżej znajduje się kod, który zwraca w oknie immediate [Ctrl+G] nazwy folderów. Ciekawą w jej konstrukcji jest zapętlenie wywołania funkcji, która sama wywołuje „siebie”, aby pobrać dane folderu podrzędnego.
W czym kod ten może być przydatny? Otóż do tworzenia archiwizacji czy eksportu danych do baz danych z zachowaniem pełnej struktury zapisu.
Sub OutlookFolders() Dim olNamespace As Outlook.NameSpace Dim olFolder As Outlook.Folders Dim objFolder As Outlook.MAPIFolder Set olNamespace = Application.GetNamespace("MAPI") Set olFolder = olNamespace.Folders For Each objFolder In olFolder Call LoopFolders(objFolder.Folders) Next Set olNamespace = Nothing Set olFolder = Nothing End Sub Private Sub LoopFolders(Folders As Outlook.Folders) Dim Fold As Outlook.MAPIFolder For Each Fold In Folders Debug.Print Fold.FolderPath DoEvents If Fold.Folders.Count Then _ LoopFolders Fold.Folders Next End Sub

Rys 1. Lista folderów.
Aby pobrać jedynie nazwę bez ścieżki należy zamiast FolderPath pobrać parametr Name lub w obecnym wymiarze pobrać funkcją InStrRev miejsce znaku „\”
(c) Shon Oskar – www.VBATools.pl
Wszelkie prawa zastrzeżone. Żadna część ani całość tego artykułu nie może być powielana ani publikowana bez zgody autora.
VBS Wywołanie polecenia w tle
napisane przez Oskar w dniu poniedziałek, 20 Luty, 2012, w kategorii Porady - Excel
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
Dim wks 'As Object
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\CurrentVersion\RunOnce
„C:\jakis_katalog\plik.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.
Jak działa Progressbar
napisane przez Oskar w dniu niedziela, 19 Luty, 2012, w kategorii Porady - Excel
Ten prosty przykład uzmysłowi wam jak działa pasek postępu. Elementarnym czynnikiem jest określenie wartości maksymalnej dla paska. W czasie przekazywania kolejnych parametrów, wartość paska będzie „dochodzić” do tej wartości.
Poniżej można znaleźć kod, który otwiera w zadeklarowanym katalogu pliki jakie spełniają określony warunek. Użyta w kodzie metoda FSO pozwala na przekazanie nazwy kolejnego pliku w pętli. Pliki są otwierane i zamykane bez zapisu. Parametr .value jest przekazywany.
Oto prosty przykład jak działa pasek postępu.

rys 1. Pasek postępu przypisany do otwieranych kolejno plików.
Option Explicit Private Sub UserForm_Initialize() 'Taki sposób nie jest dobry ponieważ kod zacznie działać zanim forma się wyświetli 'Call test_4progres End Sub Private Sub CommandButton1_Click() 'to jest dobry sposób - wymuszenie przyciskiem Call test_4progres End Sub Private Sub UserForm_Activate() 'to jest dobry sposób - zadziała zaraz po wywołaniu formy Call test_4progres End Sub Sub test_4progres() 'MVP OShon from VBATools.pl Const sciezka$ = "C:\Temp\" Dim ob As Object, pliki As Object, plik As Object Dim folder As Object, r& Set ob = CreateObject("Scripting.FilesystemObject") Set folder = ob.GetFolder(sciezka) Set pliki = ob.GetFolder(folder).Files ProgressBar1.Value = 0 'zerujemy pasek ProgressBar1.Max = 9 'określamy maximum postępu With Application .ScreenUpdating = False .EnableEvents = False .Calculation = xlCalculationManual .DisplayAlerts = False For Each plik In pliki DoEvents 'kluczowy parametr dzięki któremu będziemy widzieć postęp paska If Mid(LCase(plik), InStrRev(plik, ".") + 1, 3) = "xls" Then Workbooks.Open Filename:=(sciezka & plik.Name) 'otwieramy tylko pliki XLS ProgressBar1.Value = r 'przekazujemy kolejny parametr r = r + 1 ActiveWorkbook.Close False If r = 10 Then GoTo przerwij End If Next plik przerwij: .ScreenUpdating = True .Calculation = xlCalculationAutomatic .EnableEvents = True End With Set ob = Nothing Set folder = Nothing Set pliki = Nothing End Sub
Taką metodę można zastosować w Excelu, Outlooku, jak i w innych aplikacjach pakietu Office.
(c) Shon Oskar – www.VBATools.pl
Wszelkie prawa zastrzeżone. Żadna część ani całość tego artykułu nie może być powielana ani publikowana bez zgody autora.
