trovare prima riga vuota

Anonimo
2017-08-03T11:08:57+00:00

buongiorno

foglio di lavoro dal nome database

inserisco nuovo record in riga due

poi ordino per colonna f prodotto e per data colonna g

il prodotto raggiunge la sua posizione ordinata 

il passo successivo della macro individuo la prima riga vuota e incremento il suo progressivo prendendo il valore precedente.

  RigaPrec = Range("B1").End(xlDown).Row

  Nriga = RigaPrec + 1

  RigaSucc = Nriga + 1

  progr = Range("B" & RigaSucc).Value + 1

   Range("B" & Nriga).Value = progr

se quando ordino pero l'articolo che sto inserendo mi capita sulla riga due quindi all'inizio del mio elenco 

il comando RigaPrec = Range("B1").End(xlDown).Row fallisce.... perche? non è in grado di restituirmi 2?

come risolvo?

Microsoft 365 e Office | Excel | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2017-08-03T19:17:45+00:00

Ciao Mauro,

Se a questo file di partenza carico un altro xavier dovra andare in riga due con progressivo 2

e se successivamente carico angela dovra andare in riga 5 con progressivo 2

Nella cella B2, immetti la formula

=CONTA.SE(Prodotti; F2)

Sostituisci il tuo codice con la seguente versione:

'=========>>

Option Explicit

Option Compare Text

'--------->>

Public Sub Tester()

    Dim WB As Workbook

    Dim SH As Worksheet

    Dim Rng As Range

    Dim Prodotto As String

    Const sFoglio As String = "Foglio1"                   '<<=== Modifica

    Const sTabella As String = "Prodotti"                 '<<=== Modifica

    Prodotto = CStr(InputBox("Inserire il Nome del prodotto da quotare.", "1"))

    If Prodotto = vbNullString Then

        Call MsgBox( _

             Prompt:="Non hai inserito un prodotto!", _

             Buttons:=vbCritical, _

             Title:="CODICE TERMINATO!")

        Exit Sub

    End If

    Set WB = ThisWorkbook

    Set SH = WB.Sheets(sFoglio)

    Set Rng = SH.Range(sTabella).CurrentRegion

    With Rng

        With .Rows(2)

            .Copy

            .Insert Shift:=xlDown

        End With

        .Range("C2").Value = Date

        .Range("F2") = Prodotto

        .CurrentRegion.Sort _

                Key1:=.Range("F1"), _

                Order1:=xlDescending, _

                Key2:=.Range("C1"), _

                Order2:=xlDescending, _

                Header:=xlYes, _

                OrderCustom:=1, _

                MatchCase:=False, _

                Orientation:=xlTopToBottom

                .Columns("F").Resize(.Rows.Count + 1).Name = sTabella

    End With

End Sub

'<<=========

===

Regards,

Norman

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento

