Excel Forum Per condividere esperienze su Microsoft Excel

Raddoppio dei dati importati

  • Messaggi
  • OFFLINE
    BG66
    Post: 265
    Registrato il: 13/12/2015
    Città: MILANO
    Età: 58
    Utente Junior
    2010
    00 28/04/2019 09:46
    La macro fatta è funzionante ma importa gli stessi dati per ben due volte. Dove ho sbagliato?


    PS Mi piacerebbe anche imparare come nel campo F importare esclusivamente "MARE" o "COLLINA" e non tutta la dicitura "STABILIMENTO DI...."

    Allego:
    DB Lavoratori V001.xlsm -> File destinazione
    ELEDIP.xlsx -> File sorgente

    Grazie per l'aiuto
    BG66
    Excel 2010
  • OFFLINE
    federico460
    Post: 1.767
    Registrato il: 10/10/2013
    Città: VICENZA
    Età: 69
    Utente Veteran
    365
    10 28/04/2019 10:42
    ciao
    non mi intendo di vba
    ma se vari

    Dim uRiga As Long
    Dim fg As Integer
    For fg = 1 To 2

    in


    Dim uRiga As Long
    Dim fg As Integer
    For fg = 1 To 1



    funziona.


    non è che è meglio azzerare le celle
    prima di copiare il file?

  • OFFLINE
    by sal
    Post: 5.656
    Registrato il: 14/11/2004
    Utente Master
    Office 2019
    10 28/04/2019 10:50
    Doppia estrazione
    Ciao bg perche fai fare il ciclo 2 volte, qui

       For fg = 1 To 1


    io ho messo ad 1 il secondo parametro, anche se non capisco quale sia il fatto di girare 2 fogli.

    per lo "STABILIMENTO DI" modifica la riga in

    .Offset(0, 5).Value = Mid(cella.Offset(0, 15).Value, 16) ' Stabilimento


    ti verrà riportato solo Mare o collina.

    Ciao By Sal [SM=x423051]
    se ti piace la soluzione sostienici con una DONAZIONE a piacere. Grazie clicca qui
  • OFFLINE
    dodo47
    Post: 2.198
    Registrato il: 06/04/2013
    Utente Veteran
    2010
    10 28/04/2019 10:55
    Ciao
    te li importa due volte per via del ciclo For fg = 1 To 2.

    La prima volta si trova fg=1 e importa i dati da ELEDIP, la seconda volta, con fg=2, avendo commentato l'istruzione if fg=2 then...., prosegue la macro.

    Ora devi chiarire se il ciclo deve essere fatto per entrambi i file esterni oppure no. Se lo devi fare per entrambi va bene così, ma se lo devi fare per uno solo dei file esterni, che bisogno hai di fare il ciclo?

    Per quanto riguarda MARE, COLLINA, se è esattamente come hai detto, potresti cercare la parole all'interno della cella da importare e, se trovata scrivere solo quella:

    ....
    If InStr(cella.Offset(0, 15).Value, "MARE") > 0 Then 'Stabilimento
    .Offset(0, 5).Value = "MARE"
    Else
    .Offset(0, 5).Value = "COLLINA"
    End If
    ......

    saluti


    Domenico
    Win 10 - Excel 2016
  • OFFLINE
    BG66
    Post: 265
    Registrato il: 13/12/2015
    Città: MILANO
    Età: 58
    Utente Junior
    2010
    00 28/04/2019 11:45
    [RISOLTO]
    Grazie a tutti.
    Script finale ( include suggerimenti di tutti!!):
    'Option Explicit 
    Sub EstraiDati()     
    Dim FileDiPartenza As Workbook     
    Dim FoglioDiPartenza As Worksheet     
    Dim PrimaColonnaDellaTabellaDiPartenza As Range     
    Dim FoglioDiArrivo As Worksheet     
    Dim PrimaColonnaDellaTabelladiArrivo As Range     
    Dim StatoDiSicurezza As MsoAutomationSecurity     
    Dim cella As Range  
    righe = Cells(Rows.Count, 1).End(xlUp).Row 
    For i = righe To 3 Step -1  
    If Selection.Value <> "" Then Selection.EntireRow.Delete 
    Next i          
    StatoDiSicurezza = Application.AutomationSecurity
    Application.AutomationSecurity = msoAutomationSecurityForceDisable     
    Set FileDiPartenza = Workbooks.Open(ThisWorkbook.Path & "/ELEDIP.xlsx"
    Application.AutomationSecurity = StatoDiSicurezza      
    
    Dim uRiga As Long     
    Dim fg As Integer     
    
    For fg = 1 To 1         
    If fg = 1 Then Set FoglioDiPartenza = FileDiPartenza.Worksheets("ELEDIP")         
    'If fg = 2 Then Set FoglioDiPartenza = FileDiPartenza.Worksheets("anagrafica (2)")      
    With FoglioDiPartenza         
    Set PrimaColonnaDellaTabellaDiPartenza = .Range(.Cells(2, 1).Address, .Cells(.Rows.Count, 1).End(xlUp).Address) 'ex .Range(.Cells(2, 1)     End With            
    With Foglio2         
    Set PrimaColonnaDellaTabelladiArrivo = .Range(.Cells(2, 1).Address, .Cells(.Rows.Count, 1).End(xlUp).Address)     
    End With     
    For Each cella In PrimaColonnaDellaTabellaDiPartenza                
    If Not LCase(cella.Offset(0, 14).Value) = "no" Then              
    With PrimaColonnaDellaTabelladiArrivo                 
    With .Cells(.Rows.Count).Offset(1)                     
    .Value = cella.Offset(0, 5).Value 'cognome
    .Offset(0, 1).Value = cella.Offset(0, 6).Value 'nome
    .Offset(0, 2).Value = cella.Offset(0, 8).Value 'data di nascita
    .Offset(0, 3).Value = cella.Offset(0, 7).Value 'CF
    .Offset(0, 4).Value = cella.Offset(0, 11).Value 'Sesso
    .Offset(0, 5).Value = Mid(cella.Offset(0, 15).Value, 16) ' Stabilimento                     
    '.Offset(0, 6).Value = cella.Offset(0, 14).Value                 
    End With                              
    End With                        
    With Foglio2                 
    Set PrimaColonnaDellaTabelladiArrivo = .Range(.Cells(1, 1).Address, .Cells(.Rows.Count, 1).End(xlUp).Address)             End With         End If     
    Next  
    Next fg                
    Application.DisplayAlerts = False         
    FileDiPartenza.Close savechanges:=0     
    Application.DisplayAlerts = True          
    Call Metti_Bordi  
    End Sub 
    


    PS Ultimo aiuto: Quale è la DIM giusta per definire righe ??
    ("righe = Cells(Rows.Count, 1).End(xlUp).Row ").
    Al momento, per ovviare, ho disabilitato 'Option Explicit (!!)

    @Dodo47: In realtà l'importazione riguarda solo ELEDIP ma ho provato a ripulire lo script incasinandomi e quindi ho preferito lasciare tutto purtroppo ....anche l'errore.


    [Modificato da BG66 28/04/2019 12:00]
    BG66
    Excel 2010
  • OFFLINE
    Marius44
    Post: 688
    Registrato il: 24/06/2015
    Città: CATANIA
    Età: 80
    Utente Senior
    Excel2019
    00 28/04/2019 12:45
    Ciao Gene

    Quale è la DIM giusta per definire righe ??



    Che io sappia righe e colonne sono sempre Long

    Ciao,
    Mario
  • OFFLINE
    dodo47
    Post: 2.199
    Registrato il: 06/04/2013
    Utente Veteran
    2010
    00 28/04/2019 12:46
    ciao
    la dim è Long (per precauzione in quanto non si sa quante righe devi elaborare, se sei sicuro che non possono essere più di 32.767 va bene anche integer). Cerca in internet excel numeric data type.

    Ma a che ti serve il For fg = 1 To 1 e relativo next ??

    E' inutile, toglilo

    così pue il successivo If....

    .....
    Dim uRiga As Long
    Set FoglioDiPartenza = FileDiPartenza.Worksheets("ELEDIP")
    .....

    Togli il Next fg

    saluti

    (ps: non entro nel merito del codice che, per copiare 5-6 celle, è contorto e ridondante.
    Sei sicuro che funziona come vuoi? anche la cancellazione iniziale delle celle??
    Che ci stanno a fare tutte quelle With...End With??
    Perchè non indenti il codice che è illegibile?)


    [Modificato da dodo47 28/04/2019 13:35]
    Domenico
    Win 10 - Excel 2016
  • OFFLINE
    BG66
    Post: 266
    Registrato il: 13/12/2015
    Città: MILANO
    Età: 58
    Utente Junior
    2010
    00 28/04/2019 14:07
    Ciao Domenico,
    il codice nasce indentato ma quando provo a caricarlo sul form si sballa.
    In pratica da sempre quando scrivo sul forum:
    1) premo Code
    2) mi propone ([TESTO) ma senza una parentesi quadra finale
    3) sostituisco la parola TESTO con CODE e aggiungo la parantesi che manca
    4) incollo lo script che si presenta tutto su una sola riga
    5) vado singolarmente a separarli utilizzando invio per mandarli a capo
    6) sostituisco la parola \TESTO con \CODE a chiusura dello script comprendendola tra le parentesi quadre


    Pensavo che fosse un limite della piattaforma su cui gira il forum....ma la tua affermazione mi porta a pensare che utilizzo male i tasti (!!??)

    Buona domenica a tutti.
    [Modificato da BG66 28/04/2019 14:27]
    BG66
    Excel 2010
  • OFFLINE
    dodo47
    Post: 2.200
    Registrato il: 06/04/2013
    Utente Veteran
    2010
    00 28/04/2019 16:23
    ciao Gene
    prova a scrivere manualmente (senza spazi):

    [ TESTO ]
    qui incolli
    le tue
    istruzioni
    [ / TESTO ]



    qui incolli
        le tue
    istruzioni
    



    saluti


    [Modificato da dodo47 28/04/2019 16:30]
    Domenico
    Win 10 - Excel 2016
  • OFFLINE
    raffaele1953
    Post: 3.746
    Registrato il: 28/06/2011
    Città: AGORDO
    Età: 70
    Utente Master
    2013
    00 28/04/2019 16:50
    Ciao a tutti
    Se qualche esperto riesce spiegarmi cosa serve "MsoAutomationSecurity". Grazie mille

    A parte il VBA scritto nel messaggio ore 11.45 è errato
    Stavo pensando al ....For fg = 1 To 2
    Forse l'utente avrà la neccessità di copiare dati pure da altri fogli ???
    Infatti nel codice esiste pure un FileDiPartenza.Worksheets("anagrafica (2)"
    A parte questo, volevo ricordare che alla fine sarebbe meglio disattivare tutti quei SET
    Domanda banale, non sarebbe meglio copia/incolla i dati senza usare un ciclo?
    Casomai usare alla fine il ciclo For per togliere "STABILIMENTO DI "

    Ps. In teoria se premi CODE e ci scrivi VB e premi OK due volte, tra la parentesi chiusa e quella aperta inserisci il codice
    Option Explicit
    Sub EstraiDati_2()
    Dim Ur As Long, X As Long
    Ur = Range("F" & Rows.Count).End(xlUp).Row
        For X = 3 To Ur
            Cells(X, 6) = Replace(Cells(X, 6), "STABILIMENTO DI ", "")
        Next X
    End Sub
    Excel 2013
  • OFFLINE
    dodo47
    Post: 2.201
    Registrato il: 06/04/2013
    Utente Veteran
    2010
    00 28/04/2019 17:12
    Re:
    raffaele1953, 28/04/2019 16.50:

    Ciao a tutti
    cosa serve "MsoAutomationSecurity".



    https://docs.microsoft.com/it-it/office/vba/api/excel.application.automationsecurity

    Essenzialmente per disabilitare le macro in un file che viene aperto tramite codice.
    In questo caso è superfluo visto che viene aperto un .xlsx
    L'uso corretto è quello esposto nella macro, cioè:
    - prima si alimenta una variabile con lo stato di sicurezza di default
    - poi si "forza la disabilitazione delle macro"
    - quindi si apre il file esterno
    - infine si riporta allo stato di default

    Il file da aprire è uno solo (vedi in calce a risposta #5).


    Domenico
    Win 10 - Excel 2016
  • OFFLINE
    by sal
    Post: 5.657
    Registrato il: 14/11/2004
    Utente Master
    Office 2019
    00 29/04/2019 08:13
    Inserire codice Identato
    Ciao Quando si inserisce un codice nel post, lo si seleziona e poi si preme il pulsante "Code" sotto il post, viene proposto "Testo" modificare in "vb" e premere invio 2 volte se non si vuole inserire il titolo della macro.

    Ciao By Sal [SM=x423051]

    se ti piace la soluzione sostienici con una DONAZIONE a piacere. Grazie clicca qui
  • 15MediaObject5,00312 3