Μετάβαση στο περιεχόμενο
Ακολουθήστε τη νέα μας σελίδα στο Facebook! ×

Μακροεντολή προσθήκης σειρών σε ασυνέχειες δεδομένων στο Excel


giannis89

Recommended Posts

Κατ' αρχάς, ευχαριστώ swordfish για το χρόνο σου,

 

Δυστυχώς, ίσως δεν το είχα εξηγήσει κι εγώ σαφώς από την αρχή, δεν ήταν αυτό το πρόβλημά μου. Δηλαδή, δε με ενδιαφέρει τα μηδενικά να γίνουν ενδιάμεσες τιμές. Με ενδιαφέρει να προστεθούν γραμμές στην ασυνέχεια του χρόνου (1η στήλη) κι ας προκύψουν κενά δεδομένα στις υπόλοιπες στήλες (αυτά θα τα προσθέσω αργότερα). Το εξηγώ καλύτερα και με παράδειγμα στο προτελευταίο μου μήνυμα. Επίσης, δεν καλύπτεται η προϋπόθεση στο πρόγραμμα σου να είναι μηδέν τα δεδομένα της δεύτερης στήλης στις ασυνέχειες. Στο δείγμα που ανέβασα, έτυχε να υπάρχουν μηδενικά επειδή η ασυνέχεια χρόνου έπεσε βράδυ και το ρεύμα του φωτοβολταϊκού ήταν μηδέν. Σε άλλα σημεία υπάρχουν ασυνέχειες κατά τη διάρκεια της ημέρας (από σφάλμα καταγραφέα) χωρίς οι τιμές της δεύτερης στήλης να μηδενίζονται (βλ. παράδειγμα στο προηγούμενο μήνυμα).

 

Και πάλι ευχαριστώ για κάθε προσπάθεια, ξέρω ότι δε ζητάω και το πιο απλό πράγμα...

Link to comment
Share on other sites

Είναι πιο απλό αν δεν θες να επεξεργαστείς τις ήδη υπάρχουσες γραμμές. Δες στο συμπιεσμένο τα:

addlines_fromprev.php (προσθέτει με βάση την προηγούμενη γραμμη της συνέχειας τις τιμές)

addedlines_withzeros.php (προσθέτει την γραμμή με την ένδειξη ημερομηνίας αλλά με μηδενικές τιμές)

 

τα οποία δημιουργούν 2 αρχεία:

addedlines_fromprev.csv

addedlines_withzeros.csv

 

Στο xls που έχεις ανεβάσει μετά την 14η γραμμή υπήρξαν 574 ασυνέχειες. (έχεις χάσει δηλαδή 574λεπτά)

Για να κάνω τις μετατροπές πιο εύκολα με το unixtimestamp στο αρχικό xls και πριν εξάγω σε csv αυτή τη φορά μετέτρεψα την μορφή ημερομηνίας σε: Μήνα/Ημέρα/Χρόνο Ώρα:λεπτά

(στο excel μορφοποίηση ->ημερομηνία -> τύπος: μ/η/εεεε ω:λλ)

 

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

asynexeia1.rar

Edited by Sw0rdf1sh
  • Upvote 1
Link to comment
Share on other sites

Λοιπόν, έγραψα λίγο κώδικα στα γρήγορα.

Ο παρακάτω κώδικας, βρίσκει την τελευταία τιμή της στήλης Α και στην συνέχεια ανεβαίνει προς τα πάνω. Αν βρει ασυνέχεια στον χρόνο, εισάγει κενές γραμμές και το χρονικό διάστημα.

 

Αν θες, δες και το επισυναπτόμενο αρχείο.

Στις κίτρινες γραμμές υπάρχει ασυνέχεια. Αν πατήσεις το κουμπί run οι ασυνέχειες εξαφανίζονται...

 

>Sub TimeDiscontinuity()

Dim LastRow As Long
Dim i As Long
Dim insRows As Long
Dim j As Long

'Inserts missing time values, starting from the last row in column A.

Application.ScreenUpdating = False

With ActiveSheet
 LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row
End With

For i = LastRow To 3 Step -1

 If Cells(i, 1).Value - Cells(i - 1, 1).Value > 6.94444446708076E-04 Then

 insRows = ((Cells(i, 1).Value - Cells(i - 1, 1).Value) / 6.94444446708076E-04) - 1
 '6.94444446708076E-04 = (1 / (24 * 60))

 ActiveSheet.Rows(i & ":" & i + insRows - 1).Insert

	 For j = i To i + insRows - 1
		 Cells(j, 1) = Cells(j - 1, 1) + 6.94444446708076E-04
	 Next j
	
 End If
Next i

MsgBox "The missing time values were inserted!", vbInformation, "Done"

Application.ScreenUpdating = True

End Sub

Time Discontinuity.zip

  • Upvote 2
Link to comment
Share on other sites

Καλησπέρα .

 

Τα ζητούμενα :

 

 

