Acquista i nostri libri consigliati su Amazon.it
+ Rispondi al messaggio
Pagina 1 di 2 12 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11

Incompatibilità tra dato tipo testo di una cella e dato tipo string

  1. #1
    Post
    47
    Like Inviati  
    0
    Like Ricevuti  
    0
    Ciao a tutti,
    cercherò di essere sintetico: in un foglio ho realizzato lo schema di una fattura. Tutti i dati della fattura dopo la stampa, vengono salvati in un'unica riga di altro foglio utilizzando una variabile di tipo matrice (TYPE di 13 righe con campi di tipo diverso). Fin qui tutto bene. Il problema nasce quando facciola ricerca di una fattura: trovo la riga da cercare, copio i dati in questo vettore (tante righe per quanti sono gli articoli in fattura) e poi assegno alle celle relative i diversi valori contenuti nelle variabili del vettore ( ragione sociale, numero fattura, gli articoli con przzo e quantità ecc.). Poiché per i dati anagrafici (Rag.Sociale, indirizzo P.I. ecc.) memorizzo soltanto la ragione sociale, in quanto in fase di inserimento il completamento dei dati avviene attraverso la funzione cerca.vert(), il valore che la procedura inserisce nella cella relativa alla ragione sociale non attiva nelle altre celle la funzione cerca:vert.; come se fosse un valore diverso, o come se ci fosse incompatibilità tra il tipo testo della cella e il tipo string della matrice.
    Il risultato è OK però al posto dell'indirizzo (che si ottiene con cerca.vert compare l'errore "#Rif!"
    Spero di essere stato chiaro.
    Grazie
    Saverio Martino

    Type documento
    Ragione_sociale As String
    Destinazione_1 As String * 30
    Destinazione_2 As String * 30
    Destinazione_3 As String * 30
    Destinazione_4 As String * 30
    tipo_documento As Variant
    N_documento As Integer
    Data_documento As Date
    Mod_pagamento As String * 25
    Giorni_scadenza As Integer
    Cood_banc As String * 45
    Articoli As String * 60
    Colli As Integer
    Qta As Integer
    Prezzo As Variant
    Sconto As Single
    Iva As Integer
    a_mezzo As String * 25
    colli_tot As Integer
    vettore As String * 20
    aspetto As String * 20
    causale As String * 20
    data_inizio As Date
    ora_inizio As Variant
    Note As String * 60
    sconto_fin As Single
    spese_trasporto As Integer
    test_mag As Integer
    n_int As Integer
    U_M As String * 5
    att_1 As String * 30
    att_2 As String * 30
    altre_info As String
    End Type
    
    Sub cerca_documento()
    Dim archivio(1 To 13) As documento
    Dim i As Integer
    Dim riga As Integer
    Dim N_documento As Integer
    Dim Tipo_documeto As Variant
    
    If foglio_chiamante = "MVV" Then
         tipo_documento = "MVV"
         N_documento = Cells(1, 17).Value
     Else: N_documento = Cells(1, 14)
             tipo_documento = Cells(10, 12)
     End If
        
          riga = 3
          i = 1
       'Selezione l'archivio dove fare la ricerca dove fare la ricerca
         Select Case tipo_documento
         Case "MVV"
              archivio_ricerca = "archivio_MVV"
         Case "Nota di credito"
              archivio_ricerca = "archivio_NC"
        Case "Fattura Pro-Forma"
              MsgBox "Non è previsto il salvataggio per questo tipo di documento"
         Exit Sub
         Case "Documento di Trasporto"
               archivio_ricerca = "archivio_DDT"
         Case Else
              archivio_ricerca = "archivio_fatt"
          End Select
            Sheets(archivio_ricerca).Select
        'Inizia la ricerca del documento dalla prima riga dati e termina quando la prima cella è vuota
         Do While Cells(riga, 1).Value <> Empty
      'inserire controllo per uscire perchè il numero doc attuale è maggiore di quello cercato
         Do While Cells(riga, 1).Value = N_documento
            archivio(i).N_documento = Cells(riga, 1).Value
            archivio(i).tipo_documento = Cells(riga, 2).Value
            archivio(i).Ragione_sociale = Cells(riga, 3).Value
            archivio(i).Destinazione_1 = Cells(riga, 4).Value
            archivio(i).Destinazione_2 = Cells(riga, 5).Value
            archivio(i).Destinazione_3 = Cells(riga, 6).Value
            archivio(i).Destinazione_4 = Cells(riga, 7).Value
            archivio(i).Data_documento = Cells(riga, 8).Value
            archivio(i).Mod_pagamento = Cells(riga, 9).Value
            archivio(i).Giorni_scadenza = Cells(riga, 10).Value
            archivio(i).Cood_banc = Cells(riga, 11).Value
            archivio(i).Articoli = Cells(riga, 12).Value
            archivio(i).Colli = Cells(riga, 13).Value
            archivio(i).Qta = Cells(riga, 14).Value
           archivio(i).Prezzo = Cells(riga, 15).Value
           archivio(i).Sconto = Cells(riga, 16).Value
           archivio(i).Iva = Cells(riga, 17).Value
           archivio(i).a_mezzo = Cells(riga, 18).Value
           archivio(i).colli_tot = Cells(riga, 19).Value
           archivio(i).vettore = Cells(riga, 20).Value
           archivio(i).aspetto = Cells(riga, 21).Value
           archivio(i).causale = Cells(riga, 22).Value
           archivio(i).data_inizio = Cells(riga, 23).Value
           archivio(i).ora_inizio = Cells(riga, 24).Value
           archivio(i).Note = Cells(riga, 25).Value
           archivio(i).sconto_fin = Cells(riga, 26).Value
           archivio(i).spese_trasporto = Cells(riga, 27).Value
           archivio(i).test_mag = Cells(riga, 28).Value
           archivio(i).n_int = Cells(riga, 29).Value
           archivio(i).U_M = Cells(riga, 30).Value
           archivio(i).att_1 = Cells(riga, 31).Value
           archivio(i).att_2 = Cells(riga, 32).Value
           archivio(i).altre_info = Cells(riga, 33).Value
           i = i + 1
           riga_rag_sociale = riga
           riga = riga + 1
       Loop
       riga = riga + 1
    Loop
    
    If i = 1 Then
         Sheets(foglio_chiamante).Select
         MsgBox "Attenzione!!! Documento non presente in archivio."
         Sheets(foglio_chiamante).Select
         Exit Sub
         End If
    numero_righi = i - 1
    i = 1
    Sheets(foglio_chiamante).Select
    
    'Idati trovati vengono inseriti nel form chiamante
    
    If foglio_chiamante = "MVV" Then
          Cells(6, 9).Value = archivio(i).Ragione_sociale
          'Cells(16, 6).Value=   archivio(i).tipo_documento
           Cells(5, 8).Value = archivio(i).N_documento
           Cells(5, 5).Value = archivio(i).n_int
           Cells(5, 6).Value = archivio(i).Data_documento
           Cells(6, 15).Value = archivio(i).causale
           Cells(12, 9).Value = archivio(i).Destinazione_1
           Cells(13, 9).Value = archivio(i).Destinazione_2
           Cells(14, 3).Value = archivio(i).vettore
           Cells(37, 2).Value = archivio(i).a_mezzo
           Cells(32, 1).Value = archivio(i).colli_tot
           Cells(32, 7).Value = archivio(i).altre_info
           Cells(36, 1).Value = archivio(i).att_1
           Cells(37, 1).Value = archivio(i).att_2
    For i = 1 To numero_righi
           Cells(21 + i, 4).Value = archivio(i).Articoli
           Cells(21 + i, 13).Value = archivio(i).Qta
           Cells(21 + i, 12).Value = archivio(i).U_M
        Next i
     Else
     'Se invece è il Form classico prima inserisco i dati comuni a tutti i documenti
    i = 1
       Cells(3, 5).Value = archivio(i).Ragione_sociale
        'Cells(3, 5).Value = Sheets("anagrafica").Cells(24, 2).Value
    
       'Cells(3, 5).Value = Sheets(archivio_ricerca).Cells(riga_rag_sociale, 3).value
       Cells(16, 6).Value = archivio(i).tipo_documento
       Cells(18, 6).Value = archivio(i).N_documento
       Cells(18, 8).Value = archivio(i).Data_documento
       Cells(20, 1).Value = archivio(i).Mod_pagamento
       Cells(20, 5).Value = archivio(i).Giorni_scadenza
       Cells(20, 6).Value = archivio(i).Cood_banc
       Cells(38, 8).Value = archivio(i).sconto_fin
       Cells(39, 9).Value = archivio(i).spese_trasporto
       For i = 1 To numero_righi
       Cells(22 + i, 1).Value = archivio(i).Articoli
       Cells(22 + i, 5).Value = archivio(i).Colli
       Cells(22 + i, 6).Value = archivio(i).Qta
       Cells(22 + i, 7).Value = archivio(i).Prezzo
       Cells(22 + i, 8).Value = archivio(i).Sconto
       Cells(22 + i, 10).Value = archivio(i).Iva
       Next
         If (tipo_documento = "Documento di accompagnamento" Or tipo_documento = "Fattura accompagnatoria") Then
              i = 1
             archivio(i).Destinazione_1 = Cells(10, 5).Value
             archivio(i).Destinazione_2 = Cells(11, 5).Value
             archivio(i).Destinazione_3 = Cells(12, 5).Value
             archivio(i).Destinazione_4 = Cells(13, 5).Value
             archivio(i).a_mezzo = Cells(37, 2).Value
             archivio(i).colli_tot = Cells(37, 4).Value
            archivio(i).vettore = Cells(38, 2).Value
            archivio(i).aspetto = Cells(39, 2).Value
            archivio(i).causale = Cells(40, 2).Value
            archivio(i).data_inizio = Cells(41, 3).Value
            Cells(41, 4).Value = archivio(i).ora_inizio
            archivio(i).Note = Cells(42, 2).Value
       End If
    End If   
    End Sub
    
    Ultima modifica di AntonioG; 12-07-2015 18:49 

  2. #2
    L'avatar di AntonioG
    AntonioG non è in linea Moderatore Globale Ultimo blog: Commodore 64 e Codemotion
    Post
    17,486
    Blogs
    5
    Like Inviati  
    6
    Like Ricevuti  
    34
    Per il codice devi utilizzare i tag code come detto nel regolamento e più volte ricordato

    Questa volta correggo io...
    ℹ️ Leggi di più su AntonioG ...

  3. #3
    PaoloTalini non è in linea Scribacchino
    Post
    861
    Like Inviati  
    0
    Like Ricevuti  
    0
    saveriomartino;

    Non sei stato chiaro.

    Specifica come memorizzi e scrivi la variabile.

    Si ipotizzano vari scenari:
    1) scrivi la formula invece del contenuto.
    2) l'errore viene generato prima di memorizza e scrivere la variabile.

    Proponi il codice completo sottolineando dove genera l'errore.
    ℹ️ Leggi di più su PaoloTalini ...

  4. #4
    Post
    47
    Like Inviati  
    0
    Like Ricevuti  
    0
    Buongiorno e grazie a Paolo Talini per la risposta.
    Intanto mi scuso per il ritardo.
    Non è proprio così nel senso che il codice, il quale si propone di trovare (se esiste) una fattura noto il suo numero, funziona perfettamente: assegna alla variabile “Numero_documento”, poi cerca nel relativo foglio tutte le righe che riportano il valore “Numero_documento” assegnandoli ai vari record della variabile definita dall’utente “Type: Documento”.
    Successivamente ritorna al foglio “Foglio_chiamante” e assegna alle relative celle del fogio che rappresenta il FORM della fattura i valori trovati. Fin qui le cose vanno bene.
    Dov’è il problema allora?
    Quando io faccio l’inserimento dei dati (e non la ricerca come in questo caso) il valore di “Ragione Sociale” lo selezione attraverso la funzione (Convalida dati) leggendo in un altro foglio denominato “Anagrafica”. Per tutti gli altri dati necessari es. Indirizzo, Città P.Iva, ecc, il completamento avviene in modo automatico grazie alla funzione (=CERCA.VERT(E3;Anagrafica;3;0) presente nelle relative celle.
    Tornando al codice oggetto del problema, la procedura (che ripeto funziona), mi restituisce un foglio completo di tutti i dati necessari, però le relative funzioni “CERCA.VERTICALE” non funzionano, nonostante il valore della cella relativa alla ragione sociale contega il giusto valore.
    L’ideale sarebbe seguire il funzionamento del codice e osservare quello che succede ma dovrei inviarti l’intera cartella, non ho problemi a farlo ma non so se in questo contesto è consentito dal regolamento.
    Saluti
    Saverio Martino
    P.s. la parte finale del codice non è corretta e comunque non è influente sul contenuto del problema.

  5. #5
    Post
    47
    Like Inviati  
    0
    Like Ricevuti  
    0
    Quote Originariamente inviato da saveriomartino Visualizza il messaggio
    Buongiorno e grazie a Paolo Talini per la risposta.
    Intanto mi scuso per il ritardo.
    Non è proprio così nel senso che il codice, il quale si propone di trovare (se esiste) una fattura noto il suo numero, funziona perfettamente: assegna alla variabile “Numero_documento”, poi cerca nel relativo foglio tutte le righe che riportano il valore “Numero_documento” assegnandoli ai vari record della variabile definita dall’utente “Type: Documento”.
    Successivamente ritorna al foglio “Foglio_chiamante” e assegna alle relative celle del fogio che rappresenta il FORM della fattura i valori trovati. Fin qui le cose vanno bene.
    Dov’è il problema allora?
    Quando io faccio l’inserimento dei dati (e non la ricerca come in questo caso) il valore di “Ragione Sociale” lo selezione attraverso la funzione (Convalida dati) leggendo in un altro foglio denominato “Anagrafica”. Per tutti gli altri dati necessari es. Indirizzo, Città P.Iva, ecc, il completamento avviene in modo automatico grazie alla funzione (=CERCA.VERT(E3;Anagrafica;3;0) presente nelle relative celle.
    Tornando al codice oggetto del problema, la procedura (che ripeto funziona), mi restituisce un foglio completo di tutti i dati necessari, però le relative funzioni “CERCA.VERTICALE” non funzionano, nonostante il valore della cella relativa alla ragione sociale contega il giusto valore.
    L’ideale sarebbe seguire il funzionamento del codice e osservare quello che succede ma dovrei inviarti l’intera cartella, non ho problemi a farlo ma non so se in questo contesto è consentito dal regolamento.
    Saluti
    Saverio Martino
    P.s. la parte finale del codice non è corretta e comunque non è influente sul contenuto del problema.
    Penso di aver individuato il problema.
    Nel foglio relativo alla fattura la cella che contiene la ragione sociale trattasi di unione di 4 celle, mentre il foglio che contiene il valore archiviato di ragione sociale è una singola cella.

  6. #6
    alfrimpa non è in linea Scolaretto
    Post
    332
    Like Inviati  
    0
    Like Ricevuti  
    0
    Premetto che è solo una mia opinione ma quando si usa VBA le celle unite vanno evitate come la peste; fanno più danni che apportare benefici.

    Alfredo

  7. #7
    Post
    47
    Like Inviati  
    0
    Like Ricevuti  
    0
    A prescindere da questo aspetto significativo, il problema (e qualcuno potrebbe pure giustamente invitarmi a leggere le norme basilari del codice vba)è che ci devono essere necessariamente delle regole sull'uso del tipo di dati string del codice e testo della cella. Mi spiego con un esempio: se assegno ad una variabile di tipo string (testo as string*25) il valore "giovane" e poi confronto questa variabile con il contenuto di una cella di tipo testo (esempio con coord. riga 1 e col. 2) che contiene giovane, per il codice vba sono diversi. cells(1, 2).value <> testo.

  8. #8
    L'avatar di scossa
    scossa non è in linea Scolaretto
    Post
    183
    Like Inviati  
    0
    Like Ricevuti  
    0
    Quote Originariamente inviato da saveriomartino Visualizza il messaggio
    .... Mi spiego con un esempio: se assegno ad una variabile di tipo string (testo as string*25) il valore "giovane" e poi confronto questa variabile con il contenuto di una cella di tipo testo (esempio con coord. riga 1 e col. 2) che contiene giovane, per il codice vba sono diversi. cells(1, 2).value <> testo.
    Mi sembra più che normale: la tua variabile testo è una stringa di lunghezza fissa (25 caratteri).
    Prova questo codice, e vedrai che la cosa sarà chiara:

    Sub prova()
      Dim sTesto As String * 25
      Dim sTesto2 As String
      
      sTesto = "giovane"
      sTesto2 = "giovane"
      Range("A1").Value = "giovane"
      Debug.Print sTesto = Range("A1").Value
      Debug.Print sTesto2 = Range("A1").Value
      Debug.Print Trim(sTesto) = Range("A1").Value
      Debug.Print Len(sTesto)
      Debug.Print Len(sTesto2)
      Debug.Print Len(Range("A1"))
    End Sub
    
    Ultima modifica di scossa; 15-07-2015 14:57 
    ℹ️ Leggi di più su scossa ...

  9. #9
    PaoloTalini non è in linea Scribacchino
    Post
    861
    Like Inviati  
    0
    Like Ricevuti  
    0
    Quote Originariamente inviato da saveriomartino Visualizza il messaggio
    A prescindere da questo aspetto significativo, il problema (e qualcuno potrebbe pure giustamente invitarmi a leggere le norme basilari del codice vba)è che ci devono essere necessariamente delle regole sull'uso del tipo di dati string del codice e testo della cella. Mi spiego con un esempio: se assegno ad una variabile di tipo string (testo as string*25) il valore "giovane" e poi confronto questa variabile con il contenuto di una cella di tipo testo (esempio con coord. riga 1 e col. 2) che contiene giovane, per il codice vba sono diversi. cells(1, 2).value <> testo.
    Ti ricordo che le celle di Excel, per definizione, sono da considerare come di tipo variant.
    Nei moduli VBA, se non specificatamente dichiarato, non viene fatto un confronto testo, vedi Option Compare Text e articolo https://msdn.microsoft.com/it-it/library/8t3khw5f.aspx.

    Per ovviare puoi fare il confronto, dopo aver memorizzato il contenuto della cella, tra due variabili.
    P.S.
    Ti ricordo che non sempre e possibile distinguere caratteri maiuscoli da caratteri minuscoli.
    ℹ️ Leggi di più su PaoloTalini ...

  10. #10
    PaoloTalini non è in linea Scribacchino
    Post
    861
    Like Inviati  
    0
    Like Ricevuti  
    0
    saveriomartino;

    Da ricordare inoltre che, eventuali spazzi potrebbero rendere nullo il lavoro.
    Scossa, che saluto, mi ha preceduto, dandoti la spiegazione del caso.
    ℹ️ Leggi di più su PaoloTalini ...

+ Rispondi al messaggio
Pagina 1 di 2 12 ultimoultimo

Potrebbero interessarti anche ...

  1. tipo di dato per chiave primaria
    Da orpo970 nel forum Microsoft SQL Server
    Risposte: 3
    Ultimo Post: 27-06-2012, 20:47
  2. Risolto: Errore di incompatibilità su nuovo tipo di dato definito
    Da DoubleStar nel forum Delphi
    Risposte: 2
    Ultimo Post: 26-03-2012, 15:17
  3. [MySQL] Tipo dato Float
    Da licetinsanire nel forum MySQL
    Risposte: 2
    Ultimo Post: 03-03-2009, 12:39
  4. Cambio tipo dato (da String a Guid)
    Da sly185 nel forum Visual Basic .Net
    Risposte: 3
    Ultimo Post: 16-12-2006, 16:51
  5. [c#] Tipo di dato in una textbox
    Da Zigo nel forum C#
    Risposte: 2
    Ultimo Post: 16-01-2006, 09:53