Jagodno
http://forum.vivaldiego.wroclaw.pl/

EXCEL-Poradnik
http://forum.vivaldiego.wroclaw.pl/viewtopic.php?f=2&t=403
Strona 1 z 4

Autor:  witq [ pn lip 12, 2004 6:56 pm ]
Tytuł:  EXCEL-Poradnik

tata prosi o pomoc osobe, ktora naprawde dobrze zna sie na excelu, ja nie wiem o tym nic, on wie sporo, ale na czyms sie zacial :)

z gory wielkie dzieki i piwo ;]

EDIT Krzysztof Marschal:
Po ustaleniu z Witkiem zmieniamy temat. Teraz można traktować topik jak poradnik do EXCELA.

Autor:  Pieszy [ pn lip 12, 2004 8:03 pm ]
Tytuł: 

W czym tkwi problem?

Autor:  Włodek [ pn lip 12, 2004 8:46 pm ]
Tytuł: 

Nazwać problem, to rozwiązać go w połowie...
Spróbuję.

Pracuję w skoroszycie z wieloma arkuszami. Chcę powiązać wartość komórki z inną w zależności od parametru, jakim jest wartość kolejnej , trzeciej komórki. Problem w tym, że chcę to zrobić dla ca 50 parametrów. Funkcja "wybierz" daje tylko 29 możliwości. Jak zrobić to inaczej :?: :?: :?:

Autor:  Pieszy [ pn lip 12, 2004 8:58 pm ]
Tytuł: 

jeszcze chwila, jestem blisko

Autor:  Pieszy [ pn lip 12, 2004 9:38 pm ]
Tytuł: 

Mam. Gdzie podesłać rozwiązanie?

Autor:  witq [ pn lip 12, 2004 11:40 pm ]
Tytuł: 

dzieki dzieki, wyslij na maila mailto:wgalecki@poczta.onet.pl :)

Autor:  dobrzyk [ wt lip 13, 2004 8:12 am ]
Tytuł: 

dajcie to ma forum - bo się zainteresowałem

Autor:  Pieszy [ wt lip 13, 2004 10:19 am ]
Tytuł: 

Rozwiązanie może nie jest eleganckie ale za to skuteczne. Oszukałem Excela komendą JEŻELI.
Wygląda to mniej więcej tak:

=JEŻELI(Arg<30;WYBIERZ(Arg;War1;War2;...,War29);JEŻELI(29>Arg>50;WYBIERZ(Arg-29;War30;War31;...,War50);“Poza zakresem“);0)

gdzie:
Arg – adres komórki z argumentem,
War1 – War50 – adresy komórek z wartościami zależnymi od argumentu.
Komenda JEŻELI powoduje sprawdzenie z jakiego zakresu jest argument. Dla argumentu z zakresu 1-29 wykonuje pierwszą komendę WYBIERZ a dla argumentu z zakresu 30-50 drugą. Ważne jest, żeby dla drugiej komendy WYBIERZ argument był pomniejszony o wartość 29.
Bardziej eleganckim rozwiązaniem byłoby skorzystanie z makr i Edytora Visual Basic ale tam za każdym razem kiedy się zmieni argument trzeba uruchamiać makro. Roboty przy tym też jest trochę więcej.

Autor:  dobrzyk [ pt sty 07, 2005 11:14 am ]
Tytuł: 

pozwolę - sobie w tym wątku zadać pytanie - może moderator zmieni tytuł na "porady dot. excela"

Chcę zrobić tak, aby dane z poszczególnych plików, raporty dzienne, oznaczone odpowiednią nazwą i rozpoznawalne po dacie np. "Raport Dobowy 02_01_2005_R01" eksportować do innego pliku który będzie "zbierał" odpowiednie dane w macierzy. Pewnie trzeba jakieś makro albo zrobić.

Nie chcę codziennie używać CTRL+C i CTRL+V - bo dostanę zwyrodnienia palców.

