none
Come posso aggiungere Valori Ad un File Excel.Range RRS feed

  • Domanda

  • Ciao :),

    Il Titolo Non è Apropiato ma non sapevo come mettere, 

    Sono alle prese ancora con excel ma il lato positivo per voi che mi rispondete sempre, e io vi ringrazio, è che questà è l'ultima domanda e anche la decisiva del mio progetto ;) , perciò per favore aiutatemi :)

    Allora io Ho questo codice 

    Private Sub LettExcel()
            Dim Fp As String = "C:\Pavegi\Demo\FilePilota.xlsx"
            Dim Fq As String = "C:\Pavegi\Demo\FileQuote.xls"
    
            Dim Excel_A As New Excel.Application
            Dim Excel_B As New Excel.Application
            Dim Excel_C As New Excel.Application
    
            'Apro i File
            Excel_A.Workbooks.Open(Fp)
            Excel_B.Workbooks.Open(Fq)
    
            Dim Lista_A As New List(Of String)
            Dim Lista_B As New List(Of String)
    
            Dim Foglio_A As Excel.Worksheet = CType(Excel_A.ActiveSheet, Excel.Worksheet)
            Dim Foglio_B As Excel.Worksheet = CType(Excel_B.ActiveSheet, Excel.Worksheet)
    
    
            'Leggo I File
    
            For riga As Integer = 1 To Foglio_A.Range("A65000").End(Excel.XlDirection.xlUp).Row
    
                Lista_A.Add(CStr(CType(Foglio_A.Cells(riga, 1), Excel.Range).Value))
    
            Next
    
    
    
    
            For riga As Integer = 1 To Foglio_B.Range("D65000").End(Excel.XlDirection.xlUp).Row
    
                Lista_B.Add(CStr(CType(Foglio_B.Cells(riga, 1), Excel.Range).Value))
    
            Next
    
    
    
    
            Dim rimanenti = Lista_A.Except(Lista_B).ToArray
    
    
    
    
            For indice As Integer = 0 To rimanenti.Length - 1
    
                Dim ExcelFinale As Excel.Workbook = CType(Excel_C.Workbooks.Add, Excel.Workbook)
                Dim FoglioFinale As Excel.Worksheet = CType(Excel_C.ActiveWorkbook.ActiveSheet, Excel.Worksheet)
    
                FoglioFinale.Range("A" & +1).Value = "Nome Bilancio"
                FoglioFinale.Range("A" & +2).Value = 
    
                Dim Pavegi As String = "C:\Pavegi\Condomini\" & FoglioFinale.Range("A" & +2).Value & ".xls"
                Dim controllo As New FileInfo(Pavegi)
    
                If controllo.Exists = True Then
                    controllo.Delete()
                    FoglioFinale.SaveAs(Pavegi)
                Else
                    controllo.Directory.Create()
                    FoglioFinale.SaveAs(Pavegi)
                End If
    
    
    
            Next
    
    
    
            Excel_C.Visible = True
            Excel_A.Quit()
            Excel_B.Quit()
            Excel_C.Quit()
        End Sub

    Ok ora nel Pezzo che  dice 

     FoglioFinale.Range("A" & +2).Value = 

    ok Vorrei Mettere Questo Valore :

     la cella rispettiva alla riga del Codice Interno ......

    Sembra Incapibile Ma non è così ora ve lo dico in pochè Parole.

    Allora Mi Leggo 2 File Excel  (Fp) e (Fq)

    Poi Creo Una lista Per le celle della colonna 1 di (Fp)

    Creo una seconda lista per le celle della colonna 4 di (Fq)

    poi confronto le due liste per vedere se sono uguali,

    se sono uguali allora mi crea un nuovo File Excel con il Nome Del CodInterno,

    ora viene il difficile ,

    ora dovrei fare questo ,

    il Valore della Prima cella = "Nome Bilanci"

    il Valore Della seconda Vorrei che sia Il Valore della colonna (1) , Riga (la prendo dal for) , cella (Colonna 1 , riga) 

    Capito?

    Ciao by Amos97 

    lo so che è difficile Ma se mi date una mano vi sarò eternamente grato :)

    domenica 6 maggio 2012 20:30

