aiuto su macro



  • aiuto su macro
    di gio (utente non iscritto) data: 13/09/2012 12:35:34

    ciao a tutti,
    sto sviluppando [o almeno ci tento] per lavoro una macro...
    purtroppo non ho mai usato ecxel e sto un po andando a tentativi..e mi servono un po di consigli che man mano vi chiederò..

    per adesso una domanda molto semplice..
    voglio importare tanti file quanti ne contiene una data cartella, ma metterli uno in ogni foglio di lavoro per poi estrarre i dati che mi servono e elaborarli su un altro foglio ancora [altra cosa di cui temo di aver bisogno..ma ci penserò dopo]..
    con il codice qui sotto li importa ma tutti nello stesso foglio [presumibilmente perchè nel campo DESTINATION è specificato RANGE("A1")..ma come faccio a dirgli di metterlo in un altro foglio??

    ho provato con "destinatio:=sheets("foglio2").range("a1") ma mi da errore
    -------
    Sub OpenFiles2()
    Dim MyFolder As String
    Dim MyFile As String
    MyFolder = "D:Documents and Settings105058344Desktopmacro piede"
    MyFile = Dir(MyFolder & "*.txt")


    Do While MyFile <> ""
    With ActiveSheet.QueryTables.Add(Connection:= _
    "TEXT;" & MyFile, Destination:=Range("A1"))
    '.Name = "Nuovo Documento di testo (2)_1"
    .FieldNames = True
    .RowNumbers = False
    .FillAdjacentFormulas = False
    .PreserveFormatting = True
    .RefreshOnFileOpen = False
    .RefreshStyle = xlInsertDeleteCells
    .SavePassword = False
    .SaveData = True
    .AdjustColumnWidth = True
    .RefreshPeriod = 0
    .TextFilePromptOnRefresh = False
    .TextFilePlatform = 850
    .TextFileStartRow = 1
    .TextFileParseType = xlDelimited
    .TextFileTextQualifier = xlTextQualifierDoubleQuote
    .TextFileConsecutiveDelimiter = True
    .TextFileTabDelimiter = True
    .TextFileSemicolonDelimiter = False
    .TextFileCommaDelimiter = False
    .TextFileSpaceDelimiter = True
    .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
    .TextFileTrailingMinusNumbers = True
    .Refresh BackgroundQuery:=False
    End With

    MyFile = Dir
    Loop
    End Sub
    --------

    grazie



  • di HarryBosch data: 13/09/2012 13:03:57

    Ciao Gio
    non ho guardato niente del codice, ma se quel comando

    "ho provato con "destinatio:=sheets("foglio2").range("a1") ma mi da errore "

    l'hai copiato di pari con quello che hai inserito nel codice, ti faccio notare che manca una "n" in destination...
    Altrimenti la dicitura per inserirlo in un foglio specifico è esatta



  • di gio (utente non iscritto) data: 13/09/2012 13:32:22

    no bè ovviamente l'ho scritto giusto nel programma..ho dimenticato la N perchè l'ho trascritto a mano...
    comuqnue l'errore che mi da è questo:
    "errore di runtime -2147024809(80070057)
    l'intervallo di destinazione non è sullo stesso foglio utilizzato per creare la tabellaquery"



  • di Vecchio Frac data: 13/09/2012 14:30:20

    A parte l'approccio all'apertura dei file (io userei un FileSystemObject per esempio, e ciclerei sui file presenti in quella cartella, a me qualche volta Dir() ha fatto qualche scherzo), dovresti considerare l'idea che ci sono altre strade per accedere ai file di testo...
    Una è utilizzare semplicemente Open file For Input As #1.
    L'altra è importare i dati da File --> Apri (senza scomodare le QeeryTables, capisco che il registratore di macro è utile ma bisogna saper scremare le miriadi di schifezze che ci butta dentro ^_^)

    Una cosa come questa potrebbe bastare (bisogna vedere come sono separati i dati, se da tab o virgola o spazio o altro, ma questo è un altro discorso):

    (Loop su tutti i file presenti nella directory)
    Workbooks.OpenText Filename:= _
    "filename_here.txt", Origin:=xlMSDOS, _
    StartRow:=1, DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, _
    ConsecutiveDelimiter:=False, Tab:=True, Semicolon:=False, Comma:=False _
    , Space:=False, Other:=False





  • di HarryBosch data: 13/09/2012 14:32:01

    invece di scrivere il foglio nella query, prova ad attivarlo prima di agire:

    Sheets("Foglio2").Activate
    Do While MyFile <> ""
    With ActiveSheet.QueryTables.Add(Connection:= _
    "TEXT;" & MyFile, Destination:=Range("A1"))




  • di gio (utente non iscritto) data: 13/09/2012 15:24:09

    fermo restando che FORSE ho trovato una soluzione per aggirare questo problema...devo ancora lavorarci..
    qualcuno mi sa dire perchè ogni tanto apparentemente a caso senza modificare nietne mi esce questo errore?

    "impossibile trovare il file di testo necesario per aggiornare l'intervallo di dati esterno.
    controllare che il file non sia stato aggiornato o rinominato, quindi riprovare l'aggiornamento."




  • di HarryBosch data: 13/09/2012 15:50:23

    se usi il suggerimento di Vecchio Frac l'importazione ti verrebbe più semplice.
    Comunque secondo me potrebbe esserci un errore nei riferimenti; quell'errore significa che non trova il percorso...

    adesso, non sono un esperto di query, ma prova a correggere in questo modo:

    .
    With ActiveSheet.QueryTables.Add(Connection:= _
    "TEXT;" & MyFolder & "" & MyFile, Destination:=Range("A1"))
    .
    .



  • di Vecchio Frac data: 13/09/2012 16:06:31

    Vi illustro cosa intendo per un "Loop su tutti i file".
    Non riporto nè Option Explicit nè le diverse necessarie Dim perchè le lascio alla vostra fantasia :)
    Alla fine avrai tanti file diversi, ognuno con il contenuto del file di testo.
    Non so se è quello che volevi, o se piuttosto non volevi importare i file di testo in fogli diversi dello stesso file.
     
    Set ff = CreateObject("Scripting.FileSystemObject").GetFolder(myPath).Files
    For Each f In ff
        If Right(f, 3) = "txt" Then
            'ho raggiunto un file .txt e ci faccio quel che voglio :)
            'i dati, nel file di testo, sono separati da carattere di tabulazione! 
            'se non è così modificare la prossima istruzione :)
            Workbooks.OpenText Filename:= f, DataType:=xlDelimited, Tab:=True
        End If
    Next






  • di Vecchio Frac data: 13/09/2012 16:20:57

    Vanni vede giusto (devi specificare il path completo del nome del file).
    Come poco fa anche lui ti ha fatto notare comunque dovrai passare, ad ogni Do While, il nome del foglio da utilizzare oppure attivarlo prima di aprire la connessione ai dati.
    In che modo dirai ad Excel il nome del foglio sul quale incorporare i dati? Bè, se i nomi dei fogli hanno tutti una struttura definita (foglio1, foglio2, foglio3, ecc.) potresti anche cavartela con un indice appiccicare per esempio a Sheets("Foglio" & index).Activate





  • di gio (utente non iscritto) data: 13/09/2012 16:30:23

    harrybosch hai ragione...non so perchè ma funziona con la tua modifica...anche se non capisco il motivo visto che tu hai aggiunto "myfolder" all'indiirzzo a cui pescava il file...ma in teoria myfolder è gia compreso nella stringa myfile [MyFolder = "D:Documents and Settings105058344Desktopmacro piede"
    MyFile = Dir(MyFolder & "*.txt")]
    o sbaglio? e sopratutto la parte interessante è che prima funzionava anche come l'avevo scritto io!!!!!!!!! solo che a un certo punto ha ben deciso di uscire quell'errore relativo al file che non trovava...boh...comuqnue il risultato è lo stesso di prima ma senza quell'errore.. e va bene cosi perchè forse ho trovato un modo di utilizzare i dati aneh se me li concatena tutti nello stesso file invece che separarmeli in fogli diversi...[gioco un po con cicli e offset]

    @vecchiofrac: la tua soluzione non l'ho ancora testata per adesso perchè forse me la cavo lo stesso col codice che ho scritto io all'inizio..ci tornerò se incontro difficoltà piu avanti

    PS: se mi suggerite codici non omettete nietne o non lasciate neitne per scontato perchè a parte qualche cazzatina a scuola di visual basic non so NIENTE...ergo sto imparando tutto da solo tramite excel...è un progetto che sto facendo per la mia ditta a lavoro non è il compitino delle vacanze di scuola..quindi avrei bisogno di imparare bene in modo da poterlo sviluppare da solo in futuro...
    sto gia abbattendo una quantità incredibile di santi e madonne a furia di bestemmiare ogni volta che trovo un errore stupido..ma piano piano sto imparando...xd ;) grazie ragazzi..

    tengo aperto questo topic per chiedervi eventuali aiuti nei prossimi giorni
    visto che il progetto è molto molto oltre le mie attuali capacità di programmazione!



  • di HarryBosch data: 13/09/2012 16:50:01

    Bravo Gio!
    se stai "abbattendo una quantità enorme di ...." ecc.. allora sei uno che veramente vuole imparare. Credo che ci passino tutti da quella fase iniziale.. e anche dopo (parlo per il sottoscritto!) :)
    Comunque, ecco un paio di consigli per ridurre e cercare di capire gli errori:
    - qua riprendo Vecchio Frac, dicendoti di impostare di default l'Option Explicit: in questo modo eviti gli errori sulle variabili
    - apri la finestra delle variabili locali e scorri il codice con F8 per vedere che valore assumono man mano che passi le istruzioni (qualora il codice funzionasse ma non ottenessi il risultato voluto)

    In ogni caso, se consideri risolto questo thred, meglio spuntarlo e aprirne uno nuovo anche se in qualche modo si lega a questo. Meglio affrontare ogni piccolo argomento in posizioni diverse, anche per una maggiore chiarezza di tutti.
    Ciao, Vanni



  • di HarryBosch data: 13/09/2012 16:54:38

    dimenticavo di puntualizzare (ma devo aprire una nuova finestra di dialogo... Maurooo ):
    con la finestra delle variabili locali che ti ho indicato controllati che valori assumono
    MyFolder e MyFile
    così verifichi come viene assunto il percorso e il perchè di quel "" interposto.



  • di gio (utente non iscritto) data: 13/09/2012 16:59:45

    wow geniale la mossa delle variabili..molto utile! facevo gia il debug con f8 ma non sapevo si potesse vedere in tempo reale le variabili in gioco..grazie..

    comquneu se preferite chiudo il caso, ma molto probabilmente ne riaprirò un altro domani mattina perchè ne troverò a centinaia di errori assurdi..per quello ho dato un nome generico al 3d...non volevo infestarvi il forum di miei 3d...xd



  • di HarryBosch data: 13/09/2012 17:12:33

    Ok, allora spunto la discussione come risolta.
    Puoi aprire i thred quando vuoi, qualcuno ci sarà a risponderti.
    E piuttosto di un titolo generico, cerca di trovarne uno conciso che rispecchi l'argomento.