Buongiorno a tutti,
dopo aver "scroccato" parecchia conoscenza dai post di questo sito mi trovo costretto a doverne aggiungere uno per un problema che ho visto essere abbastanza diffuso su Internet...
Premetto che non ho alcuna conoscenza di VBA ma nel corso degli ultimi mesi ho potuto fare una certa esperienza (specialmente grazie ai post riportati su questo sito) e sono arrivato al punto di dover creare un file excel, copiando i dati da un Access, che abbia parte dei campi formattati con la convalida dati (quindi selezione da un menu a tendina).
Prima di descrivere il problema, inquadro un attimo la situazione:
1. il codice che ho scritto, eseguito da una macro in Access, genera un file excel per ogni "Tecnico" presente all'interno di un tabella Access
2. ogni file excel si compone dei seguenti fogli (creati in automatico):
- foglio 1: contiene i dati grezzi. In alcune colonne sono presenti dei dati a cui va applicata la convalida dati. Ogni colonna da convalidare ha il suo preciso set di dati (diversi per ciascuna colonna)
- foglio 2..7: ogni foglio contiene nella prima colonna gli attributi da utilizzare per convalidare i dati delle colonne del foglio 1. La numerosità degli attributi è variabile (massimo 5/6) e sono tutti testo
3. ho scritto una macro che su click permette di esportare, con un ciclo, tutti questi file excel. Mi sono però impantanato (e non credo di essere l'unico a quanto si vede sul web) sull'impostazione della formattazione dei dati da convalidare (quelli con menù a tendina)...
Questo è il pezzo di codice che utilizzo per convalidare i dati delle colonne:
Dim oBook As Object
Dim oSheet As Object 'questo è il primo foglio che contiene i dati grezzi da convalidare
Dim oSheetIrr As Object ' questo è il secondo foglio che contiene il primo set di attributi, da applicare alla colonna I del primo foglio
Dim oRange As Object
Dim path As String ' path contiene il percorso da dove prendere il file excel, parametrico in base al nome del "tecnico"
Set oExcel = CreateObject("Excel.Application")
Set oBook = oExcel.Workbooks.Open(path)
Set oSheet = oBook.Worksheets(1)
Set oSheetIrr = oBook.Worksheets(2)
Dim arr As Variant
arr = Array(oSheetIrr.Range("A2:A6")) 'questo array contiene i valori degli attributi da applicare sulla colonna I
Set oRange = oSheet.Range("I2:I10")
With oRange.Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:=Join(arr, ",")
.IgnoreBlank = True
.InCellDropdown = True
.InputTitle = ""
.ErrorTitle = ""
.InputMessage = ""
.ErrorMessage = ""
.ShowInput = True
.ShowError = True
End With
oBook.Save
oExcel.Quit
Il problema è il seguente:
1) se nell'istruzione ADD TYPE, nella formula, mette il riferimento al foglio contenente gli attributi mi viene restituito
l'errore 1004 (che, investigando, non sono riuscito a risolvere in nessuna maniera proposta dal web)
2) ho trovato un utente su internet che propone di utilizzare un array (come nell'esempio), per definire nella formula di ADD TYPE i valori che può assumere. Ora utilizzando questo stratagemma mi viene restituito
l'errore 13: "tipo non corrispondente", con riferimento alla riga dell'istruzione ADD TYPE
Vi chiedo, se esiste una soluzione a tutto ciò, di spiegarmela dettagliatamente in modo che possa implementarla senza rompervi ulteriormente le scatole.
Aggiungo che quanto ho creato fin ora è stato dettato da ragioni di tempistiche brevi, sicuramente esisteranno metodi più "economici" dal punto di vista di tempo e spazio utilizzati per modellizzare questa situazione ma al momento mi accontento di quello che ho e vorrei solo risolvere questo problema.
Probabilmente l'errore sta nel fatto che non ho ancora una conoscenza basica del VBA e mi sto perdendo qualcosa, ma sbagliando s'impara non è vero?
Grazie mille a tutti coloro che tenteranno di aiutarmi
Saluti