Newsgroup: it.comp.lang.visual-basic
Titolo: Richiesta aiuto Excel vba

Ciao a tutti
Come un "uccello" anche io devo migrare....
Ho un mio prg. in Qbasic che lavora su un file anagrafi.dat ad accesso
casuale
con un record cosi' definito:
TYPE RECORDANAGRAFICA
 BADGE     AS STRING * 40
 NOME      AS STRING * 20
 STATO     AS STRING * 2
 RILASCIO  AS STRING * 10
 DURATA    AS INTEGER
 SCADENZA  AS STRING * 10
 CARICO    AS LONG
 UTILIZZO  AS LONG
 RESIDUO   AS LONG
 NOTE      AS STRING * 20
END TYPE
Vorrei aprire il file con excel e disporre i vari record nelle caselle di un
foglio di lavoro
cosi' da poterle poi rielaborare e riuscire a creare un nuovo file
anagrafi.dat.
All'inizio avevo pensato di importare il file direttamente con Excel,
ma non gradiva il file sequenziale, allora ho fatto un programmino che
divideva i
record e li convertiva in  stringhe con un separatore, ma il primo campo
badge
puo' contenere qualsiasi carattere Ascii e nel seguente export perdevo le
informazioni
Allora ho pensato di sfruttare il VBA di Excel, definendo lo stesso tipo di
record,
per lavorarci direttamente.
Qui mi sono perso, ho cercato dei libri su VBA per Excel ma non li ho
trovati in libreria e
allora ho preso un paio sul VB 6 ma mi sto incasinando la vita.
Chi mi da' una dritta su come devo fare e se sono sulla strada giusta?
Grazie Murizio

 allora ho preso un paio sul VB 6 ma mi sto incasinando la vita.
Accendi il registratore di macro, poi fai una importazione manuale del file
(dove puoi specificare tutte le caratteristiche dei separatori ecc...).
Spegni il registratore di macro e hai il software pronto.
Ciao
Alberto

CUT


Ciao Alberto
come ho scritto, ho già provato così e non va bene.
Primo perchè in un file sequenziale ad accesso casuale, non ci sono
separatori dei campi o dei record,
inoltre non esiste neanche alla fine di ogni record il Carr.
Return,((10)+(13))
e' un unico "serpentone" di dati, e non sono neanche omogenei (alcuni
string, altri integer, altri long).
Ritengo di creare una procedura sub con all'interno una dichiarazione uguale
di type recordanagrafica,
poi creare una matrice in cui vado a leggere tutti i miei record, così
spostati in memoria tutti i miei campi,
posso disporli in una griglia di excel.
Ma come si fa' ad assegnare un valore di un campo ad una cella?
Es.
Type recordanagrafica
ecc
end type
Creo una matrice  elementi come variabile globale:
global elemento() as recordanagrafica
apro e sposto tutti i miei dati in una matrice e alla fine avro' qualcosa di
simile:
elemento(I).nome
elemento(I).ecc
con I che va dal primo all' ultimo record.
Come posso  dire ad excel che la casella A1 = elemento(1).nome ?
Spero di essere stato chiaro.
Grazie a chi vorrà aiutarmi.

Come posso  dire ad excel che la casella A1 = elemento(1).nome ?
dunque si in VBA quindi puoi scrivere:
Worksheets("Foglio1").range("A1").value=elemento(1).nome
dovrebbe funzionare anche (per riempire Exce tutto in un colpo):
Worksheets("Foglio1").range("A1:ZX").value=tutta la tua matrice
...o forse non ho capito ?
Ciao
Bye,
Antanik - antanik_NOSPAM_@hotmail_DOT_com
************************************
REMOVE NO SPAM FROM REPLY TO ADDRESS
************************************


Grazie penso che sia questa l'istruzione che volevo,
Spiegami meglio "Tutta la matrice "
che poi sarebbe quello che vorrei.


ok grazie ho risolto tutto
GRAZIE ANCORA
a volte basta poco........poi una volta partiti.......

che poi sarebbe quello che vorrei.
Worksheets("Foglio1").range("A1:ZX").value=elemento()
...prova e fammi sapere ... sicuramente con for ..next funziona ...
magari al posto di .range("A1") metti  .range(cells(contaFOR,2))


Ciao Antanik
Ho fatto cosi' e funziona bene
Grazie dell'aiuto.
Ho messo alla fine del messaggio il programmino sviluppato fino adesso ....
per i posteri che leggeranno questo msg.
E' comunque un punto di partenza.
Se sei ancora un po' pazientoso volevo fati qualche altra domanda:
mi daresti una dritta per fare il contrario,
 cioe' una volta importato il file e visualizzato su un foglio di lavoro,
 ed eseguo delle modifiche, per esportare il file sempre nel mio formato
