Valutazione 4.87/ 5 (100.00%) 5838 voti

Condividi:        

[excel] vba per confronto

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

[excel] vba per confronto

Postdi gio969 » 26/01/16 12:38

ciao a tutti,
ho trovato in rete la seguente macro che ho cercato di adattare alle mie esigenze. non ci sono del tutto riuscito e x questo vi chiedo aiuto:
Codice: Seleziona tutto
Sub cerca1()
    Dim sh As Worksheet
    Dim rng As Range
    Dim c As Range
    Set sh = ThisWorkbook.Worksheets("Foglio2")
    With sh
        Set rng = .Range("A13:a38")
        For Each c In rng
            If c.Value = Range("g12") Then
                MsgBox "GIA' PRESENTE"
                Application.CutCopyMode = False
                Exit Sub
                Exit For
            End If
        Next
    End With
    Range("g9").Select
Selection.End(xlDown).Select
ActiveCell.Offset(1, 0).Select
With ActiveCell
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
End With
End Sub

il suo lavoro lo fa bene tranne in questo punto: If c.Value = Range("g12") Then
vorrei, se fosse possibile, che invece di analizzare una sola cella, lo facesse a un range di celle (ho provato a mettere range("g12:g31") e non fonziona)
grazie anticipatamente per tutti gli aiuti

Edit: Inserito tag CODE. Anthony
gio969
Utente Junior
 
Post: 40
Iscritto il: 31/05/12 11:20

Sponsor
 

Re: [excel] vba per confronto

Postdi ricky53 » 26/01/16 13:37

Ciao,
sostituisci la tua istruzione
Codice: Seleziona tutto
If c.Value = Range("g12") Then


con la seguente
Codice: Seleziona tutto
If Application.CountIf(rng1, c.Value) > 0 Then


ATTENZIONE: prima devi definire il nuovo range ed impostarlo con il tuo intervallo, nell'esempio "G12:G31"



CONSIGLI:

1. indenta il codice avrai una leggibilità valida
2. attenzione alla presenza contemporanea di
Exit Sub
Exit For
viene e seguita la prima!

Cosa vuoi fare se si verifica la condizione di già presente?
In base alla tua esigenza si scriverà il codice corretto


Ecco un esempio di indentazione
Codice: Seleziona tutto
Sub cerca1()
    Dim sh As Worksheet
    Dim rng As Range, rng1
    Dim c As Range
    Set sh = ThisWorkbook.Worksheets("Foglio1")
    With sh
        Set rng = .Range("A13:a38")
        Set rng1 = .Range("g12:g31")
        For Each c In rng
'If c.Value = Range("g12") Then
            If Application.CountIf(rng1, c.Value) > 0 Then
                MsgBox "GIA' PRESENTE" & " - " & c.Value & " - " & c.Address ' L'ho modificata solo per le prove
                Application.CutCopyMode = False
' TOLTE solo per le prove !!!
' Exit Sub
' Exit For
            End If
        Next
    End With
    Range("g9").Select
    Selection.End(xlDown).Select
    ActiveCell.Offset(1, 0).Select
    With ActiveCell
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
        Application.CutCopyMode = False
    End With
End Sub
Dice il vecchio saggio provare e riprovare è l'unica strada per imparare

Più chiara è la vostra spiegazione
Più immediata sarà la nostra soluzione


. . . . . . . . . .
S.O. W7; Office 2003-10-13-16
Avatar utente
ricky53
Utente Senior
 
Post: 4223
Iscritto il: 11/04/09 19:29
Località: Italia

Re: [excel] vba per confronto

Postdi Anthony47 » 26/01/16 13:55

Bentornato Ricky
Ho aggiunto io al codice di gio969 il tag CODE.

Sposo la tua richiesta di chiarimento da parte di gio.

Intanto, per pura curiosita', il codice pubblicato potrebbe semplificarsi in
Codice: Seleziona tutto
Sub cerca11()
Dim sh As Worksheet
Set sh = ThisWorkbook.Worksheets("Foglio2")
If Application.WorksheetFunction.CountIf(sh.Range("A13:A38"), Range("G12").Value) > 0 Then
    MsgBox "GIA' PRESENTE"
Else
    Range("G9").End(xlDown).Offset(1, 0).PasteSpecial Paste:=xlPasteValues
End If
Application.CutCopyMode = False
End Sub

Ciao
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 13895
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: [excel] vba per confronto

Postdi gio969 » 26/01/16 14:06

