vbamania.pl
login:
hasło:
 
  *Rejestracja *Zapomniane hasło
 Dziś jest poniedziałek, 13 maja 2024 roku.
Ustaw jako stronę startową Ulubione Napisz
PowrótPowrót do serwisu  RegulaminRegulamin rssRSS

  tytuł wątku:
Wątki dyskusji

VBA - początki


otwartyotwarty rozpoczął: gcz4 postów: 16



napisał: gcz4
postów: 14


umieszczony:
22 kwietnia 2011
09:48

  
Dzięki Trebor! Po wielu próbach i Twoich licznych w 100% trafnych wskazówkach w końcu osiągnąłem zamierzony cel.
napisał: Trebor
postów: 1209


umieszczony:
21 kwietnia 2011
16:42

  
Mam nadzieję, że wiesz co robi text1 w zapisie
List1.AddItem data, tekst1


Czy przez przypadek pominąłeś deklarację
Dim tabl()

.
Sprawdź gdzie ją umieściłem w moim kodzie i zapewniam Cię, że to miejsce nie jest przypadkowe.
Teraz odczytywanie danych
Input #1, data


Czytasz tylko jedną daną w obiegu pętli, w drugim obiegu drugą i tak dalej.
Założyłem, z góry strukturę danych i po ich odczytaniu umieszczałem je w odpowiednim miejscu. Jeśli nie jesteś zdecydowany ile zmiennych będziesz zapisywał odczytywał pokombinuj z Line Input. W ten sposób przypiszesz do jednej zmiennej całą linię, którą później rozpiszesz na poszczególne dane wykorzystując np. split.
To trochę dużo różnych zawiłości, ale tak najlepiej się wdrażać.
napisał: gcz4
postów: 14


umieszczony:
21 kwietnia 2011
10:42

edytowany:
21 kwietnia 2011
12:34

  
Cały czas walczę i na razie niestety przegrywam tą nierówną walkę z VBA
Dla uproszczenia zrobiłem sobie form1. Na niej umieściłem ListBox1, textbox1 i command1.
pod command1 ukryty jest następujący kod:
Private Sub Command1_Click()
Dim data
data = Date
List1.AddItem data
Open "C:\Data.txt" For Append As #1
Write #1, Format(Date, "dd mmm yyyy"), Text1.Text
Close #1
End Sub


tu nie ma problemu do pliku Data. txt zapisywana jest aktualny data i tekst który wpisałem do textbox1. (np:"21 kwi 2011","aaa")
Kod który wykonywany jest przy uruchamianiu programu jest następujący
Private Sub Form_Load()
Dim data, tekst1, licznik As Long
If Dir("C:\Data.txt") <> "" Then
List1.Clear
Open ("C:\Data.txt") For Input As #1
 Do Until EOF(1)
 Input #1, data
List1.AddItem data, tekst1
ReDim Preserve tabl(0 To 1, 0 To licznik)
tabl(0, licznik) = tekst1
licznik = licznik + 1
Loop
Close #1
End If
End Sub


Efekt jest taki że jak uruchomię program to w listbox1 pojawia się: od góry puste pole niżej aktualna data i jeszcze niżej tekst "aaa"
I co z tym zrobić.
Kombinuję jeszcze tak: We właściwościach Listbox1 nie mam wprawdzie pozycji ColumnCount ale mam pozycję Columns ( teraz mam wpisaną wartość 1) i pozycję Index ( teraz ta pozycja jest pusta). Może tu powinienem coś wpisać
jak analizuję program krokowo to po najechaniu na cały zapis kodu:
tabl(0, List1.ListIndex)
to wyświetla mi się " tabl(0, List1.ListIndex)=<Subscrit out of range>
po najechania na sam List1.ListIndex wyświetla się List1.ListIndex=1
napisał: Trebor
postów: 1209


umieszczony:
20 kwietnia 2011
16:04

  
nazwa pliku rozmiar
Program.rar 21.63 kB

Być może, że listbox nie obsługuje wielu kolumn. Spróbuj może z tablicą
napisał: Trebor
postów: 1209


umieszczony:
19 kwietnia 2011
20:33

  
Zaryzykowałem podpowiedź nie mając programu, którego używasz i pewnie nie trafiłem. Jedyne co mogę zrobić to opisać linię która szwankuje.
ListBox1.List(ListBox1.ListCount - 1, 1) = dana1


Chodzi w niej, aby w ostatnim wierszu Listboxa w kolumnie drugiej ( druga kolumn ma index 1 ponieważ kolumny numerowane są od 0) dopisać daną1, w kolumnie trzeciej daną2. Sadziłem, że program którego używasz wymaga, aby kolumny były wskazane we właściwości ColumnCount jako 3. Listbox1.listcount to po prostu wszystkie wiersze w listbox pomniejszone o 1 gdyż numerowane od zera. Jedynka to nr kolumny. Spróbuj zamienić to w czasie testów na liczby. Możesz również zamiast ListBox1.ListCount wprowadzić sobie licznik wierszy typu licznik = licznik + 1. Gdy będziesz analizował program krokowo, najedź kursorem myszy nad dane wyrażenie, wtedy w etykiecie powinno pokazać się jaką ma aktualnie wartość i ewentualnie skoryguj. Może na początek usuń z kodu -1.
napisał: gcz4
postów: 14


