Forum

Forum (https://www.ms-office.gr/forum/)
-   Excel - Ερωτήσεις / Απαντήσεις (https://www.ms-office.gr/forum/excel-erotiseis-apantiseis/)
-   -   [VBA] Δημιουργία Μορφοποιημένου Φύλλου Εργασίας με κώδικα (https://www.ms-office.gr/forum/excel-erotiseis-apantiseis/1185-dimioyrgia-morfopoiimenoy-filloy-ergasias-me-kodika.html)

ΤΖΙΜΗΣ 01-06-11 17:32

Δημιουργία Μορφοποιημένου Φύλλου Εργασίας με κώδικα
 
1 Συνημμένο(α)
Καλησπέρα σε όλους και καλό καλοκαίρι να έχουμε.
Θέτω ένα θέμα που με απασχολεί εδώ και καιρό.Είναι η δημιουργία ενός μορφοποιημένου φύλλου εργασίας με χρήση κώδικα.
Αναλυτικότερα:Στο παράδειγμα που επισυνάπτω έχω ένα φύλλο εργασίας με τίτλο "Υπολογισμός Προσφοράς"
Πώς μπορούμε (πάντα με τη χρήση κώδικα) να δημιουργήσουμε νέα φύλλα εργασίας όπου θα είναι μία μορφοποιημένη προσφορά σε ένα πελάτη που θα την έχουμε ορίσει, ώστε να εμφανίζονται μόνο τα προιόντα που δεν έχουν μηδενική τιμή με όνομα του πρώτου φύλλου εργασίας το όνομα του πρώτου πελάτη(πχ.petrou) και τα επόμενα φύλλα με την ίδια λογική.O κώδικας να είναι αντιστοιχισμένος σε ένα κουμπί εντολής όπου θα δημιουργεί το φύλλο εργασίας με συγκεκριμένο όνομα.
Ευχαριστώ.

gr8styl 02-06-11 09:09

Καλημέρα σας.

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

Ελπίζω να ήμουν τόσο σαφής όσο και εσύ. :icon_choc:

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

Αν δεν μας δώσεις τα απαιτούμενα στοιχεία δεν νομίζω ότι θα μπορέσεις να έχεις κάποια απάντηση.

Τέλος, εγώ θα έλεγα ότι μάλλον πρέπει να ελέγχει την ποσότητα και όχι την τιμή. Για σκέψου το λίγο. Υπάρχουν και προϊόντα που ενώ έχουν ποσότητα δεν έχουν τιμή, γιατί ίσως είναι προσφορά του καταστήματος. :cool:

Φιλικά
Θανάσης.

ΤΖΙΜΗΣ 02-06-11 11:38

1 Συνημμένο(α)
Θανάση ευχαριστώ για την ανταπόκρισή σου.Ίσως να χρειάζεται να δώσω περισσότερες εξηγήσεις.Όταν λέω να δημιουργεί ένα νέο φύλλο εργασίας με βάση κάποια συγκεκριμένη μορφοποίηση εννοώ όπως πχ. αυτό στο φύλλο προσφορά.Το βασικό όμως ερώτημα παραμένει κατά πόσο μπορεί να υπάρξει κώδικας που να δημιουργεί ένα νέο φύλλο εργασίας.(αναπαραγωγή φύλλου)
Ευχαριστώ.

gr8styl 02-06-11 16:33

Δεν ξέρω αν σε καταλαβαίνω Τζίμη,
Τέλος πάντων
Η γραμμή κώδικα που αντιγράφει το φύλλο "ΠΡΟΣΦΟΡΑ" σαν τελευταίο φύλλο στο βιβλίο είναι:
Sheets("ΠΡΟΣΦΟΡΑ").Copy After:=Sheets(Sheets.Count)
και η επόμενη γραμμή το μετονομάζει σε "ΠΕΛΑΤΗΣ_1"
Sheets(Sheets.Count).Name = "ΠΕΛΑΤΗΣ_1"

Θανάσης.

ΤΖΙΜΗΣ 02-06-11 17:19

Θανάση θέλω αν γίνεται, με κώδικα VBA να δημιουργείτε ένα φύλλο εργασίας όπως αυτό το φύλλο ΠΡΟΣΦΟΡΑ το οποίο θα περιλαμβάνει εκείνα τα είδη που έχουν ποσότητες μη μηδενικές με βάση το πρώτο φύλλο.Το όνομα του νέου φύλλου που θα δημιουργείτε μπορεί να ορίζετε από τον κωδικα;

Tasos 02-06-11 20:37

Καλησπέρα σε όλους!

Δημήτρη, το ερώτημα σου είναι κατανοητό.

Όμως:
Ο προγραμματιστής, πριν προχωρήσει στη δημιουργία κάποιας ρουτίνας θα πρέπει να λάβει υπόψη του ΟΛΑ τα πιθανά σενάρια που θα οδηγούσαν σε σφάλμα και ενδεχομένως σε ανεπιθύμητα αποτελέσματα!

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

Για παράδειγμα:
  • Από που θα πάρει η VBA την τιμή για να συμπληρωσει το κελί B2 στο νέο φύλλο;
  • Τι όνομα θα δοθεί στο νέο φύλλο;
  • Τι θα γίνει αν ήδη υπάρχει ήδη ένα φύλλο με το ίδιο όνομα;
  • Τι θα γίνει αν το όνομα του φύλλου δεν μπορεί να περαστεί στο νέο φύλλο
    επειδή είναι μεγάλο ή επειδή περιέχει μη επιτρεπόμενους χαρακτήρες;
Δώσε μας μια απάντηση στα παραπάνω για να μπορέσουμε να σε βοηθήσουμε.

Φιλικά

Τάσος

ΤΖΙΜΗΣ 02-06-11 21:33

Τάσο ευχαριστώ για το ενδιαφέρον.Ειδικότερα:
1)Το όνομα για το κελί Β2 να το παίρνει από ένα inputForm
2) τό όνομα του φύλλου να είναι ίδιο με το κελί Β2
3) το όνομα να είναι αποδεκτό σύμφωνα με τις αρχές τις VBA (αποδεκτοί χαρακτήρες)
4) αν υπάρχει ήδη φύλλο με το ίδιο όνομα να το αντικαθιστά με το νέο.

