napisał: admin postów: 613
umieszczony: 22 września 2010 12:37
|
|
To jest dziwne, bo na polskim Windowsie działa jak podałeś, na systemie niemieckim działa tak jak ja podałem.
Jeśli chodzi o niejawna konwersje, to chodzi tu w ogóle o to, ze ComboBox1.Value zwraca wartość typu Variant/String.
Jeśli z tak uzyskanymi danymi chcesz przeprowadzać jakieś operacje matematyczne zostaną one niejawnie przekonwertowane na typ numeryczny.
Patrz tutaj:
http://pl.wikipedia.org/wiki/Konwersja_typu
Cytat:to dziwne ponieważ u mnie taki kod
Sub test()
z = "3,1415"
a = "3.1415"
If Not IsNumeric(z) Then z = Val(z)
If Not IsNumeric(a) Then a = Val(a)
MsgBox z & " " & CDbl(z) & vbCrLf & a & " " & CDbl(a)
End Sub
daje poprawne wyniki, czyli 3,1415 w obu przypadkach. Dowód w załączniku.
Nie rozumiem dlaczego uważasz, że świadome wywołanie ComboBox1.Value jest jakąś niejawną metodę. W ten sposób myśląc CDbl(z) też jest niejawna konwersją.
Napisz mi proszę dlaczego moje wyniki są poprawne a twoje nie? |
|
napisał: Harry postów: 42
umieszczony: 22 września 2010 09:33
|
|
nazwa pliku |
rozmiar | pi.jpg |
4.49 kB | to dziwne ponieważ u mnie taki kod
Sub test()
z = "3,1415"
a = "3.1415"
If Not IsNumeric(z) Then z = Val(z)
If Not IsNumeric(a) Then a = Val(a)
MsgBox z & " " & CDbl(z) & vbCrLf & a & " " & CDbl(a)
End Sub
daje poprawne wyniki, czyli 3,1415 w obu przypadkach. Dowód w załączniku.
Nie rozumiem dlaczego uważasz, że świadome wywołanie ComboBox1.Value jest jakąś niejawną metodę. W ten sposób myśląc CDbl(z) też jest niejawna konwersją.
Napisz mi proszę dlaczego moje wyniki są poprawne a twoje nie? |
|
napisał: admin postów: 613
umieszczony: 22 września 2010 08:46
|
|
Właśnie zamieszczony przez Ciebie przykład nie daje prawidłowych wyników:
Jeśli w ComboBox1 wpiszesz 1,1 to ma MsgBoksie wyświetla się wartość 1,1 i 1,1.
Ale jeśli wprowadzisz 1.1 to jak wynik uzyskasz 1.1 i 11.
Przypomnę Ci tylko, ze w pierwszym przypadku dokonujesz niejawnej konwersji. |
|
napisał: Harry postów: 42
umieszczony: 22 września 2010 07:49
edytowany: 22 września 2010 07:55
|
|
Zakładając, tak jak zrobił to autor, że wszystkie wartości w ComboBox są liczbami nie widzę celu w pisaniu procedury, która będzie zabezpieczać się na wypadek gdy ktoś do combobox wprowadzi np. opis swojego samopoczucia ale zgadzam się, że gdyby tak miało być należy to tez oprogramować.
Dlaczego według ciebie, nieprofesjonalne jest w wykorzystywaniu rozwiązań i funkcji, które są dostępne i działają poprawnie.
Gdy do twojego przykładu wstawimy mój if.. :
Cytat:z=Combobox1.Value
If IsNumeric(ComboBox1.Text) Then z = ComboBox1.Value Else z = Val(ComboBox1.Text)
Cytat:MsgBox z & " " & CDbl(z)
to przy głównym założeniu wszystko działa poprawnie. |
|
napisał: admin postów: 613
umieszczony: 21 września 2010 17:55
edytowany: 22 września 2010 07:49
|
|
Witam,
To wszystko nie jest takie proste, jak by się mogło wydawać.
1. Metoda .Value zwraca typ danych String, a nie wartość numeryczną. Opierasz się Harry na niejawnej konwersji danych ze String na wartość numeryczna. Jest to podejście nieprofesjonalne.
Sprawdź poniższy przykład:
- jeśli wartość Combobox1.Value jest równa 11.3 (z kropka),
- jeśli wartość Combobox1.Value jest równa 11,3 (z przecinkiem).
z=Combobox1.Value
MsgBox z & " " & CDbl(z) & " " & Val(z)
Funkcja Val zamienia poprawnie na postać liczbowa ciągi znaków (String) tylko wówczas, gdy znakiem dziesiętnym jest kropka.
Funkcja CDbl zamienia poprawnie na postać liczbowa ciągi znaków (String) tylko wówczas, gdy znakiem dziesiętnym jest znak dziesiętny ustawiony w Panelu sterowania Windows.
Płynie z tego taki wniosek, ze funkcji Val w tym przypadku nie należy używać.
Do konwersji lepiej użyć funkcji CDbl.
Funkcji IsNumeric należy użyć do sprawdzania poprawności wprowadzonych danych.
W zależności od ustawień systemu program przyjmie dana z kropką lub przecinkiem jako znakiem dziesiętnym.
Jeśli natomiast chcesz się uniezależnić od rodzaju znaku dziesiętnego (chociaż nie wiem po co) należy napisać następującą procedurę:
1. Sprawdzamy, czy dana jest wartością numeryczna.,
2. Jeśli tak - idziemy dalej,
3. Jeśli nie - zamieniamy wszystkie kropki w danej na przecinki,
4. Sprawdzamy, czy dana jest wartoscia numeryczna,
5. Jeśli tak - idziemy dalej,
6. Jeśli nie - zamieniamy wszystkie przecinki w danej na kropki,
7. Sprawdzamy, czy dana jest wartością numeryczna,
8. Jeśli tak - idziemy dalej,
8. Jeśli nie - DANA NIE MA POSTACI LICZBOWEJ.
Cytat:ja bym zastosował coś takiego
If IsNumeric(ComboBox1.Value) Then z = ComboBox1.Value Else z = Val(ComboBox1.Value)
przykład w załączniku |
|
napisał: Harry postów: 42
umieszczony: 21 września 2010 07:52
|
|
ja bym zastosował coś takiego
If IsNumeric(ComboBox1.Value) Then z = ComboBox1.Value Else z = Val(ComboBox1.Value)
przykład w załączniku |
|
napisał: jackiller postów: 3
umieszczony: 18 września 2010 12:40
|
|
Jeśli
a=combobox1.value -> i w tym przypadku a - jest stringiem
to w kolejnymm kroku po prostu stosujesz funkcję np
a= Cint(a)
Cbyte, Csng... etc
Wiem że post z 2005 roku ale problem jest problemem |
|
napisał: r_c postów: 38
umieszczony: 19 września 2005 22:10
|
|
W edytorze VBA liczby np. 125,12 deklarujemy 125.12 (zamiast przecinka używamy kropkę). Przecinek możemy uzyskać tylko dla
zmiennych typu String np. "125,12". I prawdopodobnie tu jest problem.Zamień przecinki na kropki.
r_c |
|
napisał: du_gy postów: 22
umieszczony: 19 września 2005 21:01
|
|
chcialem zrobic tak: skonwertowac string (z comboboxa) do np doule uzywajac CDbl:
Dim nazwa1 As String
Dim wartosc1 As String
Dim wartosc2 As Double
nazwa1 = CBoxNazwa.Value
wartosc1 = CBoxwartosc.Value
wartosc2 = CDbl(wartosc1)
wszystko idze dobrze, ale jak wartosc1 jest 2,5 lub cokolwiek z przecinkiem to wywala mi blad 13 /niezgodnosc typow/
..o co chodzi? |
|
napisał: du_gy postów: 22
umieszczony: 19 września 2005 20:12
|
|
czesc
mam tak : w combobox sa do wyboru rozne liczby..jednak nie da sie ich przypisac do zadnej zmiennej typu integer, single..itd....jedyne co moge to przypisac ta wartosc do zmiennej typu string; co dla mnie oznacza ze nie moge wykonac na niej zadnej operacji matematycznej
ktos mi pomoze i wytlumaczy jak rozwiazac ten problem (chce zeby do zmiennej typu integer przypisac wybrana z combobox wartosc)
dzieki |
|
wstecz 1 dalej wszystkich stron: 1
|
|