Tutte le risposte

  • Capito?

    Decisamente no, non è chiaro...

    Puoi fare un esempio dei tuoi dati di input e del corrispondente output che vuoi ottenere?


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

    domenica 6 maggio 2012 20:56
  • Credo di aver capito cosa ti serve... anche se ti giuro che ho dovuto interpretare il tutto con la stele di Rosetta accanto :)

    Se non ho capito male tu vorresti che nella cella FoglioFinale.Range("A"& +2) ti venisse scritto il valore che trova nella Colonna 1 nella cella della variabile riga del Foglio_A, attraverso un riferimento a quella cella.

    Se così fosse devi impostare il valore a:

    FoglioFinale.Range("A" & + 2).Value = "=" + Foglio_A.Name.ToString + "!A" + riga.ToString

    Non l'ho provato ma dovrebbe funzionare.

    La variabile riga, però la devi dichiarare in modo diverso, altrimenti ti esce dal contesto una volta che hai ciclato nel ciclo for.

    Ovvero

    Dim riga as Integer
    For riga = 1 To ....

    HTH


    Alberto De Luca [MVP - Visual Basic .NET]

    domenica 6 maggio 2012 23:10
  • Credo di aver capito cosa ti serve... anche se ti giuro che ho dovuto interpretare il tutto con la stele di Rosetta accanto :)

    Se non ho capito male tu vorresti che nella cella FoglioFinale.Range("A"& +2) ti venisse scritto il valore che trova nella Colonna 1 nella cella della variabile riga del Foglio_A, attraverso un riferimento a quella cella.

    Se così fosse devi impostare il valore a:

    FoglioFinale.Range("A" & + 2).Value = "=" + Foglio_A.Name.ToString + "!A" + riga.ToString

    Non l'ho provato ma dovrebbe funzionare.

    La variabile riga, però la devi dichiarare in modo diverso, altrimenti ti esce dal contesto una volta che hai ciclato nel ciclo for.

    Ovvero

    Dim riga as Integer
    For riga = 1 To ....

    HTH


    Alberto De Luca [MVP - Visual Basic .NET]

    Mi Spiace Ma non funge assolutamente il valore che mi ridà è 0 !

    Ora vi faccio un esempio con dei dati ;)

    Nel File Excel Fp nella prima colonna ho :

    Int.03

    Int.05

    Int.09

    ok ,

    Invece Nel Secondo file Excel Fq nella Terza Colonna ho :

    Int.01

    Int.02

    Int.03

    Int.04

    Int.05

    Int 06

    ok , Allora Dovrei Fare così

    verifico se I valori Di Fp e Fq sono uguali, 

    e per ogni valore uguale lui mi crea un File Excel con il Nome Del Valore Uguale . OK?

    OK Ora viene Il Difficile , Sopra Ho Detto della 1° colonna che verifica mentre in quella sotto la 3° è quella che viene verificata.

    Perciò ti faccio un esempio Del FIle Excel Fq

    Allora in Fq in Terza colonna Ho 

    Int.01

    Int.02

    Int.03

    Int.04

    Int.05

    Int 06

    Sempre in Fq Ho La 4° Colonna che ha :

    A 01 Refrigeri Anna
    A 02 Sollevati Gianna
    A 03 Mendozza Gianni
    A 04 Pino Mirella
    A 05 Campanelli Adriano
    A 06 Aceto Maria
     

    ok,

    Sempre nell File Excel Fq Nella 2° Colonna Ho :

    cond 2010 conguaglio
    cond 2010 conguaglio
    cond 2010 conguaglio
    cond 2010 conguaglio
    cond 2010 conguaglio

    ok, Adesso Vi spiego Cosa Vorrei Mettere in 

    FoglioFinale.Range("B" & +2).Value =

    Ci Devo Mettere La Cella della 2° Colonna Del FIle Excel Fq, Corrispondente Alla Riga n° indice

    Capito?

    Spero di si

    Ciao By Amos97


    lunedì 7 maggio 2012 13:35
  • VI Prego Almeno Ditemi Se mi avete Capito :'(
    lunedì 7 maggio 2012 19:48
  • Allora... rileggendo bene ho visto che in realtà apri tre file diversi per cui non puoi fare riferimento ad una cella di un foglio che non sta sulle stesso file.

    Devi allora memorizzarti il valore in una variabile e poi scriverlo li sopra.

    Quindi:

    Non si capisce a quale indice di riga fa riferimento la frase "Corrispondente Alla Riga n° indice" ovvero qual' è la logica con cui decidi che il valore debba essere memorizzato. Ma una volta capito questo è sufficiente che il valore che trovi in quella cella venga memorizzato in una variabile e poi scritto nella cella corrispondente.

    In tutto quello che hai scritto manca la cosa più importante, ovvero la logica con cui devi memorizzarti quel dato.

    Se me lo fai sapere...


    Alberto De Luca [MVP - Visual Basic .NET]

    martedì 8 maggio 2012 07:58
  • Ciao,

    Per Alberto: scusa ma perche' dici che non e' possibile fare riferimento a una cella di un altro file?

    Excel_A.Foglio1.Range(..) = Excel_B.FoglioN.Range(...) non mi ha mai dato problemi (ovvio che si deve far attenzione agli indici di riga).

    Per Amor97: non ho capito cosa vuoi fare... e soprattutto perche' continui ad aprire un'istanza di excel per ogni file... boh... sara' che ho dormito 2 ore stanotte ma vedo tutto molto confuso heheheh

    Ciao BlackSun

    martedì 8 maggio 2012 08:46
  • Evidentemente non hai letto tutto il thread. Quello che ho detto è una cosa diversa da quella che tu affermi. Tu non stai facendo riferimento ad un'altra cella di un altro foglio tu stai copiando il valore "fisico" di una cella (non il suo riferimento) nel valore di un'altra cella. Nel tuo caso se il valore della cella madre cambia non cambia il valore della cella figlia. Devo comunque precisare che a dire il vero si può fare riferimento ad una cella che sta su un altro foglio di un altro file dichiarando l'intero path del file nella cella di riferimento:

    Sheets(1).Range("A1").Formula = "='C:\NomeCartella\[NomeFile.xls]Nomefoglio'!A1"

    l'avevo però rimossa dal mio modo di lavorare perchè è una cosa alquanto pericolosa, perchè ovviamente se il file "madre" viene eliminato o spostato ti perdi tutti i riferimenti. Personalmente preferisco che la consistenza del dato sia garantita almeno a livello del File. Oltre a questo correggo quanto ho scritto sopra perchè erroneamente ho scritto di usare la proprietà Value della cella (FoglioFinale.Range("A" & + 2).Value =) in realtà quando si fa riferimento ad un'altra cella si deve usare la proprietà Formula (FoglioFinale.Range("A" & + 2).Formula=), e quindi mi scuso.


    Alberto De Luca [MVP - Visual Basic .NET]

    martedì 8 maggio 2012 09:11
  • Ciao,

    si, rileggendo con maggior attenzione il post tu parli di riferimento mentre io ero soffermato su quanto aveva scritto Amor97: "il Valore Della seconda Vorrei che sia Il Valore della colonna (1) , Riga (la prendo dal for) , cella (Colonna 1 , riga)" quindi in automatico (non piacendo neanche a me il riferimento a percorsi di file esterni) ho pensato al valore della cella (e non alle sue coordinate). Entrambe le strade sarebbero percorribili (aldila' del piacerci o meno) ma dipende da cosa deve far Amor97, se gli serve un riferimento oppure gli basta prendere i valori e basta... boh.

    Ciao BlackSun

    martedì 8 maggio 2012 10:21
  • Mi Basta Prendere I Valori :)

    Ma con Le vostre risposte non c'ho più capito niente

    (FoglioFinale.Range("A" & + 2).Formula=) perchè? 

    martedì 8 maggio 2012 18:00
  • Perchè con quell'istruzione puoi fare riferimento a ciò che viene scritto nella cella. Cmq. se ti basta il valore non è il tuo caso.

    Rileggendo tutto con molta più attenzione adesso credo di aver capito cosa ti serve... E' stata molto dura da capire perchè la comparazione viene fatta in maniera alquanto "sconclusionata", nel senso che tu prendi tutti i valori della colonna A del foglio A tutti i valori della colonna A del foglio B, li piazzi in due liste di stringhe, ti tiri fuori i valori diversi tra le due liste ma non ti porti dietro il riferimento alla cella a cui il valore appartiene. Fatto in questo modo è impossibile ottenere il risultato. Vediamo di riscrivere la funzione di comparazione. In primo luogo ti serve una collection che ti rappresenti una struttura di tipo Indice|Valore. A questo scopo per tirarsi fuori i dati dalla colonna del foglio A, non dobbiamo utilizzare una List(Of String) bensì una Dictionary(Of Integer, String). La seconda cosa che dobbiamo fare è inserire in un Array di stringhe i valori da escludere (filtrare), a questo scopo dichiariamo una variabile di tipo List(Of String). In ultima analisi, utilizzando Linq, cicliamo sulla Dictionary filtrata. Questo il codice da usare (dopo aver fatto le dovute correzioni)

            Dim Fp As String = "C:\Cartel1.xlsx"
            Dim Fq As String = "C:\Cartel2.xlsx"
            Dim ExcelApp As New Excel.Application
            Dim wsA As Worksheet = CType(ExcelApp.Workbooks.Open(Fp).ActiveSheet, Worksheet)
            Dim wsB As Worksheet = CType(ExcelApp.Workbooks.Open(Fq).ActiveSheet, Worksheet)
    
            Dim Lista_A As New Dictionary(Of Integer, String)
            Dim Lista_B As New List(Of String)
    
            For riga As Integer = 1 To 65000
                Lista_A.Add(riga, CType(wsA.Cells(riga, 1), Range).Value.ToString)
                Lista_B.Add(CType(wsB.Cells(riga, 1), Excel.Range).Value.ToString)
            Next
            Dim ExcelFinale As Excel.Workbook
            For Each p In Lista_A.Where(Function(e) Not Lista_B.Contains(e.Value))
                ExcelFinale = CType(ExcelApp.Workbooks.Add, Excel.Workbook)
                Dim FoglioFinale As Excel.Worksheet = CType(ExcelFinale.Worksheets.Add, Excel.Worksheet)
                FoglioFinale.Range("A" & +1).Value = "Nome Bilancio"
                FoglioFinale.Range("A" & +2).Value = CType(wsA.Cells(p.Key, 2), Range).Value
            Next
            If ExcelFinale IsNot Nothing Then
                ExcelFinale.SaveAs("Pippo")
                ExcelFinale.Close()
            End If
            ExcelApp.Quit()

    HTH

    Alberto De Luca [MVP - Visual Basic .NET]

    mercoledì 9 maggio 2012 07:45
  • Mi Spiace Ma DI da errore quà              

    Lista_A.Add(riga, CType(wsA.Cells(riga, 1), Excel.Range).Value.ToString)

    Riferimento d'oggetto non impostato su un istanza d' oggetto ,

    Ps:  Ecco Il Codice 

            Dim Fp As String = "C:\Pavegi\Demo\FilePilota.xlsx"
            Dim Fq As String = "C:\Pavegi\Demo\FileQuote.xls"
    
            Dim ExcelApp As New Excel.Application
            Dim wsA As Excel.Worksheet = CType(ExcelApp.Workbooks.Open(Fp).ActiveSheet, Excel.Worksheet)
            Dim wsB As Excel.Worksheet = CType(ExcelApp.Workbooks.Open(Fq).ActiveSheet, Excel.Worksheet)
    
            Dim Lista_A As New Dictionary(Of Integer, String)
            Dim Lista_B As New List(Of String)
    
            For riga As Integer = 1 To 65000
                Lista_A.Add(riga, CType(wsA.Cells(riga, 1), Excel.Range).Value.ToString)
                Lista_B.Add(CType(wsB.Cells(riga, 1), Excel.Range).Value.ToString)
            Next
    
    
            Dim ExcelFinale As Excel.Workbook
    
    
            For Each p In Lista_A.Where(Function(e) Not Lista_B.Contains(e.Value))
                ExcelFinale = CType(ExcelApp.Workbooks.Add, Excel.Workbook)
                Dim FoglioFinale As Excel.Worksheet = CType(ExcelFinale.Worksheets.Add, Excel.Worksheet)
                FoglioFinale.Range("A" & +1).Value = "Nome Bilancio"
                FoglioFinale.Range("A" & +2).Value = CType(wsA.Cells(p.Key, 2), Excel.Range).Value
    
    
                If ExcelFinale IsNot Nothing Then
                    ExcelFinale.SaveAs("C:\Pavegi\Condomini" & FoglioFinale.Range("A" & +2).Value & ".xls")
                    ExcelFinale.Close()
                End If
            Next
            ExcelApp.Quit()

    Può Essere Che Ho Sbagliato qualcosa ....

    mercoledì 9 maggio 2012 13:27
  • Può darsi che non ci sia nessun valore in quella riga del file di excel.

    E' ovvio che il mio era un esempio per farti capire il meccanismo, sta a te adesso controllare che quel codice fuinzioni correttamente nella tua applicazione e con i dati che hai. Controlla i valori delle celle di excel prima di recuperarle.

    HTH


    Alberto De Luca [MVP - Visual Basic .NET]

    giovedì 10 maggio 2012 07:48
  • Può darsi che non ci sia nessun valore in quella riga del file di excel.

    E' ovvio che il mio era un esempio per farti capire il meccanismo, sta a te adesso controllare che quel codice fuinzioni correttamente nella tua applicazione e con i dati che hai. Controlla i valori delle celle di excel prima di recuperarle.

    HTH


    Alberto De Luca [MVP - Visual Basic .NET]

    Ok , non mi serviva usare la lista , ma ben si il valore singolo ..... osservate

    Private Sub LOL()
    
            Dim Fp As String = "C:\Pavegi\Demo\FilePilota.xlsx"
            Dim Fq As String = "C:\Pavegi\Demo\FileQuote.xls"
    
    
            Dim Excel_A As New Excel.Application
            Dim Excel_B As New Excel.Application
            Dim Excel_C As New Excel.Application
    
            Excel_A.Workbooks.Open(Fp)
            Excel_C.Workbooks.Open(Fq)
    
            Dim Foglio_A As Excel.Worksheet = CType(Excel_A.ActiveSheet, Excel.Worksheet)
            Dim Foglio_B As Excel.Worksheet = CType(Excel_B.ActiveSheet, Excel.Worksheet)
            Dim Foglio_C As Excel.Worksheet = CType(Excel_C.ActiveSheet, Excel.Worksheet)
    
            For Indice_A = 1 To Foglio_A.Range("A65000").End(Excel.XlDirection.xlUp).Row
    
                Dim Comodo_A = Foglio_A.Cells(Indice_A, 1).ToString
                Dim Indice_C = 0
    
                For Indice_B = 1 To Foglio_B.Range("D65000").End(Excel.XlDirection.xlUp).Row
    
                    Dim Comodo_B = Foglio_B.Cells(Indice_B, 4).ToString
    
    
                    If Comodo_A = Comodo_B Then
    
                        Indice_C += 1
    
                        MsgBox(Comodo_A)
                    Else
                        MsgBox("Diversi")
    
                    End If
    
    
                Next
    
            Next
    
    
        End Sub

    Però Mi Va In Errore  

        For Indice_B = 1 To Foglio_B.Range("D65000").End(Excel.XlDirection.xlUp).Row

    Perchè? 

    Spero Di Avere Le Vostre Risposte ;)

    giovedì 10 maggio 2012 13:44
  • Scusa.... non vorrei essere scortese ma non puoi cambiare ogni 5 minuti il risultato che ti occorre e sperare che qualcuno scriva la tua applicazione per te. Perchè 2 domande fa ti serviva un valore che adesso non ti serve più? Non è corretto usare i forum in questo modo. Le domande devono avere una logica ed i progressi che si raggiungono vanno seguiti altrimenti si perde il filo logico e non ci si capisce più niente. Oltretutto pretendi che qualcuno ti risolva l'errore senza neanche dire quale errore ti viene generato.... è come andare dal dentista e tenere la bocca chiusa...

    Alberto De Luca [MVP - Visual Basic .NET]

    giovedì 10 maggio 2012 13:57
  • Scusa.... non vorrei essere scortese ma non puoi cambiare ogni 5 minuti il risultato che ti occorre e sperare che qualcuno scriva la tua applicazione per te. Perchè 2 domande fa ti serviva un valore che adesso non ti serve più? Non è corretto usare i forum in questo modo. Le domande devono avere una logica ed i progressi che si raggiungono vanno seguiti altrimenti si perde il filo logico e non ci si capisce più niente. Oltretutto pretendi che qualcuno ti risolva l'errore senza neanche dire quale errore ti viene generato.... è come andare dal dentista e tenere la bocca chiusa...

    Alberto De Luca [MVP - Visual Basic .NET]

    Si Hai Ragione ,

    Se Gentilmente mi potresti dare una mano , L' Errore mi  dice sempre 

    Riferimento a un oggetto non impostato su un'istanza di oggetto.

    Ma c'è ....

    Non So più che fare :(

    giovedì 10 maggio 2012 14:44
  • Ciao,

    non so perche' ti ostini ad avere tutte quelle istanze di Excel... e alla fine ti perdi.

    Semplicemente il Foglio_B non esiste.

    Abbi pazienza ma mi trovo d'accordo con Luca... a me avevi chiesto delle cose, poi le hai cambiate, poi le ricambi ancora... credo che sia impossibile aiutarti.

    Ciao BlackSun

    giovedì 10 maggio 2012 15:41
  • Ciao,

    non so perche' ti ostini ad avere tutte quelle istanze di Excel... e alla fine ti perdi.

    Semplicemente il Foglio_B non esiste.

    Abbi pazienza ma mi trovo d'accordo con Luca... a me avevi chiesto delle cose, poi le hai cambiate, poi le ricambi ancora... credo che sia impossibile aiutarti.

    Ciao BlackSun

    Perchè Foglio_B non Esiste? 

    ps : Ho RIsolto Sono un Co**** Eccolo il mio Errore

    Excel_C.Workbooks.Open(Fq)

    in vece era

    Excel_B.Workbooks.Open(Fq)

    Ho Sbagliato La C con La B

    Ok .. Ora Provo Con Un Istanza Sola D'excel

    giovedì 10 maggio 2012 17:57
  • Ciao Amos97,

    Può essere difficile quando si desidera creare delle applicazioni più complesse, intanto vorrei ricordare che il forum è un ambiente dove si può discutere su problemi di sviluppo e si può chiedere l’aiuto da chi più esperto per poter imparare e capire dall’esperienza degli altri. Vogliamo evitare che venga interpretato come un luogo di consulenze gratuite, oppure come un luogo che riceva come input i dati di un problema per far generare la soluzione.

    Per una miglior interazione con gli altri membri, non occorre richiamare sull’aiuto se non si riceve una risposta in sei ore (qui non c’è il supporto 24 ore su 24, ma una community di chi dedica il suo tempo libero per aiutare gli altri), infatti basta seguire i thread in maniera logica e osservare le istruzioni del codice di comportamento, che si trova linkato nella sezione Annunci di ogni forum.

    Grazie dell’attenzione e buon community!


    Irina Turcu - Microsoft

    [Manifesto] Regole e Aspetti generali all'uso dei forum MSDN

    Questo contenuto è distribuito “as is” e non implica alcuna responsabilità da parte di Microsoft. L'azienda offre questo servizio gratuitamente, allo scopo di aiutare gli utenti e approfondire la loro conoscenza dei prodotti e tecnologie Microsoft.

    LinkedIn

    venerdì 11 maggio 2012 22:55