Autor:  Pieszy [ pt sty 07, 2005 1:28 pm ]
Tytuł: 

Chyba da się zrobić :idea: . Pobieranie danych z innych plików, nawet wielu nie stanowi problemu. Jedynym problemem może być zmieniająca się nazwa pliku, z którego mają zostać pobrane dane. Nigdy tego nie robiłem i nie bardzo wiem (w tej chwili) jak to zrobić w Visual Basic’u. Bez butelki piwa tego nie rozbiorę :lol: dlatego usiądę dopiero wieczorem i pomyślę. Jak coś wymyślę to dam znać.

Autor:  dobrzyk [ pt sty 07, 2005 1:33 pm ]
Tytuł: 

ok - to możesz kupić na mój koszt w zielonej budce :D

Autor:  rav [ pt sty 07, 2005 3:26 pm ]
Tytuł: 

Da się jeśli nazwa będzie w miare regularna, chociaż trzeba pokombinować. Ale masz Pieszy rację , bez VBA się nie obejdzie.

Autor:  dobrzyk [ pt sty 07, 2005 3:41 pm ]
Tytuł: 

tak jak napisałem "Raport Dobowy 02_01_2005_R01" - takie są nazwy - zmienia się data. każdy plik ma taki sam układ. nazwy, arkuszy, itp

Autor:  rav [ pt sty 07, 2005 3:46 pm ]
Tytuł: 

Mógłbym spróbować z tym powalczyć w weekend , tylko chcialbym znac struture pliku wejsciowego (z jakimis danymi z kosmosu oczywiscie) i strukture pliku wynikowego. Rozumiem ze na plik wyjsciowy składaje sie rekordy z plików wejsciowych ?

Autor:  Pieszy [ sob sty 08, 2005 1:55 pm ]
Tytuł: 

:idea: Mam 8) :idea:
Dopracuję szczegóły i opiszę rozwiązanie.

Autor:  Pieszy [ sob sty 08, 2005 3:34 pm ]
Tytuł: 

Ok.

Przy założeniu, że w katalogu
c:\raporty\
znajduje się dowolna liczba plików o nazwach zaczynających się ciągiem znaków „Raport Dobowy”, oraz mających następującą strukturę:

.....|....A........|...B....|...
1...|.dana1...|.........|...
2...|.dana2...|.........|...
3...|.dana3...|.........|...
4...|.dana4...|.........|...
5...|.dana5...|.........|...
6...|.dana6...|.........|...
7...|.dana7...|.........|...
8...|.dana8...|.........|...
9...|.dana9...|.........|...
10.|.dana10.|.........|...
11.|..............|.........|...

makro, które pozwoli zebrać dane z tych plików w jednym arkuszu, powinno mieć następujący zapis:


Private Sub CommandButton1_Click()

Set fs = Application.FileSearch
With fs
.LookIn = "c:\raporty"
.Filename = "Raport Dobowy*.xls"
If .Execute > 0 Then
MsgBox "Odnalazłem " & .FoundFiles.Count & " plików."
Msg = "Czy pobrać dane ze znalezionych plików?"
Style = vbYesNo + vbQuestion + vbDefaultButton1
Title = "Co Dalej?"
Response = MsgBox(Msg, Style, Title)
If Response = vbYes Then
GoTo pobranie
Else
GoTo koniec
End If

