Προς το περιεχόμενο

Πρόβλημα διαγραφής τελευταίας καταχώρησης (vba)


ZELDA

Προτεινόμενες αναρτήσεις

Δημοσ. (επεξεργασμένο)

Εχω δημιουργήσει μια  φόρμα καταχώρησης για τους εργαζόμενους για να καταχωρούν καποιες πωλήσεις που χρειάζομαι  , βάζω τις τιμες στα καταλληλα πεδία στο Input , παταω save και οι καταχωρήσεις αποθηκεύονται κανονικά στο φυλλο Data σε 8 διαφορετικά πεδία , μεχρι εδώ μια χαρά ...   Το πρόβλημα που αντιμετωπίσω είναι το εξής:  Aν στο input βαλω τιμές στα πεδία 2-3-4-5-6-7-8 τότε η φόρμα λειτουργεί κανονικά  εννοώ οτι δουλευει το κουμπι διαγραφής τελευταίας καταχώρησης.  Εαν τώρα βάλω τιμή και στο πεδίο 1 τότε δεν δουλευει ..

module 1

Sub Store_Data()
    ' TeachExcel.com
    ' Takes data from one worksheet and stores it in the next empty row on another worksheet.

    Dim sourceSheet As Worksheet
    Dim dataSheet As Worksheet
    Dim nextRow As Long

    ' Make some sheet variables so we can use those instead of hard-coding sheet references in the code.
    Set sourceSheet = Sheets("Input")
    Set dataSheet = Sheets("Data")

    ' Get the next empty row from the Data sheet.
    nextRow = dataSheet.Range("A" & dataSheet.Rows.Count).End(xlUp).Offset(1).Row

    ' Input the form values into the Data sheet.
    dataSheet.Cells(nextRow, 1).Value = sourceSheet.Range("j4").Value
    dataSheet.Cells(nextRow, 2).Value = sourceSheet.Range("j8").Value
    dataSheet.Cells(nextRow, 3).Value = sourceSheet.Range("j12").Value
    dataSheet.Cells(nextRow, 4).Value = sourceSheet.Range("j16").Value
    dataSheet.Cells(nextRow, 5).Value = sourceSheet.Range("j20").Value
    dataSheet.Cells(nextRow, 6).Value = sourceSheet.Range("j24").Value
    dataSheet.Cells(nextRow, 7).Value = sourceSheet.Range("j28").Value
    dataSheet.Cells(nextRow, 8).Value = sourceSheet.Range("j32").Value

    ' Clear Data
    sourceSheet.Range("j4").Value = ""
    sourceSheet.Range("j8").Value = ""
    sourceSheet.Range("j12").Value = ""
    sourceSheet.Range("j16").Value = ""
    sourceSheet.Range("j20").Value = ""
    sourceSheet.Range("j24").Value = ""
    sourceSheet.Range("j28").Value = ""
    sourceSheet.Range("j32").Value = ""
End Sub

  module 2 για την διαγραφή τελευταιας καταχώρησης

Sub DeleteLast8Rows()
    Dim ws As Worksheet
    Dim lastRow As Long
    
    ' Ορίζουμε το φύλλο εργασίας (Worksheet)
    Set ws = ThisWorkbook.Sheets("Data") ' Αντικαταστήστε το "Data" με το όνομα του φύλλου εργασίας
    
    ' Βρίσκουμε την τελευταία γραμμή με δεδομένα
    lastRow = ws.Cells(ws.Rows.Count, "2").End(xlUp).Row
    
    ' Ελέγχουμε αν υπάρχουν τουλάχιστον 8 γραμμές
    If lastRow >= 8 Then
        ' Διαγράφουμε τις τελευταίες 8 γραμμές
        ws.Rows(lastRow - 7 & ":" & lastRow).Delete
    Else
        ' Αν δεν υπάρχουν τουλάχιστον 8 γραμμές, διαγράφουμε όλες
        ws.Rows("1:" & lastRow).Delete
    End If
End Sub

παραθέτω και το αρχείο για οποιον θελει να βοηθήσει .

Φορμα καταχώρησης ins.xlsm

Επεξ/σία από ZELDA
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)

Μπορείς να μου εξηγήσεις πως γίνεται, ενώ έχω διαγράψει από το module της διαγραφής τα πάντα εκτός τις dim και τις set γραμμές, έχω σώσει το αρχείο, το έκλεισα, το ξανάνοιξα και συνεχίζει να διαγράφει κανονικά όπως και πριν;

