VBA Spalte invertieren
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
Antwort schreiben
Antwort 1 von nighty vom 30.06.2022, 09:36 Options
hi harald
aus - soll + werden wenn ich dich richtug verstanden habe ?
prüfe das erste zeichen mit isnumeric auf true/false
gruss nighty
Antwort 2 von 123harald123 vom 30.06.2022, 10:10 Options
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
Antwort 3 von Beverly vom 30.06.2022, 11:46 Options
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
Antwort 4 von 123harald123 vom 01.07.2022, 10:46 Options
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
Antwort 5 von Beverly vom 01.07.2022, 11:28 Options
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
Antwort 6 von nighty vom 01.07.2022, 14:59 Options
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