12 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2017-08-03T15:02:02+00:00

    Ciao Norman,

    se attivo il bottone a carico AAA dovrebbe prendere come progressivo il 3

    se invece carico norman che non esiste mi dovrebbe andare in riga 2 perche la N viene dopo la N e con il progressivo 1

    visto che e' il primo inserimento.

    ovviamente metterei un if che mi assegna 1 quando il record è la prima volta che lo inserisco ma non riesco a risolvere il problema del numero prima riga vuota quando questa risulta essere la due :(

    sob

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2017-08-03T14:54:57+00:00

    Ciao Mauro,

    Eccomi,

    https://1drv.ms/x/s!Al3w\_B7c9kS6gu805MjnSmyyjGIXNw

    allego il file di esempio ed anche con il tuo suggerimento non ho risolto ...

    ottengo lo stesso problema se inserisco un nome che capita sotto allora tutto procede ma se carico mauro che diventa riga due

    il problema si ripresenta :)

    Adesso sono io ad essere confuso!  

    Sfruttando la tabella del tuo file, se dovessi eseguire il tuo codice due volte, la prima volta immettendo MAURO come prodotto e  AAA la seconda volta, dimmi tu il numero delle righe di destinazione volute per queste due nuove righe.

    ===

    Regards,

    Norman

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2017-08-03T13:42:59+00:00

    Eccomi,

    https://1drv.ms/x/s!Al3w\_B7c9kS6gu805MjnSmyyjGIXNw

    allego il file di esempio ed anche con il tuo suggerimento non ho risolto ...

    ottengo lo stesso problema se inserisco un nome che capita sotto allora tutto procede ma se carico mauro che diventa riga due

    il problema si ripresenta :)

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2017-08-03T13:00:33+00:00

    Ciao Mauro,

    foglio di lavoro dal nome database

    inserisco nuovo record in riga due

    poi ordino per colonna f prodotto e per data colonna g

    il prodotto raggiunge la sua posizione ordinata 

    il passo successivo della macro individuo la prima riga vuota e incremento il suo progressivo prendendo il valore precedente.

      RigaPrec = Range("B1").End(xlDown).Row

      Nriga = RigaPrec + 1

      RigaSucc = Nriga + 1

      progr = Range("B" & RigaSucc).Value + 1

       Range("B" & Nriga).Value = progr

    se quando ordino pero l'articolo che sto inserendo mi capita sulla riga due quindi all'inizio del mio elenco 

    il comando RigaPrec = Range("B1").End(xlDown).Row fallisce.... perche? non è in grado di restituirmi 2?

    come risolvo?

    Penso che tu sia riuscito a confonderti!  :-)

    Analizziamo il tuo codice, riga per riga.

      RigaPrec = Range("B1").End(xlDown).Row

    Come anticipato, questo comando assegna alla variabile RigaPrec il numero della riga dell'ultima cella popolata di colonna B

    Quindi, con la seconda istruzione, ossia

      Nriga = RigaPrec + 1

    tu assegna il numero della riga della prima cella vuota alla variabile Nriga.

    Ne consegue che il terzo comando

      RigaSucc = Nriga + 1

    assega il il numero della riga della seconda cella vuota alla variabile  RigaSucc.

    Quindi, involontariamente, con la prossima istruzione

      progr = Range("B" & RigaSucc).Value + 1

    tu assegna alla variabile progr il valore di una cella vuota, (ovvero zero! ) +1 

    Ne consegue che la tua ultimo comando

       Range("B" & Nriga).Value = progr

    assega il valore 1 alla prima cella vuota della colonna B.

    Se, succesivamente i dati fossero ordinati, e questa nuova riga sarebbe riposizionata come la prima riga di dati, ovvero sulla seconda riga del foglio, immediatmente sotto le intestazioni.

    Forse quello che volevi fare potrebbe essere ottenuto così:

    '=========>>

    Option Explicit

    '--------->>

    Public Sub Tester()

        Dim rCell As Range

        Dim UltimaRiga As Long

        UltimaRiga = Range("B1").End(xlDown).Row

        Set rCell = ActiveSheet.Range("B" & UltimaRiga + 1)

        With rCell

            .Value = .Offset(-1).Value + 1

        End With

    End Sub

    '<<=========

    Se tu dovessi ancora avere un problema, ti chiederei gentilmente di caricare il file problematico, dopo averlo depurato dei dati sensibili, su un servizio di condivisione di file, per esempio Microsoft OneDrive o DropBox, e postare un link al file in una risposta qui.

    Per caricare il file su Microsoft OneDrive, vedi:

    https://support.office.com/it-it/article/Condividere-file-e-cartelle-di-OneDrive-9fcc2f7d-de0c-4cec-93b0-a82024800c07

    Nel caso di DropBox, vedi:

    https://www.dropbox.com/it/help/topics/sharing_files_and_folders

    ===

    Regards,

    Norman

    La risposta è stata utile?

    0 commenti Nessun commento