Vai al contenuto
PLC Forum


Find Next In Vba - Aiuuuutoooooo


gabri

Messaggi consigliati

Salve a tutti!

Ho 1 problema con l'istruzione find next in VBA per 1programmino in excel che sto facendo..

Quando lancio l'istruzione "find next" il risultato è sempre "Nothing", eppure sono certo che nell'area di ricerca sono presenti!!

Se ci fosse qualche esperto in "ascolto" supplico aiuto e allego il codice della parte incriminata.....

Grazie in anticipo :D:D:D:D

Saluti

Private Sub Cerca(ValoreRicerca, AreaRicerca)

With Worksheets(\"DATI\")

  Set f = .Range(\"C5:C25\").Find(Fornitore.Value, LookIn:=xlValues)

  forn = f.Row

  FileDaAprire = Cells(forn, 4).Value

  colsconti = Cells(forn, 6).Value

  AreaTab = .Cells(forn, 7).Value

End With

Workbooks.Open (FileDaAprire)

With Worksheets(1).Range(AreaRicerca)

  Set c = .Find(ValoreRicerca, LookIn:=xlValues)

End With

Do

  If c Is Nothing Then

    MsgBox (\"RICERCA ALL'INTERNO DEL LISTINO \" & Fornitore.Value & \" EFFETTUATA\")

    Exit Sub

  Else

    linea = c.Row

With Worksheets(1)

    CodCorr = .Cells(linea, 1)

    DescrizList = .Cells(linea, 3)

    ' se è numerico allora prendo direttamente lo sconto

    If IsEmpty(AreaTab) Then

      Sconto.Value = .Cells(linea, colsconti)

    Else ' se sigla cerco la tabella

      Sconto.Value = Sconta(.Cells(linea, colsconti))

    End If

    PrezzoList.Value = .Cells(linea, 4)

    Response = MsgBox(CodCorr + \" : \" + DescrizList, vbAbortRetryIgnore, \"Ricerca Prodotto\")

    If Response = vbIgnore Then Exit Sub

End With

With Worksheets(1).Range(AreaRicerca)

    If Response = vbRetry Then Set c = .FindNext©

End With

If Response = vbAbort Then

  CodProd.Value = CodCorr

  Descriz.Value = DescrizList

End If

  End If

Loop While Response = vbRetry

End Sub

Link al commento
Condividi su altri siti


With Worksheets("DATI")

Set f = .Range("C5:C25").Find(Fornitore.Value, LookIn:=xlValues)

forn = f.Row

FileDaAprire = Cells(forn, 4).Value

colsconti = Cells(forn, 6).Value

AreaTab = .Cells(forn, 7).Value

End With

Senza il "punto" (.Cells) FileDaAprire e colsconti probabilmente rimangono vuoti.

Link al commento
Condividi su altri siti

ciao Dago (e ciao a tutti...),

il problema non è quello, avevo già fatto esperimenti a riguardo e le2 sintassi in questo caso danno lo stesso risultato.

Comunque grazie x l'attenta analisi, in ogni caso ora ho aggiunto i punti :D

Il problema è l'elemento "c" che risulta con valora "Nothing" quando eseguo il find next, tra l'altro ho l'impressione che il malfunzionamento sia iniziato da quando ho inserito questa parte:

    ' se è numerico allora prendo direttamente lo sconto

    If IsEmpty(AreaTab) Then

      Sconto.Value = .Cells(linea, colsconti)

    Else ' se sigla cerco la tabella

      Sconto.Value = Sconta(.Cells(linea, colsconti))

    End If

Link al commento
Condividi su altri siti

If IsEmpty(AreaTab)... significa piu' o meno "Se la variabile e' stata inizializzata...", C'e' qualcosa che non mi torna, perche' questa condizione ?

Modificato: da dago_
Link al commento
Condividi su altri siti

E' 1 discorso1po' lungo...

Selezionando il fornitore al quale inviare l'ordine, seleziono la cella un cui ho l'area della tabella codici-sconti per il fornitore stesso.

Se x esempio cerco un prodotto fornito da siemens, selezionando SIEMENS nella maschera, carico il link al listino (C:\Documenti\XL0403.xls) e l'area nel mio file excel in cui ho inserito la tabella corrispondenza codici-sconti, quindi AreaTab=B10..C53 e tra quelle celle cercherò il codice corrispondente tramite la funzione Sconta(.Cells(linea,Colsconti), che è bella astrusa anche lei... :blink:

alcuni fornitori non hanno 1corrispondenza codici-sconti, quindi AreaTab=Empty e vado direttamente a leggere la colonna sconti nel loro listino.

Tutto questo fortunatamente funziona..... :D

Siccome la prima volta mi trova tranquillamente il valore richiesto, non capisco perchè con in find next mi dia Nothing in "c", forse il problema è che qualcosa mi annulla il valore di "c"!!!!!!!

Oppure che per l'inserimento di qualche istruzione(ho sospetti sugli "With")mi si annulli la possibilità di eseguire il find next tenendo buono lo stesso elemento...

Grazie Ancora e...buon pranzo che è ora (se mi passate la rima obbligata)

Link al commento
Condividi su altri siti

Questo esempio funziona:

Sub Cerca()

'Listino Siemens XL0603.xls

    Call ProvaFindNext(\"A1:A30000\", \"6ES7\")

End Sub

Sub ProvaFindNext(Area, Codice)

Dim Response

Dim Conta

With Worksheets(1).Range(Area)

    Set c = .Find(Codice, LookIn:=xlValues)

    If Not c Is Nothing Then

        firstAddress = c.Address

        Do

            Conta = Conta + 1

            Response = MsgBox(\"Trovato: \" + c.Value + vbCrLf + \"Vuoi continuare ?\" _

            , vbYesNo, \"FindNext \" + CStr(Conta))

            Set c = .FindNext©

            If Response <> vbYes Then Exit Sub

        Loop While Not c Is Nothing And c.Address <> firstAddress

    End If

End With

End Sub

Link al commento
Condividi su altri siti

Grandissimo!Grazie1000

Ora lo provo e ti faccio sapere se son riuscito ad applicarlo

Purtroppo non riesco a capire cosa c'e' che non va nel tuo codice.
Link al commento
Condividi su altri siti

Ho provato con il tuo codice,ho tolto alcune cose altrimenti era troppo una menata,in ogni caso la parte "incriminata" sembra a posto.

Private Sub Cerca(AreaRicerca, ValoreRicerca)

With Worksheets(1).Range(AreaRicerca)

  Set c = .Find(ValoreRicerca, LookIn:=xlValues)

End With

Do

  If c Is Nothing Then

    MsgBox (\"RICERCA ALL'INTERNO DEL LISTINO \" & Fornitore.Value & \" EFFETTUATA\")

    Exit Sub

  Else

    linea = c.Row

  With Worksheets(1)

    CodCorr = .Cells(linea, 1)

    DescrizList = .Cells(linea, 3)

    ' se è numerico allora prendo direttamente lo sconto

    If IsEmpty(AreaTab) Then

      'Sconto.Value = .Cells(linea, colsconti)

    Else ' se sigla cerco la tabella

      'Sconto.Value = Sconta(.Cells(linea, colsconti))

    End If

    'PrezzoList.Value = .Cells(linea, 4)

    Response = MsgBox(CodCorr + \" : \" + DescrizList, vbAbortRetryIgnore, \"Ricerca Prodotto\")

    Select Case Response

        Case vbIgnore

            Exit Sub

        Case vbRetry

            Set c = .Range(AreaRicerca).FindNext©

        Case vbAbort

        '

    End Select

  End With

  End If

Loop While Response = vbRetry

End Sub

Link al commento
Condividi su altri siti

RISOLTO L'ARCANO!

Ho notato che la maggiore differenza tra il tuo codice e il mio è che nel mio c'era una giungla di With, worksheets ecc...

Evidentemente se sono già in una condizione di with non posso uscire dal "percorso" e usarne un'altra... mi spiego: non è possibile una situazione del genere:

With worksheets(1).range(A10..B20)

....

Sconto=worksheet(1).cells(linea,3)

end with

Essendo già in un with non posso ripetere nello stesso un altro worksheets, se no si incasina!!!

Ora è un po' + pulito...e funzionante :D

Dago

Thanks thousands again(anche se sicuramente non si dirà così.....)

e,tanto che ci siamo, postiamo la soluzione definitiva, così se x caso la reincasino torno nel forum e la riprendo!!! :D:D

Private Sub Cerca(ValoreRicerca, AreaRicerca)

With Worksheets(\"DATI\")

  Set f = .Range(\"C5:C25\").Find(Fornitore.Value, LookIn:=xlValues)

  forn = f.Row

  FileDaAprire = .Cells(forn, 4).Value

  colsconti = .Cells(forn, 6).Value

  AreaTab = .Cells(forn, 7).Value

End With

Workbooks.Open (FileDaAprire)

With Worksheets(1)

  Set c = .Range(AreaRicerca).Find(ValoreRicerca, LookIn:=xlValues)

  Do

If c Is Nothing Then

    MsgBox (\"RICERCA ALL'INTERNO DEL LISTINO \" & Fornitore.Value & \" EFFETTUATA\")

    Exit Sub

Else

    linea = c.Row

    CodCorr = .Cells(linea, 1)

    DescrizList = .Cells(linea, 3)

    ' se è numerico allora prendo direttamente lo sconto

    If IsEmpty(AreaTab) Then

      Sconto.Value = .Cells(linea, colsconti)

    Else ' se sigla cerco la tabella

      Sconto.Value = Sconta(.Cells(linea, colsconti))

    End If

    PrezzoList.Value = .Cells(linea, 4)

    Response = MsgBox(CodCorr + \" : \" + DescrizList, vbAbortRetryIgnore, \"Ricerca Prodotto\")

    If Response = vbIgnore Then Exit Sub

    If Response = vbRetry Then Set c = .Range(AreaRicerca).FindNext©

    If Response = vbAbort Then

  CodProd.Value = CodCorr

  Descriz.Value = DescrizList

    End If

End If

  Loop While Response = vbRetry

End With

End Sub

Link al commento
Condividi su altri siti

  • 10 months later...

se era uno solo... thank (senza "s") basta già, ma gli inglesi usano più di uno (thanks), senza porre limiti al loro numero :D (si usa anche "thanks a lot") :P

Link al commento
Condividi su altri siti

  • 1 year later...

Riprendo questa discussione perchè anch'io sto facendo letteralmente a pugni con il metodo Find, anche se per motivi diversi da quelli di gabri. :(

Il mio codice:

Private Sub cbtStartProcess_Click()

Dim i1 As Integer

Dim i2 As Integer

Dim i3 As Integer

Dim i4 As Integer

Dim i5 As Integer

Dim i6 As Integer

Dim i7 As Integer

Dim s1 As String

Dim s2 As String

i2 = Me.cbxColumnDataToFind.ListIndex + 1

i3 = Me.cbxColumnToLookIn.ListIndex + 1

i5 = Me.cbxColumnSource.ListIndex + 1

i6 = Me.cbxColumnDestination.ListIndex + 1

i7 = 0

On Error Resume Next

For i1 = 2 To rngDataDestination.Rows.Count

s1 = rngDataDestination.Cells(i1, i2).Value

Err.Clear

'Workbooks(Me.cbxWBSource.Value).Sheets(Me.cbxSheetSource.Value) 'xlWhole

i4 = Workbooks(Me.cbxWBSource.Value).Sheets(Me.cbxSheetSource.Value).Columns(i3) _

.Find(What:=s1, After:=ActiveCell, LookIn:=xlFormulas, _

LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _

MatchCase:=False).Row '.Activate

If Err Then

If Me.optEmptyDestination Then rngDataDestination.Cells(i1, i6).Value = ""

If Me.optMarkDestination Then

With rngDataDestination.Cells(i1, i6).Interior

.ColorIndex = 3

.Pattern = xlSolid

End With

End If

If Me.optStopAll Then MsgBox ("Errore: trasferimento dati interrotto alla riga " & i1 & Chr$(13) & _

"Sono stati trasferiti " & i7 & " dati."): Exit Sub

Else

'i4 = ActiveCell.Row

s2 = rngDataSource.Cells(i4, i5).Value

rngDataDestination.Cells(i1, i6).Value = s2

i7 = i7 + 1

End If

Next i1

MsgBox "Sono stati trasferiti " & i7 & " dati."

Err.Clear

End Sub

Link al commento
Condividi su altri siti

  • 4 weeks later...

Sono riuscito, o almeno credo, ad "aggirare" il problema di cui al precedente post.

In pratica, anche se non so il perchè, il metodo Find ha bisogno di essere "svegliato" applicandolo in modo "semplice" prima di essere usato in modo più elaborato.

Ho notato, infatti, che dopo aver copiato, incollato ed eseguito su di un modulo il codice di esempio del metodo Find della guida, tutto prende a funzionare alla grande. Quindi, senza perdere altro tempo, non ho fatto altro che richiamare questa routine subito prima dell'esecuzione della mia subroutine.

Chissà cosa penserebbe qualcuno che dovesse vedere il mio programma!!! :ph34r: :(

... comunque, l'importante è che funzioni. B)

Ciao!

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...