grazie innanzitutto per la tua risposta e il lavoro che mi hai fatto.
cercherò di spiegare meglio quello che mi servirebbe fare.
inizio con questa istruzione a monte (che nn avevo specificato prima)
If ActiveCell.Address = "$A$13" Then
Range("A13").Select
Selection.Copy
Call cerca1
la macro cerca1 dovrebbe verificare che, la cella che sto copiando, non sia già presente nel range (g12:g31) dove sto per andare a incollarla. quindi:
se già presente---> msgbox " E' GIA' PRESENTE" e esce dalla macro
se non è presente----> cerca prima cella libera e incolla
Ora credo di essere andato in palla. forse ho trovato una soluzione che nn si adatta alle mie esigenze?
gio969
Utente Junior
 
Post: 40
Iscritto il: 31/05/12 11:20

Re: [excel] vba per confronto

Postdi gio969 » 26/01/16 14:57

mi è venuta un'altra idea. se usassi una colonna con il cerca verticale per verificare se il valore è già presente nel range (1 se presente 0 se no) protre fare poi una macro con riferimento alla cella ( con 0 parte cerca prima riga vuota e incolla. con 1 non fa niente)
cosa ne pensate?
gio969
Utente Junior
 
Post: 40
Iscritto il: 31/05/12 11:20

Re: [excel] vba per confronto

Postdi gio969 » 26/01/16 15:48

così funziona, un pò macchinoso ma funziona:)
nel worksheet:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If ActiveCell.Address = "$A$13" Then
Range("A13").Select
Selection.Copy
Call sceglimacro
End If
End Sub


nel modulo:
Sub verifica()
Range("g9").Select
Selection.End(xlDown).Select
ActiveCell.Offset(1, 0).Select
With ActiveCell
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
End With
End Sub

Sub sceglimacro()

If Range("d13").Value = "0" Then
Call verifica
Exit Sub
End If
If Range("d13").Value = "1" Then

Exit Sub
End If
End Sub

solo che così dovrei fare 31 macro :(
gio969
Utente Junior
 
Post: 40
Iscritto il: 31/05/12 11:20

Re: [excel] vba per confronto

Postdi Anthony47 » 26/01/16 19:53

Suggerimento: descrivi a grandi linee quale e' la struttura dati del tuo foglio di lavoro, come ci lavori sopra e di conseguenza cosa vorresti automatizzare, senza pubblicare codici che quelle cose non le fanno o non lo fanno completamente.
Se vuoi anche allegare un file di esempio allora e' anche meglio (per come fare guarda qui: viewtopic.php?f=26&t=103893&p=605487#p605487)

Al momento io non ho capito se il controllo va fatto utilizzando il contenuto della cella A13 e rispetto a quale /quali intervallo/i.

Ciao
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 13895
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: [excel] vba per confronto

Postdi gio969 » 27/01/16 10:42

ok proverò a spiegare meglio e scusatemi se ho creato confusione:
ho un elenco di celle nelle quali sono inseriti dei nomi, il range che include l'elenco va da a5 a a38, l'dea sarebbe che cliccando sopra la cella, il contenuto vada a incollarsi in un' altra colonna (range da g11 a g31) e tali valori nn si devono duplicare (es: se clicco nella a5 tale valore dovrà essere incollato una sola volta)
per risolvere il problema:
1- in un'altra colonna, per ciascuna riga, ho inserito il "cerca.vert con se" che consente di verificare che il valore su cui sto cliccando sia già incluso o meno nell'elenco che va da g11 a g31( se presente 1 se vuoto 0)
2- nel worksheet (codice)per ciascuna cella del range a5 a38 ho attivato al click una macro che legge la cella corrispondente (quella che contiene il cerca.vert) se 0 copia e cerca nel range g11 g 31 la prima cella libera e incolla il valore. se 1 esce dalla macro

unico inconveniente di questa procedura? ho dovuto creare per ciascuna cella del range a5 a38 una macro
grazie a tutti e buona giornata
gio969
Utente Junior
 
Post: 40
Iscritto il: 31/05/12 11:20

Re: [excel] vba per confronto

Postdi Anthony47 » 27/01/16 15:31

Ovviamente non c'e' nessun bisogno di creare una macro per ogni cella, e ragionevolmente si puo' fare tutto usando solo l'evento SelectionChange.
Quello che non ho capito e' con quale logica il contenuto delle cella A5:A38 (34 celle) deve essere copiato in G11:G31 (21 celle), e che cosa fare quando eventualmente tutte le celle G11:G31 sono piene e si selezionano altre celle al momento non ancora copiate. Prova a chiarire, per favore.
In generale non ho capito quale e' l'obiettivo finale, quindi non sono in grado di suggerire metodi alternativi per raggiungere lo stesso scopo.

Ciao
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 13895
Iscritto il: 21/03/06 16:03
Località: Ivrea


Torna a Applicazioni Office Windows


Topic correlati a "[excel] vba per confronto":


Chi c’è in linea

Visitano il forum: Nessuno e 18 ospiti