the_valliant Δημοσ. 18 Μαρτίου 2009 Δημοσ. 18 Μαρτίου 2009 Μήπως μπορεί κάποιος να βοηθήσει, έχω ξεχάσει το βιβλίο μου της VBA στην Αθήνα Έχω ένα αρχείο excel όπου η πρώτη καρτέλα είναι ευρετήριο ονομάτων και οι υπόλοιπες ατομικές καρτέλες μελών. Θέλω στην 1η καρτέλα να βάλω ένα command button το οποίο θα δημιουργεί νέα καρτέλα για εισαγωγή στοιχείων -βασικά κάνοντας Copy μία κενή καρτέλα-πρότυπο (έστω την "Νέο Μέλος") που βρίσκεται στο ίδιο βιβλίο. π.χ. Καρτέλα1: "Ευρετήριο", Καρτέλα2: "Νέο Μέλος", Καρτέλα3: "Μέλος-1", ..., ΚαρτέλαΝ: "Μέλος-Χ" Πατώντας το κουμπί στο "Ευρετήριο" οι καρτέλες γίνονται: Καρτέλα1: "Ευρετήριο", Καρτέλα2: "Νέο Μέλος", Καρτέλα3: "Μέλος-1", ..., ΚαρτέλαΝ: "Μέλος-Χ" Καρτέλα(Ν+1): "Νέο Μέλος(2)" [λόγω της αντιγραφής στο τέλος] Το ιδανικό θα ήταν να μπορεί να κάνει και rename τη καρτέλα, παίρνοντας το όνομα της από τα περιεχόμενα ενός κελιού της καρτέλας "Ευρετήριο". (bonus πόντοι!) ----------------------------------------- OK, κατάφερα να δημιουργώ τη νέα καρτέλα και να της δίνω ένα fix όνομα. Αυτό που θέλω τώρα είναι να 'διαβάζει' το όνομα από τα περιεχόμενα ενός κελιού και να δημιουργεί υπερσύνδεση (hyperlink) στο κελί αυτό προς την καρτέλα. Ο κώδικας που έχω μέχρι τώρα είναι ο εξής: Private Sub CommandButton1_Click() 'Sub NeosPelatis() ' NeosPelatis Μακροεντολή ' Δημιουργία Καρτέλας Νέου Μέλους και Ονομασία ' Sheets("ΝΕΟΣ ΠΕΛΑΤΗΣ").Select Sheets("ΝΕΟΣ ΠΕΛΑΤΗΣ").Copy After:=Sheets(Sheets.Count) 'End Sub 'Μετονομασία Καρτέλας Νέου Μέλους βάση τιμής κελιού ' Sheets("ΝΕΟΣ ΠΕΛΑΤΗΣ (2)").Select Sheets("ΝΕΟΣ ΠΕΛΑΤΗΣ (2)").Name = "Ανώνυμος Νέος Πελάτης" 'Εισαγωγή υπερ-σύνδεσης στην τελευταία σελίδα ' Range("B6").Select ActiveSheet.Hyperlinks.Add Anchor:=Selection, Address:="", SubAddress:= _ "'Ανώνυμος Νέος Πελάτης'!A1", TextToDisplay:="ΡΙΖΟΥ ΟΥΡΑΝΙΑ" End Sub Πως διαβάζω τα περιεχόμενα ενός κελιού; Γιατί μου βγάζει run-time error η Range("B6") ;
MastroGiannis Δημοσ. 18 Μαρτίου 2009 Δημοσ. 18 Μαρτίου 2009 Αντικατέστησε τη διαδικασία του κουμπιού με την παρακάτω: >Private Sub CommandButton1_Click() Dim rngCustomer As Range Dim strName As String Set rngCustomer = Selection strName = rngCustomer.Text If strName <> "" Then Worksheets("ΝΕΟΣ ΠΕΛΑΤΗΣ").Copy After:=Sheets(Sheets.Count) ActiveSheet.Name = strName ActiveSheet.Hyperlinks.Add _ Anchor:=rngCustomer, _ Address:="", _ SubAddress:="'" & strName & "'!A1", _ TextToDisplay:=strName rngCustomer.Parent.Activate End If End Sub Έχοντας επιλεγμένο το κελί με το όνομα του νέου πελάτη στο φύλλο "Ευρετήριο" πάτα το κουμπί και ...έγινε! Δεν χρειάζεται να επιλέγεις τα αντικείμενα του Excel για να τα επεξεργαστείς. Όπως είδες η επιλογή τους μόνο προβλήματα σου δημιουργεί.
the_valliant Δημοσ. 18 Μαρτίου 2009 Μέλος Δημοσ. 18 Μαρτίου 2009 Σ'ευχαριστώ για το χρόνο σου, Μάστορα! Τελικά πέτυχα αυτό που ζητούσα με τον παρακάτω κώδικα: > Private Sub CommandButton1_Click() Sheets("NEOS PELATHS").Copy After:=Sheets(Sheets.Count) Worksheets("EYRETHRIO").Activate Sheets(Sheets.Count).Name = ActiveCell.Value ActiveSheet.Hyperlinks.Add Anchor:=Selection, Address:="", SubAddress:= _ "'" & ActiveCell.Value & "'!A1" myMsg = "Ο ΠΕΛΑΤΗΣ " & ActiveCell.Value & " ΔΗΜΙΟΥΡΓΗΘΗΚΕ ΜΕ ΕΠΙΤΥΧΙΑ!" MsgBox myMsg End Sub Ίσως είναι άκομψο, αλλά είναι γρήγορο και... λειτουργεί! Τώρα προσπαθώ να σπάσω το όνομα του κελιού σε δύο λέξεις (strings) ώστε να τα αποθηκεύσω σε διαφορετικά κελιά (Όνομα και Επώνυμο)... Ε ρε τι κάνω για τους φίλους μου ρεεεεεεεε
MastroGiannis Δημοσ. 19 Μαρτίου 2009 Δημοσ. 19 Μαρτίου 2009 Σ'ευχαριστώ για το χρόνο σου, Μάστορα!Τώρα προσπαθώ να σπάσω το όνομα του κελιού σε δύο λέξεις (strings) ώστε να τα αποθηκεύσω σε διαφορετικά κελιά (Όνομα και Επώνυμο)... Αν στο κελί Β1 έχουμε το ΡΙΖΟΥ ΟΥΡΑΝΙΑ, στο κελί C1 ο τύπος =IF(LEN(B1);IF(ISERROR(FIND(" ";TRIM(B1)));B1;LEFT(B1;FIND(" ";TRIM(B1))-1));"") μας επιστρέφει το ΡΙΖΟΥ και ο τύπος στο κελί D1 =SUBSTITUTE(B1;C1;"") μας επιστρέφει το ΟΥΡΑΝΙΑ. Οι φίλοι είναι για να μας παιδεύουν αλλά τι θα κάναμε χωρίς αυτούς;
the_valliant Δημοσ. 19 Μαρτίου 2009 Μέλος Δημοσ. 19 Μαρτίου 2009 Γουάου! Δοκίμασα αυτό που μου πρότεινες και (φυσικά) λειτουργεί! Τώρα προσπαθώ να το καταλάβω... Εν πάση περιπτώσει, δεν μου κάνει 100% για τον λόγο ότι το κελί που θα 'σπάσει' σε ΕΠΩΝΥΜΟ & ΟΝΟΜΑ το διαβάζει από διαφορετική καρτέλα ("ΕΥΡΕΤΗΡΙΟ") από αυτή που βρίσκονται τα δύο κελιά που θα γραφούν τα ΕΠΩΝΥΜΟ & ΟΝΟΜΑ. Δυστυχώς για άλλη μια φορά κατέφυγα στο να επιλέξω αυτό που ήθελα να ελέγξω, αν και προσπάθησα να αποφύγω να το κάνω! Πως σου φαίνεται το 'τερατούργημά' μου? > newSheetName = Sheets(Sheets.Count).Name lastName = Left(newSheetName, InStr(newSheetName, " ") - 1) firstName = Right(newSheetName, (Len(newSheetName) - InStr(newSheetName, " "))) Worksheets(newSheetName).Activate ActiveSheet.Range("B4").Value = lastName ActiveSheet.Range("C4").Value = firstName Για άλλη μια φορά, σ'ευχαριστώ ΠΟΛΥ για τη βοήθειά σου! ΥΓ. Ξέρεις αν τα macro του Excel 'τρέχουν' σε OpenOffice? Χρησιμοποιεί VBA το OpenOffice?
MastroGiannis Δημοσ. 20 Μαρτίου 2009 Δημοσ. 20 Μαρτίου 2009 Με την VBA απλοποιείται αρκετά το πράγμα λόγω ύπαρξης της ενσωματωμένης συνάρτηση Split. Δηλαδή το 'τερατούργημά' σου θα μπορούσε να γίνει: >With Sheets(Sheets.Count) .Range("B4") = Split(.Name, " ")(0) .Range("C4") = Split(.Name, " ")(1) End With Και πάλι όπως βλέπεις δεν χρειάστηκε να επιλεγεί κάποιο αντικείμενο. Η μέθοδος Select είναι αναγκαία μόνο για το οπτικό αποτέλεσμα στο περιβάλλον χρήστη (UI). Χαίρομαι που βοηθάω. Υ.Γ. Δυστυχώς με το OpenOffice δεν την έχω ψάξει καθόλου και αυτή τη στιγμή δεν μπορώ να σε βοηθήσω.
the_valliant Δημοσ. 20 Μαρτίου 2009 Μέλος Δημοσ. 20 Μαρτίου 2009 Μ' έστειλες πάλι!!! Δεν τις ήξερα καθόλου τις split & with-end with !!! Πολύ καλύτερες, πολύ πιο χρήσιμες. Για άλλη μια φορά σ'ευχαριστώ πολύ!!! ΥΓ. Τώρα παλεύω με το ΟΟ (ΟpenOffice) το οποίο είναι λίγο... μυστήριο με τα Macros του Office. Ευτυχώς τουλάχιστον υποστηρίζει VBA και κατάφερα να εντοπίσω το macro μου μέσα στα δαιδαλώδη μενού του!!!
MastroGiannis Δημοσ. 20 Μαρτίου 2009 Δημοσ. 20 Μαρτίου 2009 Κοίτα να σου γίνει συνήθεια η With-End with γιατί πέρα από πληκτρολόγηση μας εξοικονομεί και χρόνο εκτέλεσης.Κάθε φορά που το πρόγραμμα φτάνει σε μια τελεία τρέχει και την αντίστοιχη διαδικασία ιδιότητας ή μεθόδου της κλάσης του αντικειμένου. Έτσι όσες λιγότερες οι τελείες τόσο πιο σύντομη η εκτέλεση του κώδικα. Με το OpenOffice, με μια γρήγορη ματιά που έριξα πριν λίγο, είδα ότι θα πρέπει να αφιερώσεις λίγο χρόνο να μάθεις τις ιδιότητες των αντικειμένων και τον τρόπο αναφοράς σε αυτά γιατί έχουν διαφορετικές ονομασίες από αυτές της VBA. Κατά τα άλλα δεν είδα και σημαντικές διαφορές. Καλή τύχη λοιπόν!
the_valliant Δημοσ. 23 Μαρτίου 2009 Μέλος Δημοσ. 23 Μαρτίου 2009 Μέχρι τώρα στο ΟΟ είδα ότι ναι μεν ισχύουν οι εντολές της VBA (αυτούσιες) αλλά πρέπει να 'πειραχτούν' λίγο οι ρυθμίσεις ασφαλείας και εισαγωγής των macros του Excel. Στο άλλο μου PC που έχει το OpenOffice δεν υπήρχε το Java Runtime Environment κι έσυ δεν μπόρεσα να το τσεκάρω καλά ακόμα. Μία ακόμα ερώτηση: έχεις κάποιο λινκ για εντολές διαχείρησης του αντικειμένου Ημερολόγιο 11.0 (ActiveX control) ώστε να το φέρω στα μέτρα του Outolook. Βασικά θέλω να κάνω κλικ σε μία ημερομηνία και να μου εμφανίζει τα δεδομένα της ημερομηνίας αυτής -κάτι σαν Αυτόματο Φίλτρο. ΥΓ. Βλέπω ότι γουστάρεις, γι'αυτό επιμένω...
MastroGiannis Δημοσ. 23 Μαρτίου 2009 Δημοσ. 23 Μαρτίου 2009 Το ότι γουστάρω δεν σηκώνει καμία συζήτηση αλλά αν υπάρχει κάποιος εδώ μέσα που δεν γουστάρει να απαντάει, ας σηκώσει το χέρι. Δεν κατάλαβα όμως τί ακριβώς θέλεις να κάνεις με το ημερολόγιο. Πού θέλεις να το χρησιμοποιήσεις; Στο Excel; Να φιλτράρεις κάποια λίστα ή στο Outlook να εμφανίσεις τα μηνύματα μιας συγκεκριμένης ημερομηνίας; Αν θέλεις να δεις τα διαθέσιμα μέλη του χειριστηρίου πάντως, άνοιξε τον Object Browser και επέλεξε την βιβλιοθήκη MSACAL από το combobox των Libraries. Στο παράθυρο "Classes" επέλεξε το "Calendar" και στο παράθυρο των Members θα εμφανιστούν όλα τα μέλη που εκθέτει. Και ένα παράδειγμα: Με τον παρακάτω τρόπο εισάγουμε στο ενεργό κελί (Excel) την επιλεγμένη ημερομηνία με τη χρήση του συμβάντος "Click" το ημερολογίου. >Private Sub Calendar1_Click() ActiveCell = Calendar1.Value End Sub Απλό ε;
the_valliant Δημοσ. 24 Μαρτίου 2009 Μέλος Δημοσ. 24 Μαρτίου 2009 Έχω φτιάξει ένα πίνακα με διάφορα ονόματα και ώρες ραντεβού. Ήθελα να έχω τη δυνατότητα να επιλέγω μία ημερομηνία (στο ημερολόγιο) και να φιλτράρεται ο πίνακας μου ώστε να εμφανίζει μόνο τα ραντεβού εκείνης της ημέρας. Μπορώ φυσικά να το κάνω με Autofilter (και βασικά έτσι το κάνω, αφού ο χρήστης του αρχείου... δεν είναι για πολλά-πολλά!) αλλά για πάρτη μου θα μου άρεσε να μπορώ να το κάνω και με το ημερολόγιο.
MastroGiannis Δημοσ. 24 Μαρτίου 2009 Δημοσ. 24 Μαρτίου 2009 Φίλε the_valliant, ο παρακάτω κώδικας υποθέτει τα εξής: Η περιοχή της λίστας των ραντεβού ονομάζεται "List" Η στήλη με τις ημερομηνίες και ώρες είναι η στήλη 2 της λίστας. >Private Sub Calendar1_Click() Dim lngDate As Long lngDate = Me.Calendar1.Value With Range("List") ' Η περιοχή της λίστας ραντεβού If .Parent.FilterMode Then 'Εμφάνιση όλων .AutoFilter End If 'Άλλαξε το Field στην τιμή που θέλεις .AutoFilter _ Field:=2, _ Criteria1:=">=" & lngDate, _ Operator:=xlAnd, _ Criteria2:="<" & lngDate + 1 End With End Sub Private Sub UserForm_Initialize() 'Προαιρετικά θέτουμε την τιμή του ημερολογίου 'στην πιο πρόσφατη ημερομηνία της λίστας 'και φιλτράρουμε τη λίστα με βάση αυτή την ημερομηνία 'κατά το άνοιγμα της φόρμας. 'Άλλαξε το 2 στο .Columns(2) στην τιμή που θέλεις. Me.Calendar1.Value = _ Application.WorksheetFunction.Max(Range("List").Columns(2)) 'Φιλτράρισμα της λίστας Calendar1_Click End Sub Ελπίζω να δουλεύει...
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.