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

macro Excel (για γερούς λύτες!)


the_valliant

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

Δημοσ.

Μήπως μπορεί κάποιος να βοηθήσει, έχω ξεχάσει το βιβλίο μου της VBA στην Αθήνα :cry:

Έχω ένα αρχείο 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") ;

Δημοσ.

Αντικατέστησε τη διαδικασία του κουμπιού με την παρακάτω:

 

>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 για να τα επεξεργαστείς.

Όπως είδες η επιλογή τους μόνο προβλήματα σου δημιουργεί.;)

Δημοσ.

Σ'ευχαριστώ για το χρόνο σου, Μάστορα!

Τελικά πέτυχα αυτό που ζητούσα με τον παρακάτω κώδικα:

 

>
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) ώστε να τα αποθηκεύσω σε διαφορετικά κελιά (Όνομα και Επώνυμο)...

 

Ε ρε τι κάνω για τους φίλους μου ρεεεεεεεε :X

Δημοσ.
Σ'ευχαριστώ για το χρόνο σου, Μάστορα!

Τώρα προσπαθώ να σπάσω το όνομα του κελιού σε δύο λέξεις (strings) ώστε να τα αποθηκεύσω σε διαφορετικά κελιά (Όνομα και Επώνυμο)...

 

Αν στο κελί Β1 έχουμε το ΡΙΖΟΥ ΟΥΡΑΝΙΑ, στο κελί C1 ο τύπος

=IF(LEN(B1);IF(ISERROR(FIND(" ";TRIM(B1)));B1;LEFT(B1;FIND(" ";TRIM(B1))-1));"")

μας επιστρέφει το ΡΙΖΟΥ και ο τύπος στο κελί D1

=SUBSTITUTE(B1;C1;"")

μας επιστρέφει το ΟΥΡΑΝΙΑ.

 

Οι φίλοι είναι για να μας παιδεύουν αλλά τι θα κάναμε χωρίς αυτούς;:fear:

Δημοσ.

Γουάου! Δοκίμασα αυτό που μου πρότεινες και (φυσικά) λειτουργεί! Τώρα προσπαθώ να το καταλάβω... :confused:

 

Εν πάση περιπτώσει, δεν μου κάνει 100% για τον λόγο ότι το κελί που θα 'σπάσει' σε ΕΠΩΝΥΜΟ & ΟΝΟΜΑ το διαβάζει από διαφορετική καρτέλα ("ΕΥΡΕΤΗΡΙΟ") από αυτή που βρίσκονται τα δύο κελιά που θα γραφούν τα ΕΠΩΝΥΜΟ & ΟΝΟΜΑ.

 

Δυστυχώς για άλλη μια φορά κατέφυγα στο να επιλέξω αυτό που ήθελα να ελέγξω, αν και προσπάθησα να αποφύγω να το κάνω!

Πως σου φαίνεται το 'τερατούργημά' μου? :o

 

>
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?

Δημοσ.

Με την VBA απλοποιείται αρκετά το πράγμα λόγω ύπαρξης της ενσωματωμένης συνάρτηση Split.

Δηλαδή το 'τερατούργημά' σου :P θα μπορούσε να γίνει:

>With Sheets(Sheets.Count)
   .Range("B4") = Split(.Name, " ")(0)
   .Range("C4") = Split(.Name, " ")(1)
End With

Και πάλι όπως βλέπεις δεν χρειάστηκε να επιλεγεί κάποιο αντικείμενο.

Η μέθοδος Select είναι αναγκαία μόνο για το οπτικό αποτέλεσμα στο περιβάλλον χρήστη (UI).

 

Χαίρομαι που βοηθάω.:-)

 

Υ.Γ.

Δυστυχώς με το OpenOffice δεν την έχω ψάξει καθόλου και αυτή τη στιγμή δεν μπορώ να σε βοηθήσω.:whistle:

Δημοσ.

Μ' έστειλες πάλι!!!

Δεν τις ήξερα καθόλου τις split & with-end with !!! :o

Πολύ καλύτερες, πολύ πιο χρήσιμες.

Για άλλη μια φορά σ'ευχαριστώ πολύ!!!

 

