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 danychInput #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
|
|
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
|
|
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
|
|
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ł: Trebor postów: 1209
umieszczony: 15 kwietnia 2011 21:37
|
|
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
|
|
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
|
|