Μετάβαση στο περιεχόμενο

1 Screenshot

Σχετικά με αυτό το αρχείο

Υπολογισμός μαθηματικών εκφράσεων στο Excel . Οι όποιες μαθηματικές εκφράσεις γράφονται απλά και κατανοητά , χωρίς να προηγείται το "=" για να δηλώσουμε ότι πρόκειται για τύπο που πρέπει να υπολογιστεί.

 

Στο φύλλο εργασίας υπάρχει μια νέα συνάρτηση η evalmath η οποία αναλαμβάνει να υπολογίσει απλές και σύνθετες μαθηματικές εκφράσεις που περιέχονται σε κάποιο κελλί . Όσοι/Όσες προτιμούν να χρησιμοποιούν το χ αντί για το * στον πολλαπλασιασμό , δεν θα έχουν κανένα πρόβλημα, υποστηρίζεται από τη συνάρτηση .


Σχόλια Μελών

Recommended Comments

apostolos55

Δημοσιεύτηκε

Γιώργο καλημέρα

"Math Evaluation" = a blast from the past!!! Ευχαριστούμε για την επαναφορά

 

να σημειώσω ότι σε Excel 2010 χρειάστηκε αλλαγή σε public της function

alt+f11 (για άνοιγμα VBA editor)

Function EvalMath(xc As String) As Double --> Public Function EvalMath(xc As String) As Double

 

προτείνω α)

If xc <> "" Then --> If Trim(xc) <> "" Then

έτσι προλαβαίνουμε την περίπτωση xc=" "

 

β) για όποιον έχει περιττά δεδομένα όπως μονάδες

προσθήκη της μπλε γραμμής:

For I = 1 To lt

If Mid$(xc, I, 1) = "×" Or Mid$(xc, I, 1) = "X" Or Mid$(xc, I, 1) = "x" Or Mid$(xc, I, 1) = "χ" Then

Mid$(xc, I, 1) = "*"

End If

If Not InStr("0123456789+-*/.,()^", Mid$(xc, I, 1)) > 0 Then Mid$(xc, I, 1) = " "

Next

 

αν και εδώ θέλει προσοχή γιατί αν πχ έχετε "8+5 χιλιάδες" θα αλλάξει το "χ" με "*" και προκύπτει ΛΑΘΟΣ!!! οπότε πρέπει να διαλέξετε...

 

γ) τολμώ να προτείνω μια παραλαγή της EvalMath, ας την πούμε EvalMath2. Την προτείνω αρχικά γιατί χρησιμοποιώντας συναρτήσεις της VBA είναι πολύ πιο απλή προγραμματιστικά, και πιο εύκολη για αλλαγές... κατά τα άλλα νομίζω ότι δουλεύουν το ίδιο. Με τη προσθήκη της επιλεκτίκής αφαίρεσης δεδομένων που δε συμμετέχουν σε πράξεις... ολοκληρωνόμαστε νομίζω.

 

Public Function EvalMath2(xc As String, Optional RemoveStrings As Boolean = False) As Double

Dim n As Double, lt As Long, I As Long

 

lt = Len(Trim(xc))

If lt > 0 Then

If RemoveStrings = False Then

xc = LCase(xc)

xc = Replace(xc, "χ", "*")

xc = Replace(xc, "x", "*")

Else

For I = 1 To lt

If Not InStr("0123456789+-*/.,()^", Mid$(xc, I, 1)) > 0 Then Mid$(xc, I, 1) = " "

Next

End If

n = Evaluate("=" & xc)

Else

n = 0

End If

EvalMath2 = n

 

End Function

 

 

αν / όταν κάνετε copy-paste στη VBA διορθώστε τα "χ" που ίσως περαστούν λάθος

Προσέξτε καλά την replace, είναι φοβερή διευκόλυνση...

gvarth

Δημοσιεύτηκε

Απόστολε ευπρόσδεκτες οι αλλαγές και οι προτάσεις σου .

 

Δουλεύω σε Excel 2003 . Δεν μου δόθηκε η ευκαιρία να το δοκιμάσω σε Office 2010.

 

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

Gousgounis