pobranie:
For i = 1 To .FoundFiles.Count
Workbooks.Open .FoundFiles(i)
ActiveSheet.Range("B1").Select
kolumna = kolumna + 1
Dana1 = ActiveCell.Value
Dana2 = ActiveCell.Offset(1, 0).Value
Dana3 = ActiveCell.Offset(2, 0).Value
Dana4 = ActiveCell.Offset(3, 0).Value
Dana5 = ActiveCell.Offset(4, 0).Value
Dana6 = ActiveCell.Offset(5, 0).Value
Dana7 = ActiveCell.Offset(6, 0).Value
Dana8 = ActiveCell.Offset(7, 0).Value
Dana9 = ActiveCell.Offset(8, 0).Value
Dana10 = ActiveCell.Offset(9, 0).Value
ActiveWindow.Close
Range("A1").Select
ActiveCell.Offset(0, kolumna).Value = Dana1
ActiveCell.Offset(1, kolumna).Value = Dana2
ActiveCell.Offset(2, kolumna).Value = Dana3
ActiveCell.Offset(3, kolumna).Value = Dana4
ActiveCell.Offset(4, kolumna).Value = Dana5
ActiveCell.Offset(5, kolumna).Value = Dana6
ActiveCell.Offset(6, kolumna).Value = Dana7
ActiveCell.Offset(7, kolumna).Value = Dana8
ActiveCell.Offset(8, kolumna).Value = Dana9
ActiveCell.Offset(9, kolumna).Value = Dana10
Next i

Else
MsgBox "Nie odnalazłem plików z danymi."
End If
End With

koniec:


End Sub
------------------------------------

Pytajcie, jeżeli czegoś nie rozumiecie.


8)

Autor:  dobrzyk [ sob sty 08, 2005 7:22 pm ]
Tytuł: 

trochę czarna magia - musze chyba poczytać literaturę na ten temat.

Autor:  Pieszy [ ndz sty 09, 2005 3:32 pm ]
Tytuł: 

Wieczorem opiszę krok po kroku każdą linię.

Autor:  dobrzyk [ czw sty 13, 2005 9:40 pm ]
Tytuł: 

wracając do sprawy. bo ostatnio nie zajmowałem się tym nie zajmowałem. mozna liczyć na ten opis???

Autor:  Pieszy [ pt sty 14, 2005 2:30 am ]
Tytuł: 

Oczywiście. Przepraszam, wtedy nie miałem czasu a później zapomniałem :oops:



Uruchomienie funkcji poszukiwania plików:
Set fs = Application.FileSearch
With fs


Określenie parametrów poszukiwania. Ścieżka dostępu (catalog):
.LookIn = "c:\raporty"

I nazwa pliku. Plik zaczyna się ciągiem znaków “Raport Dobowy”. Gwiazdka oznacza dowolny ciąg znaków a „.xls” oznacza rozszerzenie poszukiwanych plików:
.Filename = "Raport Dobowy*.xls"

Tu zaczyna się duży warunek. Jeżeli wynik poszukiwań jest dodatni, czyli zostały znalezione pliki spełniające podane wyżej kryteria:
If .Execute > 0 Then

to zostaje wyświetlone okno z informacją o odnalezieniu plików i ich ilości. Tekst ma postać „Odnalazłem x plików” :
MsgBox "Odnalazłem " & .FoundFiles.Count & " plików."

Tutaj otwiera się okno z pytaniem “Czy pobrać dane ze znalezionych plików?”.
Okno ma tytuł „Co dalej?”. Ma 2 przyciski: „Tak” i „Nie”. Jest oknem pytania. Jego domyślną odpowiedzią jest „Tak”.:

Msg = "Czy pobrać dane ze znalezionych plików?"
Style = vbYesNo + vbQuestion + vbDefaultButton1
Title = "Co Dalej?"


Wynikiem pytania zadanego w otwartym oknie jest odpowiedź „Response”:
Response = MsgBox(Msg, Style, Title)

Tutaj zaczyna się mały warunek. Jeżeli odpowiedzią jest „Tak” to idź do „pobranie”:
If Response = vbYes Then
GoTo pobranie


W przeciwnym wypadku idź do „koniec”:
Else
GoTo koniec


Koniec małego warunku:
End If

POBRANIE:
pobranie:

Tu zaczyna się pętla. Będzie wykonana tyle razy ile plików zostało odnalezionych:
For i = 1 To .FoundFiles.Count

Otwórz odnaleziony plik:
Workbooks.Open .FoundFiles(i)

Zaznacz w nim komórkę „B1”.
ActiveSheet.Range("B1").Select