ΥΓ. Τώρα παλεύω με το ΟΟ (ΟpenOffice) το οποίο είναι λίγο... μυστήριο με τα Macros του Office. Ευτυχώς τουλάχιστον υποστηρίζει VBA και κατάφερα να εντοπίσω το macro μου μέσα στα δαιδαλώδη μενού του!!!

Δημοσ.

Κοίτα να σου γίνει συνήθεια η With-End with γιατί πέρα από πληκτρολόγηση

μας εξοικονομεί και χρόνο εκτέλεσης.Κάθε φορά που το πρόγραμμα φτάνει σε μια τελεία

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

Έτσι όσες λιγότερες οι τελείες τόσο πιο σύντομη η εκτέλεση του κώδικα.;)

 

Με το OpenOffice, με μια γρήγορη ματιά που έριξα πριν λίγο, είδα ότι θα πρέπει να αφιερώσεις

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

γιατί έχουν διαφορετικές ονομασίες από αυτές της VBA.

Κατά τα άλλα δεν είδα και σημαντικές διαφορές.

Καλή τύχη λοιπόν!:-)

Δημοσ.

Μέχρι τώρα στο ΟΟ είδα ότι ναι μεν ισχύουν οι εντολές της VBA (αυτούσιες) αλλά πρέπει να 'πειραχτούν' λίγο οι ρυθμίσεις ασφαλείας και εισαγωγής των macros του Excel. Στο άλλο μου PC που έχει το OpenOffice δεν υπήρχε το Java Runtime Environment κι έσυ δεν μπόρεσα να το τσεκάρω καλά ακόμα.

 

Μία ακόμα ερώτηση: έχεις κάποιο λινκ για εντολές διαχείρησης του αντικειμένου Ημερολόγιο 11.0 (ActiveX control) ώστε να το φέρω στα μέτρα του Outolook. Βασικά θέλω να κάνω κλικ σε μία ημερομηνία και να μου εμφανίζει τα δεδομένα της ημερομηνίας αυτής -κάτι σαν Αυτόματο Φίλτρο.

 

ΥΓ. Βλέπω ότι γουστάρεις, γι'αυτό επιμένω... B)

Δημοσ.

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

που δεν γουστάρει να απαντάει, ας σηκώσει το χέρι.:devil:

 

Δεν κατάλαβα όμως τί ακριβώς θέλεις να κάνεις με το ημερολόγιο.

Πού θέλεις να το χρησιμοποιήσεις; Στο Excel; Να φιλτράρεις κάποια λίστα

ή στο Outlook να εμφανίσεις τα μηνύματα μιας συγκεκριμένης ημερομηνίας;

Αν θέλεις να δεις τα διαθέσιμα μέλη του χειριστηρίου πάντως, άνοιξε τον Object Browser

και επέλεξε την βιβλιοθήκη MSACAL από το combobox των Libraries.

Στο παράθυρο "Classes" επέλεξε το "Calendar" και στο παράθυρο των Members

θα εμφανιστούν όλα τα μέλη που εκθέτει.

 

Και ένα παράδειγμα:

Με τον παρακάτω τρόπο εισάγουμε στο ενεργό κελί (Excel) την επιλεγμένη ημερομηνία

με τη χρήση του συμβάντος "Click" το ημερολογίου.

>Private Sub Calendar1_Click()
   ActiveCell = Calendar1.Value
End Sub

Απλό ε;B)

Δημοσ.

Έχω φτιάξει ένα πίνακα με διάφορα ονόματα και ώρες ραντεβού. Ήθελα να έχω τη δυνατότητα να επιλέγω μία ημερομηνία (στο ημερολόγιο) και να φιλτράρεται ο πίνακας μου ώστε να εμφανίζει μόνο τα ραντεβού εκείνης της ημέρας.

Μπορώ φυσικά να το κάνω με Autofilter (και βασικά έτσι το κάνω, αφού ο χρήστης του αρχείου... δεν είναι για πολλά-πολλά!) αλλά για πάρτη μου θα μου άρεσε να μπορώ να το κάνω και με το ημερολόγιο.

Δημοσ.

Φίλε the_valliant, ο παρακάτω κώδικας υποθέτει τα εξής:

  1. Η περιοχή της λίστας των ραντεβού ονομάζεται "List"
  2. Η στήλη με τις ημερομηνίες και ώρες είναι η στήλη 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

Ελπίζω να δουλεύει...:-)

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...