Δημοσιεύτηκε

να προσθέσω λίγα ακόμη χρήσιμα regex:

xc = Replace(xc, "π", "pi()")
xc = Replace(xc, "[", "(")
xc = Replace(xc, "]", ")")
xc = Replace(xc, "{", "(")
xc = Replace(xc, "}", ")")

 

Επίσης το μείον της VBA είναι ότι αναγνωρίζει μόνο την τελεία ως δεκαδική υποδιαστολή

 

Μπράβο Γιώργο που το ανέβασες. Είναι πολύ χρήσιμο εργαλείο ιδίως σε αυτούς που κάνουν προμετρήσεις σε word και μετά τα "χτυπάνε" σε κομπιουτεράκι...

  • Upvote 3
gvarth

Δημοσιεύτηκε

Είναι πολύ χρήσιμο εργαλείο ιδίως σε αυτούς που κάνουν προμετρήσεις σε word και μετά τα "χτυπάνε" σε κομπιουτεράκι...

 

Κάπως έτσι ξεκίνησε η ιστορία... Το ερώτημα που αρχικά "έπεσε" στο τραπέζι ήταν να μπορεί το Excel να αναγνωρίζει αριθμητικές παραστάσεις ακόμη και όταν ξεχνάμε το "=" στην αρχή τους . Μετά "γλυκάθηκα" και με τις παραινέσεις συναδέλφων ξεκίνησα το "ψάξιμο" ώστε το σύμβολο για τον πολλαπλασιασμό να το καταλαβαίνει ακόμη και όταν γράφεται με x (είτε μικρό , είτε κεφαλαίο) ανεξάρτητα αν γράφουμε με πληκτρολόγιο στα ελληνικά ή λατινικά.

apostolos55

Δημοσιεύτηκε

Επίσης το μείον της VBA είναι ότι αναγνωρίζει μόνο την τελεία ως δεκαδική υποδιαστολή

 

προσθέτουμε μερικά IF και μερικά Replace() ακόμα, και για καλύτερη χρήση και ένα Optional στο κάλεσμα... και ιδού:

Public Function EvalMath2(xc As String, Optional FixRegional As Boolean = False) As Double
Dim n As Double, lt As Long, I As Long
lt = Len(Trim(xc))
If lt > 0 Then
xc = LCase(xc)
xc = Replace(xc, "χ", "*")
xc = Replace(xc, "x", "*")
xc = Replace(xc, "π", "pi()")
xc = Replace(xc, "[", "(")
xc = Replace(xc, "]", ")")
xc = Replace(xc, "{", "(")
xc = Replace(xc, "}", ")")
   If FixRegional Then
	' remove Thousands separator
	xc = Replace(xc, Application.International(xlThousandsSeparator), "")   ' xc = Replace(xc, ".", "")   ' or
	' replace Decimal separator from WindowsDeafult to VBA Default "."
	xc = Replace(xc, Application.International(xlDecimalSeparator), ".")	' xc = Replace(xc, ",", ".")  ' or
End If

n = Evaluate("=" + xc)
Else
 n = 0
End If
EvalMath2 = n
End Function

 

(σημείωση: το "β) για όποιον έχει περιττά δεδομένα όπως μονάδες" δεν μπλέκει την κατάσταση χωρίς λόγο, οπότε το αφαίρεσα.)

  • Upvote 2
apostolos55

Δημοσιεύτηκε

Επανέρχομαι με κάτι πολύ παλιό, πολύ κρυμένο... Δεν υπάρχει λόγος να χρησιμοποιούμαι VBA για evaluate! Γίνεται με συνάρτηση του Excel κρυμμένη από το Excel, αλλά υπαρκτή στο RefersTo στα Named Ranges... κουφάθηκα όταν το είδα και διαπίστωσα ότι δουλεύει...

λεπτομέρειες και εδώ.

ΚΑΝΑ

Δημοσιεύτηκε

Σ' ευχαριστώ πάρα πολύ!!

junko

Δημοσιεύτηκε

Σε ευχαριστώ πολύ!!!

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

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

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

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

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

Σύνδεση

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

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

Σημαντικό

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