Tasos 02-06-11 23:14

Γεια σου Δημήτρη!
Μετονόμασε το φύλλο "ΠΡΟΣΦΟΡΑ" σε "OfferTemplate" και απόκρυψε το.

Κατόπιν στο φύλλο "ΥΠΟΛΟΓΙΣΜΟΣ ΠΡΟΣΦΟΡΑΣ" αντιστοίχησε την ρουτίνα "NewOffer" στον παρακάτω κώδικα σε ένα κουμπί:

Κώδικας:

Option Explicit
Const ilegalChars = ":\/?*[]"

Sub NewOffer()
    Dim rng As Range, Wks As Worksheet, NewWks As Worksheet, _
        xPos As Integer, OfferName As String, SheetName As String
    Application.ScreenUpdating = False
    OfferName = VBA.InputBox("Δώσε Eπωνυμία", "Νέα προσφορά...")
    If StrPtr(OfferName) = 0 Then Exit Sub
    SheetName = CleanName(OfferName)
    xPos = NewSheetPosition(NewName:=SheetName)
    Set Wks = ActiveSheet
    Wks.Range("A:E").AutoFilter Field:=3, Criteria1:=">0", _
                                Operator:=xlAnd

    With ThisWorkbook.Worksheets("OfferTemplate")
        .Visible = xlSheetVisible
        .Copy After:=Sheets(xPos)
        .Visible = xlSheetHidden
    End With
    Set NewWks = ActiveSheet
    Set rng = Wks.AutoFilter.Range.Offset(1)
    rng.Copy
    With NewWks
        .Name = SheetName
        .Range("B1") = OfferName
        .Range("A5").PasteSpecial xlPasteValues
        .Range("A5").Select
    End With
    Wks.AutoFilterMode = False
    Application.CutCopyMode = False

End Sub

Function NewSheetPosition(NewName As String) As Integer
    Dim sh As Object, i As Integer
    For Each sh In ThisWorkbook.Sheets
        If sh.Name = NewName Then
            Application.DisplayAlerts = False
            sh.Delete
            Application.DisplayAlerts = True
        Else
            If sh.Visible Then i = i + 1
        End If
    Next
    NewSheetPosition = i
End Function

Function CleanName(strName As String) As String
    Dim i As Integer, tmpName As String
    tmpName = strName
    For i = 1 To Len(ilegalChars)
        tmpName = Replace(tmpName, Mid(ilegalChars, i, 1), "_")
    Next
    CleanName = tmpName
End Function

Καλή συνέχεια!

Τάσος

ΤΖΙΜΗΣ 03-06-11 10:36

Τάσο 'ίσως να σε κούρασα.Έκανα αυτό που μου είπες.Αποτέλεσμα το πρώτο φύλλο να μου εμφανίζει τα προιόντα που θέλω, ενώ εγώ το φύλλο αυτό δε θέλω να αλλάζει.Δημιουργία άλλου νέου φύλλου σύμφωνα με την επωνυμία που θέτω στην εισαγωγική φόρμα όπου θα εμφανίζει τα προιόντα με μη μηδενική τιμή δεν έκανε.
Μήπως κάτι κάνω στραβά;

kapetang 03-06-11 10:56

1 Συνημμένο(α)
Καλημέρα στην παρέα

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

Φιλικά/Γιώργος


Η ώρα είναι 23:44.

Ms-Office.gr - ©2000 - 2026, Jelsoft Enterprises Ltd.


Search Engine Optimization by vBSEO 3.3.2