2.6k Aufrufe
Gefragt in Tabellenkalkulation von
hallo zusammen!!

mit euerer hilfe habe ich schon öfters makros zusammenflicken können. ich hoffe ihr könnt mir dieses mal auch weiterhelfen...
mit meinem makro lese ich intensitäten von spektren ein, spalte für spalte.
die eingelesenen files werden mit aufsteigenden zahlen (zb: "024", "183", etc) abgespeichert und somit auch nacheinander eingelesen. das passt soweit auch.
nun möchte ich aber das sobald ein file den namen "beliebige Zahl_n" (n: für negativ) hat, diese invertiert wird (also alle werte mit -1 multipliziert). von zeile 2-900
hier mein makro:...

Sub restFiles()
Dim varFileNames As Variant
Dim lngCount As Long
Dim wksZiel As Worksheet
Dim wbkQuelle As Workbook
Dim lngZielSpalte As Long

varFileNames = Application _
.GetOpenFilename("PICS-Regeldateien (*.prf), *.prf", 1, "Datei wählen", , True) 'Filenamen holen
If VarType(varFileNames) = vbBoolean Then 'bei Abbruch
MsgBox "Keine Datei gewählt!" 'kleine Meldung
Exit Sub 'Makro Ende
End If

Application.ScreenUpdating = False
'Bildschirmaktualisierung aus

Set wksZiel = ThisWorkbook.Worksheets("Tabelle1")
'ZielTabelle !anpassen! und "merken"
'ggf. hier gesamten Zielbereich löschen
'With wksZiel
'.Range(.Range("A5"), .Range("A5").SpecialCells(xlCellTypeLastCell)).clearContents
'End With
For lngCount = LBound(varFileNames) To UBound(varFileNames) Step 1
'vom ersten bis zum letzten File
'MsgBox ("File " & varFileNames(lngCount) & " wird verarbeitet")
'===========
'PSEUDOCODE
'===========
'EinfügeZielRange ermitteln (1.=A5, 2.=D5, 3.=G5, ...?)
lngZielSpalte = (lngCount - 1) + 3
'File öffnen (Workbooks.OpenText Filename:=varfilenames(lngCount), Origin:= ...)
Workbooks.OpenText FileName:=varFileNames(lngCount), StartRow:=6, Tab:=True, Comma:=True



Set wbkQuelle = ActiveWorkbook
'Range kopieren
wbkQuelle.ActiveSheet.Range("B1:B900").Copy
'in ZielRange einfügen
wksZiel.Cells(3, lngZielSpalte).PasteSpecial Paste:=xlValues
Application.CutCopyMode = False
'geöffnetes File Schliessen
wbkQuelle.Close
Next lngCount
'nächstes File der Auswahl

Application.ScreenUpdating = True
'Bildschirmaktualisierung ein
ThisWorkbook.Activate
wksZiel.Select
wksZiel.Range("C3").Select

Set wksZiel = Nothing
Set wbkQuelle = Nothing
End Sub

ich freue mich schon auf vorschläge!
vielen dank und freundliche grüße
harald

6 Antworten

0 Punkte
Beantwortet von nighty Experte (6.6k Punkte)
hi harald

aus - soll + werden wenn ich dich richtug verstanden habe ?

prüfe das erste zeichen mit isnumeric auf true/false

gruss nighty
0 Punkte
Beantwortet von
hallo nighty,

danke schonmal für hilfe. aus - soll + werden, richtig.
allerdings ist mein problem wie der code aussehen muss damit die file mit der endung "_n" gefunden wird und dann im bereich B2 - B900 die umrechung *(-1) stattfindet..

ich hoffe du hast ne idee!

gruß harald
0 Punkte
Beantwortet von beverly Experte (3.5k Punkte)
Hi Harald,

mittels
If InStr(varFileNames, "_n") > 0 Then

kannst du die negativen Files feststellen.

Um die negativen Daten umzuwandeln würde ich den eingefügten Bereich mit -1 multiplizieren, indem du -1 in eine Zelle schreibst, diese kopierst, den umzuwandelnden Bereich markierst und dann auf Bearbeiten -> Inhalte Einfügen -> Multiplizieren gehst (das kannst du mit dem Makrorekorder aufzeichnen).

Bis später,
Karin
0 Punkte
Beantwortet von
hallo karin und alle anderen die mir helfen wollen,

danke schonmal für diesen tipp! jedoch tu ich mich etwas schwer das ganze zu realisieren.
nachdem die spalte mit dem filenamen "_n" eingefügt wurde sollten alle werte mit (-1) multipliziert werden. den faktor kann ich aber nicht in mein tabellenblatt reinschreiben da ich sonst probleme habe dieses tabellenwert in ein program zu laden.. die spalten und zeilen struktur kann ich nicht um eine zelle erweitern.
aber es gibt doch bestimmt einen code mit dem ich die kopierte spalte gleich mit einem fest vorgegeben wert mutliplizieren kann und dann erst einfüge, oder?
ich bin sehr unerfahren in vba ;)
in laiensprache:

If InStr(varFileNames, "_n") > 0
Then "multipliziere alle werte dieser spalte mit (-1) und füge sie dann in ZielRange ein."
End
:)

danke und schöne grüße
harald
0 Punkte
Beantwortet von beverly Experte (3.5k Punkte)
Hi Harald,

verstehe leider nicht ganz, wo dabei das Problem ist - die eingetragene -1 kannst du doch anschließend wieder löschen.

- andere Möglichkeit: führe die Multiplikation - wie beschrieben - in der Arbeitsmappe aus, aus der du kopierst und beim Schließen dann einfach nicht speichern.

- weitere Möglichkeit (wegen der Dauer nicht unbedingt zu empfehlen): du überträgst in einer Schleife jede Zelle einzeln und multiplizierst sie dabei mit -1.

- noch eine Möglichkeit: lies die Daten auf einen Ritt in ein Array, multipliziere in einer Schleife jedes Arrayfeld mit -1 und trage dann das geänderte Array in einem Ritt in die Zellen ein (ist etwas schneller als die vorhergehende Methode)

Bis später,
Karin
0 Punkte
Beantwortet von nighty Experte (6.6k Punkte)
hi all :-)

ein beispiel

gruss nighty

zwei variablen waeren anzupassen

DeinSpaltenIndex = 1
DeinMultiplikator = -1

Option Explicit
Sub MeinMakro()
Dim DeinSpaltenIndex As Long
Dim ZeilenIndex As Long
Dim LetzteZeileSpA As Long
Dim DeinMultiplikator As Long
DeinSpaltenIndex = 1
DeinMultiplikator = -1
LetzteZeileSpA = ActiveSheet.Cells(Rows.Count, DeinSpaltenIndex).End(xlUp).Row
ReDim ArrInn(1 To LetzteZeileSpA, 1 To 1) As Variant
ArrInn() = Range(Cells(2, DeinSpaltenIndex), Cells(LetzteZeileSpA, DeinSpaltenIndex))
For ZeilenIndex = 1 To UBound(ArrInn)
ArrInn(ZeilenIndex, 1) = ArrInn(ZeilenIndex, 1) * DeinMultiplikator
Next
Range(Cells(2, DeinSpaltenIndex), Cells(LetzteZeileSpA, DeinSpaltenIndex)).Resize(UBound(ArrInn())) = ArrInn()
End Sub
...