Κανονικά δεν θα έπρεπε να κάνει τίποτα.

spacer.png

Ξανακατέβασα το αρχείο από την αρχή και όπως ήταν το ξεκλείδωσα και έκανα εκ νέου αντιστοίχηση μακροεντολής στο κουμπί και τώρα βγάζει σφάλμα στην lastRow

spacer.png

Και κάτι τελευταίο.

Αν η τελευταία γραμμή δεν έχει νούμερο στο 1ο κελί, η save δεν αναγνωρίζει την γραμμή και την διαγράφει με τα νέα δεδομένα.

Επεξ/σία από micos000
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)

lastRow = ws.Cells(ws.Rows.Count,2).End(xlUp).Row

Δεν δέχεται string η Cells.

edit: Επιπλέον για να δεις που τελειώνουν τα δεδομενα στο Data Sheet, σε περίπτωση που έχουν παραλειφθεί για κάποιες στήλες καλύτερο είναι το παρακάτω:

lastRow = ws.usedrange.rows.count

Εκτός αυτού ο κώδικάς σου, βάσει της ίδιας της περιγραφής, διαγράφει όχι την τελευταία καταχώρηση(γραμμή με 8 στήλες) αλλά τις τελευταίες 8 καταχωρήσεις(8 τελευταίες γραμμές), αν βρει ότι είναι 8 ή παραπάνω(διαφορετικά όλες, μαζί με κεφαλίδες). Αυτό θέλεις;

Επεξ/σία από pirmen56
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)
1 ώρα πριν, pirmen56 είπε

lastRow = ws.Cells(ws.Rows.Count,2).End(xlUp).Row

Δεν δέχεται string η Cells.

edit: Επιπλέον για να δεις που τελειώνουν τα δεδομενα στο Data Sheet, σε περίπτωση που έχουν παραλειφθεί για κάποιες στήλες καλύτερο είναι το παρακάτω:

lastRow = ws.usedrange.rows.count

Εκτός αυτού ο κώδικάς σου, βάσει της ίδιας της περιγραφής, διαγράφει όχι την τελευταία καταχώρηση(γραμμή με 8 στήλες) αλλά τις τελευταίες 8 καταχωρήσεις(8 τελευταίες γραμμές), αν βρει ότι είναι 8 ή παραπάνω(μαζί με κεφαλίδες). Αυτό θέλεις;

Καθε μερα θα βαζει καποιος χρήστης τιμες σε αυτα τα πεδία τα οποία ειναι 8, αν για καποιο λόγο κάνει καποιο λαθος στην καταχώρηση θέλω να σβήσει μονο τα πεδία εκείνης της μέρας και οχι τα 8 τελευταία , εδώ ναι εχουμε πρόβλημα αλλα δεν φαίνεται να δουλευει με αυτο τον τρόπο εννοω μου σβήνει την τελευταία σειρα ετσι οπως , δηλαδή σταματάει στο πρώτο πεδίο εισαγωγής θέλω δηλαδή ωστε να ξανα ξεκινησει να εισάγει δεδομενα ο χρήστης αποτην αρχή  

Επεξ/σία από ZELDA
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Επίσης είναι και το θέμα με το save που έγραψα πριν, ότι δηλαδή αν στην προηγούμενη εγγραφή δεν υπάρχει αριθμός στο πρώτο πεδίο θα διαγραφεί η τελευταία γραμμή και θα μπουν τα νέα στοιχεία στην θέση τους. Επίσης τα input και clear του save module θα προτιμούσα να γίνουν με κάποια for αντί ένα-ένα

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

9 λεπτά πριν, micos000 είπε

Επίσης είναι και το θέμα με το save που έγραψα πριν, ότι δηλαδή αν στην προηγούμενη εγγραφή δεν υπάρχει αριθμός στο πρώτο πεδίο θα διαγραφεί η τελευταία γραμμή και θα μπουν τα νέα στοιχεία στην θέση τους. Επίσης τα input και clear του save module θα προτιμούσα να γίνουν με κάποια for αντί ένα-ένα

