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/4980-problima-me-ginomeno.html)

ΔΗΜΗΤΡΙΟΣ 18-08-18 13:23

Πρόβλημα με το γινόμενο
 
1 Συνημμένο(α)
Πρέπει λογικά να πάρω 18 αποτελέσματα αλλά κάτι δεν έχω κάνει σωστά!
Ευχαριστώ !

kapetang 18-08-18 14:47

Καλησπέρα

Δημήτρη δεν παίρνεις 18 αποτέλεσμα επειδή κάποια στιγμή προκαλείται λάθος και ο κώδικας διακόπτεται.

Έχεις δηλώσει τις μεταβλητές a, b, και c ως Integer.

Αυτό σημαίνει ότι η μέγιστη τιμή τους είναι: 32.768

Στη γραμμή κώδικα L=a*b*c επειδή και οι 3 παράγοντες είναι Integer η VBA θεωρεί και το αποτέλεσμα Integer.

Έτσι όταν το γινόμενο είναι > 32.768 προκαλείται λάθος και ο κώδικας σταματάει.

Μια λύση είναι να γράψεις : L = CLng(a) * b * c, δηλαδή να κάνεις τον ένα παράγοντα τύπου Long.

Καλύτερη και ξεκάθαρη λύση είναι να δηλώνεις όλες τις μεταβλητές a, b, c, L ως Long, ώστε ο τύπος L=a*b*c να μη προκαλεί λάθος.

ΔΗΜΗΤΡΙΟΣ 18-08-18 15:10

Ευχαριστώ πολύ Γιώργο!
Να είσαι καλά!!

kapetang 18-08-18 16:37

Επίσης Δημήτρη!

Spirosgr 18-08-18 16:47

2 Συνημμένο(α)
Καλησπέρα
Μερικές σημαντικές επισημάνσεις.

Κατ' αρχάς, ο κώδικας αυτός (η module δηλαδή) δεν έχει Option Explicit.

Η έκφραση αυτή, υποχρεώνει τον δημιουργό,
να δηλώσει όλες τις μεταβλητές που θα χρησιμοποιήσει.

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

Στον original κώδικα:
Κώδικας:

Sub NIK()
    Dim a As Integer
    Dim b As Integer
    Dim c As Integer
    Dim k As Integer

    For b = 3 To 20
        a = 2 * b - 4
        c = 8 * b - 14
        L = a * b * c
        k = k + 1
        Range("D" & k).Value = L
    Next b
End Sub

δηλώνονται μεν οι μεταβλητές
Dim a As Integer
Dim b As Integer
Dim c As Integer
Dim k As Integer
χωρίς να εξετάσουμε το πως (ακέραιοι επί του προκειμένου)
αλλά δεν δηλώνεται η μεταβλητή L.

Αυτό είναι ακόμα χειρότερος προγραμματισμός,
από το να γράψει κανείς κώδικα χωρίς Option Explicit
όπως παρακάτω:
Κώδικας:

Sub NIK()
    For b = 3 To 20
        a = 2 * b - 4
        c = 8 * b - 14
        L = a * b * c
        k = k + 1
        Range("D" & k).Value = L
    Next b
End Sub

που τρέχει κανονικά χωρίς προβλήματα και εμφανίζει όλα (18) τα γινόμενα...

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

Επισήμανση:
Γενικά, όταν έχουμε να κάνουμε με υπολογισμούς,
επειδή οι μεταβλητές δεν ξέρουμε από που θα προκύψουν
(εκτός αν τις βάλουμε «καρφωτά» και δεν αλλάζουν πχ ακέραιους)
και μπορεί να είναι ακέραιοι ή και δεκαδικοί,
καλό είναι να ορίζουμε δυό πράγματα.
1
Την μορφή του αριθμού στο κελί προορισμού πχ cell.NumberFormat(....,"μορφοποίηση")
2
Να είναι μέσα σε μια Cdbl()
*Δεν ισχύει πάντα (95%) αλλά ας το έχουμε υπ' όψιν...

ΔΗΜΗΤΡΙΟΣ 18-08-18 18:50

Ευχαριστώ πολύ για τον χρόνο που αφιερώνεται για να μας βοηθάτε..
Η βοήθειά σας είναι ανεκτίμητη.Είσαστε πολύ έμπειροι και γνώστες του αντικειμένου αυτού.
'Οσο αφορά για την vba ενώ μου αρέσει πολύ, δυστυχώς δεν έχω χρόνο και την κατάλληλη ηλικία να ασχοληθώ σοβαρά.
Να είσαστε καλά !

Spirosgr 18-08-18 18:52

Να 'σαι καλά καλή συνέχεια.


Η ώρα είναι 04:20.

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


Search Engine Optimization by vBSEO 3.3.2