ZELDA Δημοσ. 5 Ιανουαρίου 2024 Δημοσ. 5 Ιανουαρίου 2024 (επεξεργασμένο) Εχω δημιουργήσει μια φόρμα καταχώρησης για τους εργαζόμενους για να καταχωρούν καποιες πωλήσεις που χρειάζομαι , βάζω τις τιμες στα καταλληλα πεδία στο 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 Επεξ/σία 5 Ιανουαρίου 2024 από ZELDA
micos000 Δημοσ. 6 Ιανουαρίου 2024 Δημοσ. 6 Ιανουαρίου 2024 (επεξεργασμένο) Μπορείς να μου εξηγήσεις πως γίνεται, ενώ έχω διαγράψει από το module της διαγραφής τα πάντα εκτός τις dim και τις set γραμμές, έχω σώσει το αρχείο, το έκλεισα, το ξανάνοιξα και συνεχίζει να διαγράφει κανονικά όπως και πριν; Κανονικά δεν θα έπρεπε να κάνει τίποτα. Ξανακατέβασα το αρχείο από την αρχή και όπως ήταν το ξεκλείδωσα και έκανα εκ νέου αντιστοίχηση μακροεντολής στο κουμπί και τώρα βγάζει σφάλμα στην lastRow Και κάτι τελευταίο. Αν η τελευταία γραμμή δεν έχει νούμερο στο 1ο κελί, η save δεν αναγνωρίζει την γραμμή και την διαγράφει με τα νέα δεδομένα. Επεξ/σία 6 Ιανουαρίου 2024 από micos000
ZELDA Δημοσ. 6 Ιανουαρίου 2024 Μέλος Δημοσ. 6 Ιανουαρίου 2024 Δεν μπορώ να το εξηγήσω, βλέπεις κάτι λάθος γενικα?
micos000 Δημοσ. 6 Ιανουαρίου 2024 Δημοσ. 6 Ιανουαρίου 2024 Δεν το έχω και τόσο με την vba, απλά παρατήρησα αυτά που έγραψα. Αν γκουγκλαρεις find last row excel vba ή delete last row vba εχει καποια δείγματα κώδικα.
pirmen56 Δημοσ. 6 Ιανουαρίου 2024 Δημοσ. 6 Ιανουαρίου 2024 (επεξεργασμένο) lastRow = ws.Cells(ws.Rows.Count,2).End(xlUp).Row Δεν δέχεται string η Cells. edit: Επιπλέον για να δεις που τελειώνουν τα δεδομενα στο Data Sheet, σε περίπτωση που έχουν παραλειφθεί για κάποιες στήλες καλύτερο είναι το παρακάτω: lastRow = ws.usedrange.rows.count Εκτός αυτού ο κώδικάς σου, βάσει της ίδιας της περιγραφής, διαγράφει όχι την τελευταία καταχώρηση(γραμμή με 8 στήλες) αλλά τις τελευταίες 8 καταχωρήσεις(8 τελευταίες γραμμές), αν βρει ότι είναι 8 ή παραπάνω(διαφορετικά όλες, μαζί με κεφαλίδες). Αυτό θέλεις; Επεξ/σία 6 Ιανουαρίου 2024 από pirmen56
ZELDA Δημοσ. 6 Ιανουαρίου 2024 Μέλος Δημοσ. 6 Ιανουαρίου 2024 (επεξεργασμένο) 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 τελευταία , εδώ ναι εχουμε πρόβλημα αλλα δεν φαίνεται να δουλευει με αυτο τον τρόπο εννοω μου σβήνει την τελευταία σειρα ετσι οπως , δηλαδή σταματάει στο πρώτο πεδίο εισαγωγής θέλω δηλαδή ωστε να ξανα ξεκινησει να εισάγει δεδομενα ο χρήστης αποτην αρχή Επεξ/σία 6 Ιανουαρίου 2024 από ZELDA
micos000 Δημοσ. 6 Ιανουαρίου 2024 Δημοσ. 6 Ιανουαρίου 2024 Επίσης είναι και το θέμα με το save που έγραψα πριν, ότι δηλαδή αν στην προηγούμενη εγγραφή δεν υπάρχει αριθμός στο πρώτο πεδίο θα διαγραφεί η τελευταία γραμμή και θα μπουν τα νέα στοιχεία στην θέση τους. Επίσης τα input και clear του save module θα προτιμούσα να γίνουν με κάποια for αντί ένα-ένα
ZELDA Δημοσ. 6 Ιανουαρίου 2024 Μέλος Δημοσ. 6 Ιανουαρίου 2024 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
micos000 Δημοσ. 6 Ιανουαρίου 2024 Δημοσ. 6 Ιανουαρίου 2024 (επεξεργασμένο) Εντάξει με το range, αλλά πάλι διαγράφει την τελευταία γραμμή αν δεν έχει νούμερο στο 1ο πεδίο. Ακόμα και χωρίς να βάλεις νούμερα στα πεδία, αν πατήσεις save και η προηγούμενη γραμμή δεν έχει αριθμό στην 1η στήλη θα την διαγράψει τελείως. Νομίζω ότι θα ήταν καλύτερα να το γυρίσεις σε db. Επεξ/σία 6 Ιανουαρίου 2024 από micos000
pirmen56 Δημοσ. 6 Ιανουαρίου 2024 Δημοσ. 6 Ιανουαρίου 2024 (επεξεργασμένο) Δες αυτό που αντικαθιστά το δεύτερο 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 ακριβώς αυτό που θέλει. Επεξ/σία 6 Ιανουαρίου 2024 από pirmen56 1
micos000 Δημοσ. 6 Ιανουαρίου 2024 Δημοσ. 6 Ιανουαρίου 2024 1 ώρα πριν, pirmen56 είπε Σημασία όμως έχει να μπορεί να περιγράψει και ο OP ακριβώς αυτό που θέλει. Εγώ πάντως ακόμα δεν κατάλαβα ακριβώς το concept αλλά δεν πειράζει, το θέμα είναι να δουλέψει ο κώδικας σωστά για αρχή.
pirmen56 Δημοσ. 6 Ιανουαρίου 2024 Δημοσ. 6 Ιανουαρίου 2024 Μόλις τώρα, 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
micos000 Δημοσ. 6 Ιανουαρίου 2024 Δημοσ. 6 Ιανουαρίου 2024 Έκανα ένα πολύ απλό προγραμματάκι για καταχώρηση δεδομένων στο longtion application builder. Θέλει το αρχείο mdb να είναι στον ίδιο φάκελο με το exe https://drive.google.com/file/d/16irINNp6HsHXyAL8nKysxemHvbtaiD8F/view?usp=sharing
ChrisGT7 Δημοσ. 7 Ιανουαρίου 2024 Δημοσ. 7 Ιανουαρίου 2024 (επεξεργασμένο) Καλημέρα και Καλή χρονιά με υγεία, Όπως αναφέρθηκε, η λογική του αρχείου είναι πάρα πολύ απλή για να υπάρχει φόρμα καταχώρησης δεδομένων. Και ειδικά σε άλλο φύλλο που δυσκολεύει ακόμα περισσότερο την καταχώρηση. Η συγκεκριμένη φόρμα θα μπορούσε να ήταν και η πρώτη γραμμή στο φύλλο Data, ώστε να γραφτεί εκεί αντίστοιχος κώδικας και να υπάρχει και απευθείας οπτική επαφή με τα δεδομένα που καταχωρούνται. Επειδή αρκετός κόσμος προτιμάει να καταχωρεί δεδομένα μέσω αντίστοιχων φορμών για περισσότερη ασφάλεια, προτείνω μια ιδέα με λιγότερο κώδικα. Φυσικά θα μπορούσε να αποφευχθεί ακόμα και αυτός ο κώδικας βάζοντάς τη ως κουμπί στη γρήγορη μπάρα πρόσβασης. Το Excel ενσωματώνει μια "μυστική" βοηθητική φόρμα καταχώρησης δεδομένων (δεν είναι τόσο ευρέως γνωστή), η οποία προσαρμόζεται αυτόματα σε περιοχές δεδομένων. Ο χρήσης μπορεί να εξοικιωθεί πολύ γρήγορα με αυτή τη φόρμα καταχώρησης. Περιέχει κουμπί Νέας εγγραφής, διαγραφής, μετάβαση σε επόμενη-προηγούμενη εγγραφή, ακόμα και αναζήτηση με κριτήρια για κάθε πεδίο. Για να αποφύγουμε τον παραπάνω κώδικα, η φόρμα αυτή μπορεί να μπει και ως κουμπί στη μπάρα με τα υπόλοιπα κουμπιά γρήγορης πρόσβασης ως εξής: More commands... > All Commands > Form... Υ.Γ. @pirmen56 Μια επίσης πρόταση καθαρισμού φόρμας: Sheets("Input").[J4,J8,J12,J16,J20,J24,J28,J32].ClearContents ΠΩΛΗΣΕΙΣ.xlsm Επεξ/σία 7 Ιανουαρίου 2024 από ChrisGT7 1 1
micos000 Δημοσ. 7 Ιανουαρίου 2024 Δημοσ. 7 Ιανουαρίου 2024 4 ώρες πριν, ChrisGT7 είπε Το Excel ενσωματώνει μια "μυστική" βοηθητική φόρμα καταχώρησης δεδομένων (δεν είναι τόσο ευρέως γνωστή), η οποία προσαρμόζεται αυτόματα σε περιοχές δεδομένων. Ο χρήσης μπορεί να εξοικιωθεί πολύ γρήγορα με αυτή τη φόρμα καταχώρησης. Περιέχει κουμπί Νέας εγγραφής, διαγραφής, μετάβαση σε επόμενη-προηγούμενη εγγραφή, ακόμα και αναζήτηση με κριτήρια για κάθε πεδίο. Για να αποφύγουμε τον παραπάνω κώδικα, η φόρμα αυτή μπορεί να μπει και ως κουμπί στη μπάρα με τα υπόλοιπα κουμπιά γρήγορης πρόσβασης ως εξής: More commands... > All Commands > Form... Πολύ καλό και χρήσιμο. Nice.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα