Frage stellen
0

Alle Zellen eines Bereiches mit faktorieren | Fehler: Datentypen unverträglich

gefragt 2019-08-16 13:01:49 +0200

Statistiker Gravatar-Bild

updated 2019-08-19 10:45:42 +0200

Hallo, habe mir aus Bruchstücken Makros zusammengebastelt, die alle Zellen/Werte eines markierten Bereichs durch einen Faktor dividieren ("DivideSelectedCells"). Das klappte bisher auch ganz gut. Danach habe ich mir das Makro zu MultiplySelectedCells angepasst, um die Zahlen mit einem Faktor multiplizieren zu können. Schon beim ersten Aufruf kam ein Fehler: Datentypen unverträglich, der sich natürlich auch nach jeden Aufruf immer wiederholte.

Danach habe ich das erste Makro (DivideSelectedCells) nochmals laufen lassen und an der gleichen Stelle wie bei MultiplySelected Cells kam nun der gleiche Fehler. Was läuft hier falsch? Ich habe zwar das Array ReDimensioniert, aber der Fehler blieb.

Wer kann helfen ? Natürlich wäre es einfacher, die ganze Berechnung über "Inhalte einfügen | Rechenoperationen | Dividieren bzw. Multiplizieren" durchzuführen, aber als Neuling würde mich schon interessieren, ob es einen Ausweg gibt.

Hier also die Makros zum Dividieren:

Sub DivideSelectedCells 
' HAUPMAKRO, das die anderen aufruft'
Dim dDivisor As Double
Dim oSels
dDivisor = InputBox("Bitte den Faktor eingeben" & Chr(10)&"Dezimalzahlen mit Punkt","Division durch Faktor","0.001")
' Wenn dDivisor = 0.001 dann mit 1000 mulitplizieren'
  oSels = ThisComponent.getCurrentController().getSelection()
  DivideRegions(oSels, dDivisor)
End Sub

Sub DivideRange(oRange, dDivisor As Double)
' wird für DivideSelectedCells benötigt'
Redim oData()
Redim oRow()
Dim i As Integer
Dim j As Integer
oData() = oRange.getDataArray()
  For i = LBound(oData()) To UBound(oData())
    oRow() = oData(i)
      For j = LBound(oRow()) To UBound(oRow())
       oRow(j) = oRow(j) / dDivisor 
        ' -- FEHLER Unzulässiger Wert oder Datentyp:Datentypen unverträglich'
     Next
  Next
oRange.setDataArray(oData())
End Sub

Sub DivideCell(oCell, dDivisor As Double)
' wird für DivideSelectedCells benötigt '
  oCell.setValue(oCell.getValue()/dDivisor)
End Sub

Sub DivideRegions(oSels, dDivisor As Double)
' wird für DivideSelected Cells benötigt' 
Dim oSel
Dim i As Integer
If oSels.supportsService("com.sun.star.sheet.SheetCell") Then
  DivideCell(oSels, dDivisor)
ElseIf oSels.supportsService("com.sun.star.sheet.SheetCellRanges") Then
   For i = 0 To oSels.getCount() -1
      DivideRegions(oSels.getByIndex(i), dDivisor)
   Next
 ElseIf oSels.supportsService("com.sun.star.sheet.SheetCellRange") Then
      DivideRange(oSels, dDivisor)
 End If
End Sub

.. und die hier zum Multiplizieren:

Sub MultiplySelectedCells
' HAUPMAKRO, das die anderen aufruft'
Dim dMultiplier As Double
Dim oSels
  dMultiplier = InputBox("Bitte den Faktor eingeben" & Chr(10)&"Dezimalzahlen mit Punkt","Multiplikation mit Faktor","1")
  oSels = ThisComponent.getCurrentController().getSelection()
  MultiplyRegions(oSels, dMultiplier)
End Sub

Sub MultiplySelectedCells
' HAUPMAKRO, das die anderen aufruft'
Redim dMultiplier As Double
Redim oSels
  dMultiplier = InputBox("Bitte den Faktor eingeben" & Chr(10)&"Dezimalzahlen mit Punkt","Multiplikation mit Faktor","1")
  oSels = ThisComponent.getCurrentController().getSelection()
  MultiplyRegions(oSels, dMultiplier)
End Sub

Sub MultiplyCell(oCell, dMultiplier As Double)
' wird für MultiplySelectedCells benötigt '
  oCell.setValue(oCell.getValue()*dMultiplier)
End Sub

Sub MultiplyRange(oRange, dMultiplier As Double)
Dim oData()
Dim oRow()
Dim i As Integer
Dim j As Integer
  oData() = oRange.getDataArray()
  For i = LBound(oData()) To UBound(oData())
    oRow() = oData(i)
    For j = LBound(oRow()) To UBound(oRow())
      oRow(j) = oRow(j) * dMultiplier   <--- KORRIGIERT
       ' --- FEHLER: Unzulässiger Wert oder Datentyp:Datentypen unverträglich'
    Next
  Next
  oRange.setDataArray(oData())
End Sub

Sub MultiplyRegions(oSels, dMultiplier As Double)
Dim oSel
Dim i As Integer
  If ...
(mehr)
Bearbeiten Tags ändern Melden schließen vereinen löschen

Kommentare

Ich hab die Kommentarzeilen ergänzt damit das Syntaxhightlighting der Seite nicht durcheinanderkommt.

karolus Gravatar-Bildkarolus ( 2019-08-17 13:04:52 +0200 )Bearbeiten

Da gibt es doch die IDE zum Debuggen. Schau dir die beteiligten Variablen daraufhin an, welche Typen sie haben. Wenn da mal "String" dabei sein sollte, verfolge die Variable bis zur letzten Zuweisung zurück. Anzunehmen ist, dass wohl (mindestens) eines der Elemente des DataArrray, oder der Multiplikator keinen Zahltyp haben, und auch nicht automatisch konvertiert werden können.
Auch: Wieso versuchtst du, durch den Multiplikator zu dividieren?
Du solltest auch daran denken, dass der internationale Schmarrn die Dezimaltrenner betreffend immer für Ärger gut ist.

Lupp Gravatar-BildLupp ( 2019-08-17 16:19:42 +0200 )Bearbeiten

Ja, danke erst einmal, will mal sehen wie weit ich komme... Vor dem Multiplikator stand der falsche Rechenoperator, im Original habe ich es korrigiert. Grüße

Statistiker Gravatar-BildStatistiker ( 2019-08-19 10:43:06 +0200 )Bearbeiten

1 Antwort

0

geantwortet 2019-08-17 18:21:51 +0200

karolus Gravatar-Bild

Hallo

Zunächst mal hast du großzügig ganze Codeblöcke kopiert und lediglich Namen angepasst, nicht jedoch die eigentliche Rechenoperation. Den grössten Teil dieses Copy&paste-gedöns kann man sich (auch in Basic) ersparen, wenn man das sinnvoll in Funktionen gliedert die dann nur mit entsprechenden Argumenten aufgerufen werden. Eine Musterlösung in Python (vorerst nur für den Aufruf aus einer Python-shell … ich hab keine Lust noch einen Dialog dazuzuschreiben)

from functools import partial
from operator import add, mul

def divide(a,b):
    return a / b

def subtract(a, b):
    return a - b

def mapping(op, x):
    funcs = {'+': partial(add, x),
             '-': partial(subtract, b=x),
             '*': partial(mul, x),
             '/': partial(divide, b=x)}
    return funcs[op]

def main(*_):
    doc = XSCRIPTCONTEXT.getDocument()
    selection = doc.CurrentSelection
    numeric_ranges = selection.queryContentCells(3)#Zahlen(1) plus Datums/zeitwerte(2)
    number = float(input("gib bitte eine Zahl ein: …  "))

    op = input('gib einen der 4 Operatoren "+-*/" ein: … ')
    op = mapping(op, number )

    for single_range in numeric_ranges:
        data = single_range.DataArray
        out = [tuple(map(op, row)) for row in data]
        single_range.DataArray = out

Mit diesen ~25 Zeilen werden alle 4 Grundrechenarten berücksichtigt.

Bearbeiten Melden löschen Link mehr
Registrieren oder einloggen, um zu antworten

Antwortwerkzeuge

1 Beobachter

Statistik

Gefragt: 2019-08-16 13:01:49 +0200

Angesehen: 54 Mal

Aktualisiert: Aug 19