Przy każdym kolejnym wykonaniu pętli wartość „kolumna” zwiększy się o jeden. Pozwoli to na zapisanie danych z każdego następnego pliku w osobnej kolumnie pliku zbiorczego.:
kolumna = kolumna + 1

Dana w zaznaczonej komórce „B1” dostaje nazwę Dana1:
Dana1 = ActiveCell.Value

Dana znajdująca się o jeden wiersz pod „B1” dostaje nazwę Dana2:
Dana2 = ActiveCell.Offset(1, 0).Value

Dana znajdująca się o dwa wiersze pod „B1” dostaje nazwę Dana3. Każda następna linia określa nazwę kolejnych danych. Offset to nic innego jak przsunięcie – jak w szachach: (a,b) gdzie a to nr wiersza a b to nr kolumny. Zamiast wiersza można zmieniać kolumny lub i jedno i drugie równocześnie. Można też za każdym razem do określenia położenia interesującej nas danej, używać polecenia „ActiveSheet.Range("X").Select” i „N = ActiveCell.Value”
, gdzie X oznacza adres komórki z daną a N nazwę danej.

Dana3 = ActiveCell.Offset(2, 0).Value
Dana4 = ActiveCell.Offset(3, 0).Value
Dana5 = ActiveCell.Offset(4, 0).Value
Dana6 = ActiveCell.Offset(5, 0).Value
Dana7 = ActiveCell.Offset(6, 0).Value
Dana8 = ActiveCell.Offset(7, 0).Value
Dana9 = ActiveCell.Offset(8, 0).Value
Dana10 = ActiveCell.Offset(9, 0).Value


Po zebraniu danych zamyka się okno pliku źródłowego:
ActiveWindow.Close

W oknie pliku zbiorczego zaznaczona zostaje komórka „A1”:
Range("A1").Select

Komórki znajdujące się w odsunięciu (a,b) od komórki „A1” dostają wartości Dana1, Dana2 itd. Ich adresy podawane są Tak jak przy zbieraniu danych: Offset(a,b), gdzie a to wiersz, b to kolumna (inna dla każdego pliku):
ActiveCell.Offset(0, kolumna).Value = Dana1
ActiveCell.Offset(1, kolumna).Value = Dana2
ActiveCell.Offset(2, kolumna).Value = Dana3
ActiveCell.Offset(3, kolumna).Value = Dana4
ActiveCell.Offset(4, kolumna).Value = Dana5
ActiveCell.Offset(5, kolumna).Value = Dana6
ActiveCell.Offset(6, kolumna).Value = Dana7
ActiveCell.Offset(7, kolumna).Value = Dana8
ActiveCell.Offset(8, kolumna).Value = Dana9
ActiveCell.Offset(9, kolumna).Value = Dana10


Koniec pętli. Przejście do kolejnego pliku.
Next i

Alternatywa dla dużego warunku. Jeżeli nie zostanie odnaleziony choćby jeden plik spełniający warunki poszukiwań:
Else

To zostaje wyświetlony komunikat:
MsgBox "Nie odnalazłem plików z danymi."

Koniec dużego warunku:
End If

„Wyłączenie” funkcji poszukiwań plików:
End With

KONIEC:
koniec:

Koniec makra:
End Sub


Oczywiście to makro wcale nie musi otwierać okien informacyjnych czy też pytać o to, czy pobrać dane z plików. Mozna to poprostu pominąć.
Uruchamiane może być przyciskiem zagnieżdżonym w arkuszu pliku zbiorczego lub automatycznie przy otwieraniu tegoż pliku.

Mam nadzieję, że ten opis jest na tyle przejrzysty i jasny, że wszystko jest już wiadome. Jeżeli nie (niestety, nie posiadam daru przekazywania wiedzy :cry: ) to zapraszam do mnie osobiście. Może wtedy będzie łatwiej.

Strona 1 z 4 Strefa czasowa UTC+2godz.
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/