Oppure

Loading
26/12/10 8:51
piter123
Salve, non riesco a capire per quale motivo se genero una matrice di numeri data dal contatore di un ciclo for next moltiplicata per un numero decimale fisso mi generi numeri strani e di conseguenza non vengano poi riconosciuti in un if then, allego il codice

su un modulo inserisco l'apertura di un foglio excel

'DICHIARAZIONE VARIBILI
Option Explicit
'Per lavorare con Excel attivare in Progetto-Riferimenti Microsoft Excel 11.0 Object Library
Public AppExcel As Excel.Application
Public FileExcel As Excel.Workbook
Public Xls As Excel.Worksheet

Public Sub Apertura_Excel()
Set AppExcel = New Excel.Application
Set FileExcel = AppExcel.Workbooks.Add
FileExcel.SaveAs (App.Path & "\XlsOptScan.xls";)
Set Xls = FileExcel.Worksheets(1)
End Sub

sulla form di avvio

Private Sub Form_Load()
call Apertura_Excel
call Prova
End Sub

Public Sub Prova()
Dim matr_prova(100) As Single
Dim passo As Single
passo = 0.1
For X = 0 To 100
matr_prova(X) = passo * X
Xls.Cells(X + 1, 17) = matr_prova(X)
If matr_prova(X) = 1.8 Then Exit For
Next X
end sub


il codice di sub prova cra matrice e la scrive su excel e già quà compaiono numeri da 0 con passo 0,1 ma se andiamo sulla cella di un qualsiasi numero questo per esempio invece di essere 1,8 è 1,80000007152557 (uso sistema metrico italia), inoltre di conseguenza la riga If matr_prova(X) = 1.8 Then Exit For non viene mai eseguita nella sua parte then e il ciclo non viene abortito, come mai ?

Grazie
aaa
26/12/10 13:09
GrG
Specifica se per numeri strani intendi numeri totalmente diversi da quello che ti aspetti oppure se ottieni sempre i numeri che ti servono ma con più cifre decimali come nell'esempio che hai fatto

in quest'ultimo caso penso devi usare la funzione Format()
msdn.microsoft.com/it-it/library/…
aaa
26/12/10 16:18
piter123
ciao, tutti i numeri non corrisposndono, solo quelli interi 1,2,3 ecc e 1,5 2,5 ecc, gli altri 0.2 0.3 pittosto che 1.6 1.7 1.8 sono per esempio 1,80000007152557, il problema è che non è un discorso di formattazione, perchè come ho spiegato il numero per esempio 1.8 che viene generato in 1,80000007152557 non viene riconosciuto da esempio If matr_prova(X) = 1.8 Then Exit For
aaa
27/12/10 11:16
GrG
Postato originariamente da piter123:
come ho spiegato il numero per esempio 1.8 che viene generato in 1,80000007152557 non viene riconosciuto da esempio If matr_prova(X) = 1.8 Then Exit For


bhè mi pare ovvio che non funzioni... se matr_prova(X) contiene 1,80000007152557 non può essere uguale a 1.8

aaa
28/12/10 20:15
piter123
appunto, non capisco perchè

For X = 0 To 100
matr_prova(X) = passo * X
Xls.Cells(X + 1, 17) = matr_prova(X)
If matr_prova(X) = 1.8 Then Exit For
Next X

invece di generare il numero 1,8 generi 1,80000007152557
aaa
29/12/10 10:05
poeo85
invece di usare i Single usa i Double...otterrai il risultato da te voluto.

I Single vanno bene quando hai grandi array di valori a virgola mobile poichè offre una buona precisione e un buon intervallo di validità permettendo allo stesso tempo di risparmiare memoria.Un contesto adeguato dove utilizzarli è rappresentato da lavori che implicano intensi interventi grafici su form o picture.

fonte : Programmare Visual Basic 6 - Francesco Balena
aaa
30/12/10 9:50
piter123
con quest'altro codice dove uso double ho comunque dei problemi.

la variabile prova non assume valore true nonostante N_DEC(2) e P_P_P(2) abbiano lo stesso valore di 0,3 perchè ?

Option Explicit

Private Sub Form_Load()
Dim NUMDATO As Double
Dim X, K As Integer
Dim PASSO_PERC As Double
Dim PROB(1 To 4) As Double
Dim N_DEC(1 To 4) As Double
Dim P_P_P(1 To 4) As Double
Dim PROVA As Boolean

PROB(1) = 0.40161959
PROB(2) = 0.310344304
PROB(3) = 0.236029641
PROB(4) = 0.068314809

PASSO_PERC = 0.1


N_DEC(2) = num1dec(PROB(2))
P_P_P(2) = PASSO_PERC * 3

If N_DEC(2) = P_P_P(2) Then
PROVA = True
End If


End Sub


Function num1dec(NUMDATO) As Double
Dim A As Double
Dim n As String
If NUMDATO < 1 Then
If NUMDATO < 0.1 Then
num1dec = "0"
Else
n = Replace(Str(NUMDATO), " ", "";)
n = "0" & n
A = InStr(1, NUMDATO, ",";)
num1dec = Val(Replace(Left$(n, A + 1), ",", ".";))
End If
Else
n = Replace(Str(NUMDATO), " ", "";)
A = InStr(1, NUMDATO, ",";)
num1dec = Val(Replace(Left$(n, A + 1), ",", ".";))
End If
End Function
aaa
30/12/10 13:55
GrG
ma ne sei certo?

N_DEC(2) = num1dec(PROB(2))
P_P_P(2) = PASSO_PERC * 3

'QUi prova a mettere una msgbox per vedere il contenuto delle due variabili
msgbox N_DEC(2) & " = " & P_P_P(2)

If N_DEC(2) = P_P_P(2) Then
PROVA = True
End If
aaa