Visualizzazione dei risultati da 1 a 7 su 7

Discussione: VBA Importazione XLS

  1. #1

    VBA Importazione XLS

    Salve , sono nuovo del forum ma avrei bisogno di un aiuto urgente, devo leggere un file xls per poi importarlo in access, ora , io uso


    Set cnXls = New ADODB.Connection
    'cnXls.ConnectionString = "Data Source='" & filexls & "'; Extended Properties=""Excel 8.0;HDR=YES;"""
    cnXls.ConnectionString = "Data Source='" & filexls & "'; Extended Properties=""Excel 8.0;HDR=" & VarHDR & ";"""
    cnXls.Provider = "Microsoft.Jet.OLEDB.4.0"
    cnXls.Open

    Set RsXls = New ADODB.Recordset
    RsXls.CursorLocation = adUseClient
    RsXls.LockType = adLockBatchOptimistic


    RsXls.Open query_var, cnXls, adOpenStatic
    If RsXls.RecordCount > 0 Then RsXls.MoveFirst

    RsXls.ActiveConnection = Nothing
    cnXls.Close

    per caricare in RSXLS IL CONTENUTO del file xls, il codice sembra funzionare TUTTAVIA alcuni campi che in xls sono valorizzati vengono importati vuoti, ho verificato tramite debug riga che la riga in questione ( ma ne esistono tante ) non viene importata del tutto vuoto
    es :
    riga 1
    campo 1 : viene importato
    campo 2 : viene importato
    campo3 : viene importato

    riga 1
    campo 1 : viene importato
    campo 2 : non viene importato
    campo3 : viene importato

    l'unica discrepanza che ho trovato che tra le due righe è che il campo 2 della riga 2 contiene solo numeri ( molto alti lo amnmetto )

    la destinazione è un campo tempo, ma è quasi ininfluente nel senso che è proprio in fase di carimento del xls che il dato viene visto vuoto

    sapete darmi un suggerimento?

    grazi
    marco

  2. #2
    ciao,

    non sò se può esserti d'aiuto... io ci provo:

    Codice PHP:
    Sub prova()
        
    strconn "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=c:\DB1.mdb"
        
    Set conn CreateObject("ADODB.connection")
        
    conn.Open strconn
        strsql 
    "select * from prova"
        
    Set rs CreateObject("ADODB.Recordset")
        
    rs.Open strsqlconn33
        
    For 1 To Cells(Cells.SpecialCells(xlCellTypeLastCell), 1).Row
            rs
    .addnew
            rs
    ("Prova1") = Cells(i1).Value
            rs
    ("Prova2") = Cells(i2).Value
            rs
    ("Prova3") = Cells(i3).Value
            rs
    .Update
        Next
        rs
    .Close
        conn
    .Close
        Set rs 
    Nothing
        Set conn 
    Nothing
    End Sub 
    devi stare attento perchè se il formato della cella di excel non è uguale a quello della tabella access, ti darà un valore vuoto o un errore...
    Bombardare per la pace, è come trombare per la verginità.

    C'è qualcuno al mondo che tromba troppo secondo me...

    Andrea Medici

  3. #3

    vediamo...

    ciao andrea, sul tuo codice ci sono parecchi cose che non capisco :
    inanzitutto, dove indico il file xls da leggere
    sintassi a parte il mio problema è effettivamente quello che dici tu, il campo sul db access è testo, in xls le celle sono GENERALI ( contengono sia lettere che numeri )
    stranamente quando incontra le lettere le improta, se trova SOLO numeri lo salta, pero non sono
    sicuro il problema sia in fase di assegnazione infatti debuggando il codice
    vado a vedere cosa contiene il recordset xls che uso ( un attimo prima di dare f8 per passare la riga ) , il valore "è GIA NULL ", per questo all'inizio ho pensato che fosse qualcosa relativo alla mia stringa di connessione .

    spero di essermi spiegato. ti ringrazzio del tuo codice, se me lo puoi spiegare piu dettagliatamente provero a usarlo e vedro


    marco



    ciao,

    non sò se può esserti d'aiuto... io ci provo:

    codice PHP:

    Sub prova()
    strconn = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=cB1.mdb"
    Set conn = CreateObject("ADODB.connection")
    conn.Open strconn
    strsql = "select * from prova"
    Set rs = CreateObject("ADODB.Recordset")
    rs.Open strsql, conn, 3, 3
    For i = 1 To Cells(Cells.SpecialCells(xlCellTypeLastCell), 1).Row
    rs.addnew
    rs("Prova1") = Cells(i, 1).Value
    rs("Prova2") = Cells(i, 2).Value
    rs("Prova3") = Cells(i, 3).Value
    rs.Update
    Next
    rs.Close
    conn.Close
    Set rs = Nothing
    Set conn = Nothing
    End Sub


    devi stare attento perchè se il formato della cella di excel non è uguale a quello della tabella access, ti darà un valore vuoto o un errore...


    __________________
    Bombardare per la pace, è come trombare per la verginità.

    C'è qualcuno al mondo che tromba troppo secondo me...

    Andrea Medici

    Segnala ad un moderatore | IP: Collegato | Permalink

  4. #4
    ma il tuo programma è interno o esterno a excel?

    cmq supponendo di avere un database chiamato DB1.mdb e una tabella di nome prova con questi campi:

    Prova1 --> Testo
    Prova2 --> Data/Ora
    Prova3 --> Numerico

    questo è il programma che farei io:

    Codice PHP:
    Sub AproImportoExcel(strPath As StringNomeFoglio As String)
        
    Dim xlApp As Excel.ApplicationwkbImporta As Excel.WorkbookwksImporta As Worksheet
        Dim swAperto 
    As Boolean
        Set xlApp 
    = New Excel.Application
        xlApp
    .Visible False
        swAperto 
    False
        
    If xlApp.Workbooks.Count 0 Then swAperto True
        Set wkbImporta 
    xlApp.Workbooks.Add(strPath)
        
    Set wksImporta wkbImporta.Worksheets(NomeFoglio)
        
    Call AggiornaDBAccess(wksImporta)
        
    wkbImporta.Close
        xlApp
    .Visible True
        
    If swAperto False Then xlApp.Quit
        Set wksImporta 
    Nothing
        Set wkbImporta 
    Nothing
        Set xlApp 
    Nothing
    End Sub

    Sub AggiornaDBAccess
    (WK As Excel.Worksheet)
        
    Dim strConn As StringConn As ADODB.ConnectionstrSQL As StringRS As ADODB.Recordset
        strConn 
    "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=c:/DB1.mdb"
        
    Set Conn CreateObject("ADODB.connection")
        
    Conn.Open strConn
        strSQL 
    "select * from prova"
        
    Set RS CreateObject("ADODB.Recordset")
        
    With RS
            
    .Open strSQLConn33
            
    For 1 To Cells(Cells.SpecialCells(xlCellTypeLastCell), 1).Row
                
    .AddNew
                
    .Fields("Prova1").Value CStr(WK.Cells(i1).Value'converto dato in tipo Stringa
                .Fields("Prova2").Value = CDate(WK.Cells(i, 2).Value) '
    converto dato in tipo Data
                
    .Fields("Prova3").Value CInt(WK.Cells(i3).Value'converto dato in tipo Intero
                .Update
            Next
            .Close
        End With
        Conn.Close
        Set RS = Nothing
        Set Conn = Nothing
    End Sub 
    alla sub AproImportoExcel devi passagli la path (incluso il nome del file) del foglio Excel e il nome del foglio che andrà analizzato dal programma e aggiunto al db.

    prima di far partire il programma ricordati di cambiare la Path del db e i campi. con la conversione dei dati (cstr, cdate, cint, ecc...) appropriato al campo.

    un ultima annotazione: se la lunghezza della cella che ti dà null come valore è maggiore di 255 caratteri ti conviene convertire il campo da Testo (massimo 255 caratteri) a Memo (massimo 65536 caratteri)
    fammi sapere
    Bombardare per la pace, è come trombare per la verginità.

    C'è qualcuno al mondo che tromba troppo secondo me...

    Andrea Medici

  5. #5

    ...

    ciao andrea, ho letto il tuo post, piu tardi in mattinata provero il codice e vedro di farti sapere, una sola cosa, vedo che il codice che passi ha la dicitura "codice php", il codice è in php?
    scusa , sara una domanda stupida per te ma avendo poca dimestichezza preferisco chiarirlo, sai inoltre se devo aggiungere qualche riferimento oltre al classico microsoft active x data object ecc per il recordset

    ti faccio sapere
    marco

  6. #6
    no....

    "codice PHP:" lo uso per colorare il codice...

    il codice è vb
    Bombardare per la pace, è come trombare per la verginità.

    C'è qualcuno al mondo che tromba troppo secondo me...

    Andrea Medici

  7. #7
    x il recordset no... x excel devi aggiungere il riferimento a Microsoft Office Excel 9.0/10.0/11.0/12.0 dipende dalla versione di office
    Bombardare per la pace, è come trombare per la verginità.

    C'è qualcuno al mondo che tromba troppo secondo me...

    Andrea Medici

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.