λιγο με την βοηθεια του gpt,  αν και το πρόβλημα με το πρώτο πεδίο δεν μπορώ να το λύσω ..
Sub Store_Data()
    ' TeachExcel.com
    ' Takes data from one worksheet and stores it in the next empty row on another worksheet.

    Dim sourceSheet As Worksheet
    Dim dataSheet As Worksheet
    Dim nextRow As Long
    Dim inputRange As Range
    Dim cellOffset As Integer

    ' Make some sheet variables so we can use those instead of hard-coding sheet references in the code.
    Set sourceSheet = Sheets("Input")
    Set dataSheet = Sheets("Data")

    ' Define the range on the source sheet to loop through
    Set inputRange = sourceSheet.Range("J4, J8, J12, J16, J20, J24, J28, J32")

    ' Get the next empty row from the Data sheet.
    nextRow = dataSheet.Range("A" & dataSheet.Rows.Count).End(xlUp).Offset(1).Row

    ' Input the form values into the Data sheet using a For loop
    For Each cell In inputRange
        cellOffset = (cell.Row - 4) / 4 ' Calculate the offset based on the starting row and step
        dataSheet.Cells(nextRow, cellOffset + 1).Value = cell.Value
    Next cell

    ' Clear Data using a For loop
    For Each cell In inputRange
        cell.Value = ""
    Next cell
End Sub
 
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)

Εντάξει  με το range, αλλά πάλι διαγράφει την τελευταία γραμμή αν δεν έχει νούμερο στο 1ο πεδίο.

Ακόμα και χωρίς να βάλεις νούμερα στα πεδία, αν πατήσεις save και η προηγούμενη γραμμή δεν έχει αριθμό στην 1η στήλη θα την διαγράψει τελείως.

Νομίζω ότι θα ήταν καλύτερα να το γυρίσεις σε db.

Επεξ/σία από micos000
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)

Δες αυτό που αντικαθιστά το δεύτερο module για να καταλάβω αν είναι αυτό που ζητάς. Διαγράφει την τελευταία εγγραφή μόνο αν δεν είναι πλήρης(με όλα τα πεδία γεμάτα). Καλό θα ήταν σε όλα τα άλλα κελιά του Data να βάλεις Validation Rule ή κλείδωμα να μένουν κενά για να μην έχεις κατα λάθος καταχωρήσεις εκτός πίνακα.

Sub DeleteLast8Rows()

Dim ws As Worksheet
Dim lastRow As Long
Dim NEfields As Long

Set ws = ThisWorkbook.Sheets("Data")

lastRow = ws.UsedRange.Rows.Count
NEfields = Application.WorksheetFunction.Count(Rows(lastRow))

If NEfields < 8 Then ws.Rows(lastRow).Delete

End Sub

edit:

Καθάρισα το απο πάνω από "σκουπιδάκια" που είχε αφήσει το text του chatGPT και τα διάβαζε η VBA ως variables.

Άλλαξα και τον τίτλο της sub, σε περίπτωση που δεν γνωρίζεις αντιστοίχιση κουμπιών σε μάκρο.

57 λεπτά πριν, micos000 είπε

Εντάξει  με το range, αλλά πάλι διαγράφει την τελευταία γραμμή αν δεν έχει νούμερο στο 1ο πεδίο.

Ακόμα και χωρίς να βάλεις νούμερα στα πεδία, αν πατήσεις save και η προηγούμενη γραμμή δεν έχει αριθμό στην 1η στήλη θα την διαγράψει τελείως.

Νομίζω ότι θα ήταν καλύτερα να το γυρίσεις σε db.