umieszczony:
19 kwietnia 2011
19:25

  
Cytat:
zwróć uwagę na właściwość ColumnCount formantu ListBox1.
Hej

Wiem, że dla niektórych moje pytania mogą się wydawać bardzo głupie ale ja dopiero zaczynam zabawę z VBa. Nie wiem czy to już zmęczenie materiału ale nadal nie bardzo wiem o co chodzi . Dziękuję jednak za podpowiedź i cierpliwość. Będę próbował dalej.
A tak apropos to czy może ktoś polecić jakąś dobrą książkę VBA(lub inne materiały, kursy) - encyklopedię wiedzy dla początkujących. Ja jestem po lekturze "Krok po kroku Visual Basic 6.0" - nie znalazłem jednak w niej odpowiedzi na wszystkie nurtujące mnie pytania.
napisał: Trebor
postów: 1209


umieszczony:
19 kwietnia 2011
18:45

  
zwróć uwagę na właściwość ColumnCount formantu ListBox1.
Hej
napisał: gcz4
postów: 14


umieszczony:
19 kwietnia 2011
18:00

  
Cytat:
W dalszym ciągu twierdzę, że nie jest potrzebne tyle plików.
Sprawdź poprawki w załączniku.

Właśnie o to mi chodziło. Ten kod jest tym czego szukałem. Siedzę jednak od dwóch dni, gdyż kod ten nie działa poprawnie jak go zaczynam pisać VB w VisualStudio a nie w Excel'u. W miejscu:

ListBox1.List(ListBox1.ListCount - 1, 1) = dana1


Wyświetla mi następujący błąd
" Wrong number of arguments or invalid property assignment"

Sprawdzałem ten kod chyba ze sto razy. I nie mam już pomysłu co robię źle. Nawet jak w całości po prostu skopiuje ten kod do VB w Visual Basic i ponazywam poszczególne elementy formy tak jak w załączonym przykładzie to zawsze wyświetla mi błąd jak powyżej napisałem.
napisał: Trebor
postów: 1209


umieszczony:
17 kwietnia 2011
18:47

  
nazwa pliku rozmiar
Program.rar 20.83 kB

W dalszym ciągu twierdzę, że nie jest potrzebne tyle plików.
Sprawdź poprawki w załączniku.
napisał: gcz4
postów: 14


umieszczony:
17 kwietnia 2011
16:20

  
Cytat:
Jak dla mnie to za dużo tych plików tekstowych.
Czy nie lepiej realizować to na jednym o stałej nazwie.
Reszta to interpretacja danych dla makra (daty, nazwy, powtórzenia)

Nie do końca o to mi chodziło ale może niezbyt jasno naświetliłem problem. Spróbuję jeszcze raz wyjaśnić.
Teraz program działa tak:
Wpisuję jakiś tekst do textbox1 i textbox2. Wciskam przycisk CommandButton1 i w okienku ListBox1 pojawia mi się aktualna data i teksty które wcześniej wpisałem.
Ja bym chciał aby w ListBox1 pojawiała się tylko sama data. Po ponownym uruchomieniu programu w ListBox1 widzę tą wcześniej zapisaną datę i dopiero gdy ją podświetlę (kliknę na nią) w polach textbox1 i textbox2 pojawiają się teksty, które były wpisane przy pierwszym uruchomieniu programu.
Dla każdej następnej zapisanej daty przyporządkowuje kolejne dwie wartości textbox1 i textbox2.
Stąd moje założenie o tworzeniu za każdym razem pliku txt o nazwie aktualnej daty.
To jeszcze mały przykład obrazujące moje założenia:
Załóżmy, że dzisiaj uruchamiam po raz pierwszy program (dziś jest 17-04-2011), wpisuje w txtbox1 treść A a w txtbox2 treść B. Wciskam CommandButton1 i na dzisiaj kończę.
Otwieram nasz program jutro (18-04-2011), wpisuje w txtbox1 treść C a w txtbox2 treść d. Wciskam CommandButton1 i kończę.
Następnie zasiadam do kompa pojutrze, otwieram program i w okienku ListBox1 widzę dwie daty 17-04-2011 i 18-04-2011. Jak nacisnę datę 17-04-2011 to w textbox1 zobaczę A a textbox2 zobaczę B. Jak nacisnę datę 18-04-2011 to w textbox1 zobaczę C a textbox2 zobaczę D.
Jak to zrobić??
napisał: Trebor
postów: 1209


umieszczony:
17 kwietnia 2011
08:34

  
nazwa pliku rozmiar
Program.rar 16.64 kB

Jak dla mnie to za dużo tych plików tekstowych.
Czy nie lepiej realizować to na jednym o stałej nazwie.
Reszta to interpretacja danych dla makra (daty, nazwy, powtórzenia)
napisał: gcz4
postów: 14