record,
 come dovrei fare?
Seconda e ultima domanda:
  una volta creata la mia procedura "funzionante" vba
 da foglio di lavoro come creo un pulsante per richiamare il mio form  vba
ed eseguire i comandi in esso contenuti,
 cioe' i due pulsanti comando import ed export?
Grazie
Private Type RECORDANAGRAFICA
    BADGE     As String * 40
    NOME      As String * 20
    STATO     As String * 2
    RILASCIO  As String * 10
    DURATA    As Integer
    SCADENZA  As String * 10
    CARICO    As Long
    UTILIZZO  As Long
    RESIDUO   As Long
    NOTE      As String * 20
End Type
Dim Counter1 As Integer
Dim Counter2 As Integer
Dim ELEMENTO As RECORDANAGRAFICA
Private Sub CommandButton1_Click()
Open "C:\TEST\ANAGRAFI.DAT" For Random As #5 Len = Len(ELEMENTO)
If LOF(5) = 0 Then
    MsgBox "FILE ANAGRAFICA VUOTO O INESISTENTE!"
    Close #5
Else
    Worksheets("Foglio1").Activate
    Columns("A:J").Select
    Selection.Clear
     ActiveCell.FormulaR1C1 = "BADGE"
    Range("B1").Select
    ActiveCell.FormulaR1C1 = "NOME"
    Range("C1").Select
    ActiveCell.FormulaR1C1 = "STATO"
    Range("D1").Select
    ActiveCell.FormulaR1C1 = "RILASCIO"
    Range("E1").Select
    ActiveCell.FormulaR1C1 = "DURATA"
    Range("F1").Select
    ActiveCell.FormulaR1C1 = "SCADENZA"
    Range("G1").Select
    ActiveCell.FormulaR1C1 = "CARICO"
    Range("H1").Select
    ActiveCell.FormulaR1C1 = "UTILIZZO"
    Range("I1").Select
    ActiveCell.FormulaR1C1 = "RESIDUO"
    Range("J1").Select
    ActiveCell.FormulaR1C1 = "NOTE"
    Range("J2").Select
    For IND1& = 1 To LOF(5) / Len(ELEMENTO)
       Seek #5, IND1&
       Get #5, , ELEMENTO
    Counter2 = IND1& + 3
    Counter1 = 1
    Cells(Counter2, Counter1).Value = ELEMENTO.BADGE
    Cells(Counter2, Counter1 + 1).Value = ELEMENTO.NOME
    Cells(Counter2, Counter1 + 2).Value = ELEMENTO.STATO
    Cells(Counter2, Counter1 + 3).Value = ELEMENTO.RILASCIO
    Cells(Counter2, Counter1 + 4).Value = ELEMENTO.DURATA
    Cells(Counter2, Counter1 + 5).Value = ELEMENTO.SCADENZA
    Cells(Counter2, Counter1 + 6).Value = ELEMENTO.CARICO
    Cells(Counter2, Counter1 + 7).Value = ELEMENTO.UTILIZZO
    Cells(Counter2, Counter1 + 8).Value = ELEMENTO.RESIDUO
    Cells(Counter2, Counter1 + 9).Value = ELEMENTO.NOTE
     Next IND1&
Close #5
Columns("A:A").EntireColumn.AutoFit
    Columns("B:B").EntireColumn.AutoFit
    Columns("C:C").EntireColumn.AutoFit
    Columns("D:D").EntireColumn.AutoFit
    Columns("E:E").EntireColumn.AutoFit
    Columns("F:F").EntireColumn.AutoFit
    Columns("G:G").EntireColumn.AutoFit
    Columns("H:H").EntireColumn.AutoFit
    Columns("I:I").EntireColumn.AutoFit
    Columns("J:J").EntireColumn.AutoFit
    Range("A1:J1").Select
    With Selection
        .HorizontalAlignment = xlCenter
        .VerticalAlignment = xlBottom
        .WrapText = False
        .Orientation = 0
        .AddIndent = False
        .IndentLevel = 0
        .ShrinkToFit = False
        .ReadingOrder = xlContext
        .MergeCells = False
    End With
    Selection.Font.Bold = True
MsgBox "CONVERSIONE DAT->TXT  OK!"
End If
End Sub
Private Sub UserForm_Click()
End Sub