Κανονικά δουλεύει στο τελευταίο που καθάρισα και απλοποίησα(η COUNT() έχει τις ιδιορρυθμίες της αλλά όχι με σκέτα rows() απ'ότι είδα). Ο κώδικας με ό,τι είχε "καταλάβει" το GPT δούλεψε κανονικά και σωστά βάσει των σχολίων αλλά έκανε μάλλον άκυρα πράγματα.

Δεν χρειάζεται db για κάτι τόσο απλό. Σημασία όμως έχει να μπορεί να περιγράψει και ο OP ακριβώς αυτό που θέλει.

Επεξ/σία από pirmen56
  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

1 ώρα πριν, pirmen56 είπε

Σημασία όμως έχει να μπορεί να περιγράψει και ο OP ακριβώς αυτό που θέλει.

Εγώ πάντως ακόμα δεν κατάλαβα ακριβώς το concept αλλά δεν πειράζει, το θέμα είναι να δουλέψει ο κώδικας σωστά για αρχή.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Μόλις τώρα, micos000 είπε

Εγώ πάντως ακόμα δεν κατάλαβα ακριβώς το concept αλλά δεν πειράζει, το θέμα είναι να δουλέψει ο κώδικας σωστά για αρχή.

Τώρα μου 'ρθε φλασιά ότι απλά μπορεί να θέλει έναν απλό καθαρισμό φόρμας που είναι το παρακάτω:

Sub DeleteLast8Rows()

With Sheets("Input")
    .Range("j4").Value = ""
    .Range("j8").Value = ""
    .Range("j12").Value = ""
    .Range("j16").Value = ""
    .Range("j20").Value = ""
    .Range("j24").Value = ""
    .Range("j28").Value = ""
    .Range("j32").Value = ""
    .Range("j4").Select
End With

End Sub

 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Έκανα ένα πολύ απλό προγραμματάκι για καταχώρηση δεδομένων στο longtion application builder. Θέλει το αρχείο mdb να είναι στον ίδιο φάκελο με το exe

https://drive.google.com/file/d/16irINNp6HsHXyAL8nKysxemHvbtaiD8F/view?usp=sharing

 

 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)

Καλημέρα και Καλή χρονιά με υγεία,

Όπως αναφέρθηκε, η λογική του αρχείου είναι πάρα πολύ απλή για να υπάρχει φόρμα καταχώρησης δεδομένων. Και ειδικά σε άλλο φύλλο που δυσκολεύει ακόμα περισσότερο την καταχώρηση. Η συγκεκριμένη φόρμα θα μπορούσε να ήταν και η πρώτη γραμμή στο φύλλο Data, ώστε να γραφτεί εκεί αντίστοιχος κώδικας και να υπάρχει και απευθείας οπτική επαφή με τα δεδομένα που καταχωρούνται.

Επειδή αρκετός κόσμος προτιμάει να καταχωρεί δεδομένα μέσω αντίστοιχων φορμών για περισσότερη ασφάλεια, προτείνω μια ιδέα με λιγότερο κώδικα. Φυσικά θα μπορούσε να αποφευχθεί ακόμα και αυτός ο κώδικας βάζοντάς τη ως κουμπί στη γρήγορη μπάρα πρόσβασης.

Το Excel ενσωματώνει μια "μυστική" βοηθητική φόρμα καταχώρησης δεδομένων (δεν είναι τόσο ευρέως γνωστή), η οποία προσαρμόζεται αυτόματα σε περιοχές δεδομένων. Ο χρήσης μπορεί να εξοικιωθεί πολύ γρήγορα με αυτή τη φόρμα καταχώρησης. Περιέχει κουμπί Νέας εγγραφής, διαγραφής, μετάβαση σε επόμενη-προηγούμενη εγγραφή, ακόμα και αναζήτηση με κριτήρια για κάθε πεδίο.

Για να αποφύγουμε τον παραπάνω κώδικα, η φόρμα αυτή μπορεί να μπει και ως κουμπί στη μπάρα με τα υπόλοιπα κουμπιά γρήγορης πρόσβασης ως εξής:

More commands... > All Commands > Form...

 

Υ.Γ. @pirmen56 Μια επίσης πρόταση καθαρισμού φόρμας: Sheets("Input").[J4,J8,J12,J16,J20,J24,J28,J32].ClearContents

ΠΩΛΗΣΕΙΣ.xlsm

Επεξ/σία από ChrisGT7
  • Like 1
  • Thanks 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

4 ώρες πριν, ChrisGT7 είπε

Το Excel ενσωματώνει μια "μυστική" βοηθητική φόρμα καταχώρησης δεδομένων (δεν είναι τόσο ευρέως γνωστή), η οποία προσαρμόζεται αυτόματα σε περιοχές δεδομένων. Ο χρήσης μπορεί να εξοικιωθεί πολύ γρήγορα με αυτή τη φόρμα καταχώρησης. Περιέχει κουμπί Νέας εγγραφής, διαγραφής, μετάβαση σε επόμενη-προηγούμενη εγγραφή, ακόμα και αναζήτηση με κριτήρια για κάθε πεδίο.

Για να αποφύγουμε τον παραπάνω κώδικα, η φόρμα αυτή μπορεί να μπει και ως κουμπί στη μπάρα με τα υπόλοιπα κουμπιά γρήγορης πρόσβασης ως εξής:

More commands... > All Commands > Form...

Πολύ καλό και χρήσιμο.

Nice.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...