Ουσιαστικά , για να εισαχθεί μια νέα γραμμή (που δεν θα είναι μία) θα πρέπει να υπάρχουν ισάριθμες κενές γραμμές στο φύλλο εργασίας .

 

Αν το πλήθος των γραμμών του αρχείου υπερβαίνει τις 1.048.576 , δεν πρόκειται να γίνει δουλειά στο Excel 2007 γιατί αυτό είναι και το όριο γραμμών που υποστηρίζει . Συζητάμε λοιπόν ότι η μακροεντολή ίσως να πρέπει να "τρέξει" στο Excel 2010 το οποίο πρακτικά δεν έχει όριο στο πλήθος των γραμμών .

 

Θα το δω αναλυτικότερα και αν έχω κάποιο θετικό αποτέλεσμα θα επανέλθω.

 

Γιώργο δεν ισχύει αυτό... Το Excel 2010 έχει τον ίδιο αριθμό γραμμών με το Excel 2007.

Δες και εδώ: http://office-watch....t/n.aspx?a=1408

 

Εσύ όμως ξέρω ότι χρησιμοποιείς το 2003.... :wink:

Link to comment
Share on other sites

Το θέμα είναι η εύρεση της συνάρτησης όπως σωστά εντοπίζεις και όχι η αναβάθμιση του Excel σε έκδοση 2013 όπου δεν θα μπορέσω να δοκιμάσω την μακροεντολή πριν στη στείλω .

 

Εσύ όμως ξέρω ότι χρησιμοποιείς το 2003.... :wink:

 

A! Γι' αυτό δεν του άρεσε που εγκατέστησα το 2013, είναι 10 χρόνια πίσω... :P

 

Είναι πιο απλό αν δεν θες να επεξεργαστείς τις ήδη υπάρχουσες γραμμές. Δες στο συμπιεσμένο τα:

addlines_fromprev.php (προσθέτει με βάση την προηγούμενη γραμμη της συνέχειας τις τιμές)

addedlines_withzeros.php (προσθέτει την γραμμή με την ένδειξη ημερομηνίας αλλά με μηδενικές τιμές)

 

τα οποία δημιουργούν 2 αρχεία:

addedlines_fromprev.csv

addedlines_withzeros.csv

 

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

Επίσης, δεν μου είπες με ποιο πρόγραμμα τρέχεις τον αλγόριθμο που έγραψες. Άνοιξα απλά το αρχείο με notepad και είδα τον κώδικα. Δεν ξέρω όμως πού θα μπορούσα να τον εκτελέσω αν του κάνω κάποιες τροποποιήσεις. Σε ευχαριστώ και πάλι για το χρόνο σου!! :)

 

>Sub TimeDiscontinuity()

Dim LastRow As Long
Dim i As Long
Dim insRows As Long
Dim j As Long

'Inserts missing time values, starting from the last row in column A.

Application.ScreenUpdating = False

With ActiveSheet
 LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row
End With

For i = LastRow To 3 Step -1

 If Cells(i, 1).Value - Cells(i - 1, 1).Value > 6.94444446708076E-04 Then

 insRows = ((Cells(i, 1).Value - Cells(i - 1, 1).Value) / 6.94444446708076E-04) - 1
 '6.94444446708076E-04 = (1 / (24 * 60))

 ActiveSheet.Rows(i & ":" & i + insRows - 1).Insert

	 For j = i To i + insRows - 1
		 Cells(j, 1) = Cells(j - 1, 1) + 6.94444446708076E-04
	 Next j
	
 End If
Next i

MsgBox "The missing time values were inserted!", vbInformation, "Done"

Application.ScreenUpdating = True

End Sub

 

Αυτό έψαχνα!! Ευχαριστώ πολύ Samdreamth! Με βοήθησες πολύ με αυτό!

 

Τη δοκίμασα στο δείγμα μου και δουλεύει. Φτάνει μόνο να μην κρασάρει το Excel με όλα τα δεδομένα, γιατί θα πρέπει να το σπάσω σε μικρότερα αρχεία...

Link to comment
Share on other sites

Στο addlines_withzeros.php στη γραμμή 40 αντι για μηδέν βάζεις ένα κενό ή σβήνεις το 0 και αφήνεις μόνο το ;

>${"nextline".$z} .= ";0"; //Εδώ προστίθεται η τιμή 0 σε κάθε στήλη

 

Link to comment
Share on other sites

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

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

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

Κάντε μια δωρεάν εγγραφή στην κοινότητά μας. Είναι εύκολο!

Εγγραφή νέου λογαριασμού

Σύνδεση

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

Συνδεθείτε τώρα
×
×
  • Create New...

Σημαντικό

Χρησιμοποιούμε cookies για να βελτιώνουμε το περιεχόμενο του website μας. Μπορείτε να τροποποιήσετε τις ρυθμίσεις των cookie, ή να δώσετε τη συγκατάθεσή σας για την χρήση τους.