umieszczony:
16 kwietnia 2011
18:27

  
Ponownie bardzo dziękuję za trafne wskazówki. Po wielu próbach w końcu się udało.
Teraz mam kolejny cel no i oczywiście kolejne problemy.
Na form1 mam jeden ListBox, dwa TexBox'y i jeden Command. Chciałbym aby po kliknięciu przycisku Command na w polu ListBox pojawiała się aktualna data- tą część udało mi się napisać- i dalej...... mam problem(mój kod poniżej):
Private Sub Command1_Click()
Data = Date
List1.AddItem Data
Open "C:\" & Data & ".txt" For Output As #1
Write #1, Data
Close #1
End Sub


Ta data wyświetlona w ListBox'ie i zapisywana jest w pliku txt o nazwie aktualnej daty.
I teraz:
1. Co zrobić aby ta zapisana data była wyświetlana w ListBox'ie po ponownym uruchomieniu programu?
2. Do pliku txt powinienem móc dopisywać kolejne daty (np.w następnych dniach).
3. Załóżmy, że ListBox'ie mam zapisane trzy różne daty. Do każdej z tej daty chcę przypisać różne wartości TextBox'ów.
np.: Wybieram pierwszą datę >> do TextBox1 i TextBox2 importowana są odpowiednie dane z pliku C:\A.txt .
Wybieram drugą datę >> do TextBox1 i TextBox2 importowana są odpowiednie dane z pliku C:\B.txt .
Wybieram trzecią datę >> do TextBox1 i TextBox2 importowana są odpowiednie dane z pliku C:\c.txt .
Bardzo proszę o pomoc.
napisał: Trebor
postów: 1209


umieszczony:
15 kwietnia 2011
21:37

  
nazwa pliku rozmiar
Program.rar 12.53 kB

Pokombinuj z tym x w nawiasie.
Sprawdź też rozwiązanie z załącznika.
napisał: gcz4
postów: 14


umieszczony:
15 kwietnia 2011
20:13

edytowany:
15 kwietnia 2011
20:50

  
Dzięki za podpowiedź. Bardzo mi pomogła.
Przede mną jednak następne zadanie. Chciałbym aby na form1 był combobox, który po rozwinięciu zawiera listę produktów (ok 100 pozycji które są podczytywane z pliku: produkty.txt.) Jak kliknę na wybrany produkt to jego nazwa ma się przepisać do pola texbox na form2.
Pewnie dla większości to jest banalne zadanie ale ja jestem początkujący i nie wiem jak to zrobić. Bardzo proszę o pomoc.
Do wczytania do combobox danych z pliku txt napisałem coś takiego:
Private Sub Combo1_Click()
Dim tablicaDanych(100)
Open "C:\produkty.txt" For Input As #1
   Do Until EOF(1) = True
   Input #1, tablicaDanych(x)
   Loop
   Close
End Sub


Niestety nie działa. Co robię nie tak??
napisał: Trebor
postów: 1209


umieszczony:
12 kwietnia 2011
19:01

  
nazwa pliku rozmiar
Program.rar 10.81 kB

Trochę inaczej jak pisałeś, ale może będzie Ci odpowiadać.
Trzeba to jeszcze wygładzić, ale ogólny zarys pomysłu wykonania już jest.
napisał: gcz4
postów: 14


umieszczony:
12 kwietnia 2011
17:28

  
Witam
Na Form1 mam przycisk: "Zapisz dane" oraz dwa pola TextBox. Chciałbym aby po uruchomieniu programu pojawił się InputBox z prośbą o podanie Imienia i Nazwiska. Po wprowadzeniu tych danych ma być utworzony plik .txt o nazwie wpisanej do InputBox'a. Jeśli plik o nazwie wprowadzonej do InputBox już istnieje w zadanej lokalizacji to wtedy przycisk "Zapisz dane" byłby nieaktywny a do komórek TexBoX1 i texBox2 importowane były wartości wcześniej wprowadzone i zapisane do pliku txt.
Pewną część udało mi się napisać ale tylko przez "przypisanie do przycisku" na form1. Jak zrobić aby poniższa procedura uruchamiała się w momencie uruchomienia programu
Cytat:

Private Sub Command1_Click()
ImieiNazwisko = InputBox("Podaj Imię i Nazwisko")
nazwa = ImieiNazwiskoPacjenta
If Dir("C:\Documents and Settings\xxx\Pulpit\Nowy folder\yyy" & "\" & nazwa & ".txt") = Empty Then
Command1.Enabled = False
Else: Command1.Enabled = True
end if
Open "C:\Documents and Settings\xxx\Pulpit\Nowy folder\yyy" & "\" & nazwa & ".txt" For Output As #1
End Sub

Dalej chciałbym aby w przypadku gdy nie ma pliku o danej nazwie, to przycisk "Zapisz dane" - jest aktywny, teksty który wpiszę w texbox1 i texbox2 i po wciśnięciu przycisku "Zapisz dane" zostaną zapisane do pliku txt , który został utworzony wg powyższej procedury.
Jak uzupełnić powyższy program żeby to zadziałało jak opisałem.


<-wstecz  1  dalej->
wszystkich stron: 1


Sortuj posty: z