2016-05-19 6 views
0

Ich versuche Informationen zu organisieren, die ich in ein Excel-Blatt kopiert habe, so dass ich es besser sortieren kann. Es beginnt in einer Spalte wie ein Umriss, aber ohne Kugeln, und ich möchte die Unterinformationen in Spalten neben den Hauptinformationen einfügen.VBA-Aktionen basierend auf Zelleninhalt

Makro Zweck:
Von:


Funktion SUMME

Beschreibung von SUM

IF Funktion

Beschreibung der IF-Funktion

Funktion DATUM

Beschreibung der Funktion DATUM

Zweite Beschreibung der Funktion DATUM

DAYS-Funktion

Beschreibung der DAYS-Funktion

FIND, FINDB Funktionen

Beschreibung von FI ND, FINDB

INDEX Funktion

Beschreibung der Funktion INDEX


An:


SUM-Funktion. . . . . . . . Beschreibung der SUM
IF-Funktion. . . . . . . . . . . Beschreibung der IF-Funktion
Funktion DATE. . . . . . . . Beschreibung der DATE-Funktion
. . . . . . . . . . . . . . . . . . . . Zweite Beschreibung der Funktion DATE
Funktion DAYS. . . . . . . . Beschreibung der Funktion DAYS
Funktionen FIND, FINDB. Beschreibung von FIND, FINDB
INDEX-Funktion. . . . . . . Beschreibung der Funktion INDEX


Ich denke, was ich habe, sollte funktionieren, aber ich erhalte immer entweder einen Fehler 91 oder 1004 beim Versuch, die Unterinfo rechts zu verschieben.

Problem Code:

' Shift sub-info right 
Dim r As Integer 
Dim find As String 
find = "* function" 

Range("A1").Select 
For r = 1 To row1 
    If Range(ActiveCell).find(What:=find, Lookat:=xlWhole).Select Then 
     ActiveCell.Offset(1).Select 
    Else 
     ActiveCell.Insert (xlShiftToRight) 
     ActiveCell.Offset(1).Select 
    End If 
Next r 

Ich beginne gerade VBA zu lernen, so kann mein Code elementar sein, aber ich denke, dass meine Probleme ist, dass „.find“ kein boolean Ausdruck ist und ich kenne keine äquivalente Funktion, die boolesch ist, oder wie man sie in eine umwandeln kann.

Vielleicht gibt es eine Möglichkeit, alles auf einmal zu tun, anstatt "für, zu, nächste" -Funktion zu verwenden, aber ich hätte keine Ahnung, wie ich anfangen soll.

Voll Code:

Sub Shift_Over() 

Dim row As Integer 
row = 1 
Dim n As Integer 

'Locate last used cell 
Range("A1:A8").Select 
Do While Not IsEmpty(ActiveCell) 
    ActiveCell.Offset(8).Select 
    Range(ActiveCell, ActiveCell.Offset(7)).Select 
    row = row + 8 
Loop 

Rows(row).Select 

Do While IsEmpty(ActiveCell) 
    Rows(row - 1).Select 
    row = row - 1 
Loop 

' Remove unneded rows 
Dim row1 As Integer 
row1 = 1 

For n = 1 To row - 1 
    If Not IsEmpty(ActiveCell) Then 
     Rows(row - 1).Select 
     row = row - 1 
     row1 = row1 + 1 
    Else 
     Rows(row).Delete 
     Rows(row - 1).Select 
     row = row - 1 
    End If 
Next n 

' Check value of row1 
Rows(row1).Select 

' Shift sub-info right 
Dim r As Integer 
Dim find As String 
find = "* function" 

Range("A1").Select 
For r = 1 To row1 
    If Range(ActiveCell).find(What:=find, Lookat:=xlWhole).Select Then 
     ActiveCell.Offset(1).Select 
    Else 
     ActiveCell.Insert (xlShiftToRight) 
     ActiveCell.Offset(1).Select 
    End If 
Next r 

'move sub-info in line with main-info 
Range("B1").Delete (xlShiftUp) 
Dim row2 As Integer 
row2 = row1 + 5 

Rows(row2).Select 
Do While IsEmpty(ActiveCell) 
    Rows(row2 - 1).Select 
    row2 = row2 - 1 
Loop 

'remove unneeded rows 
Dim d As Integer 
Dim lines As Integer 
lines = 1 

For r = 1 To row2 - 1 
    If Not IsEmpty(ActiveCell) Then 
     Rows(row2 - 1).Select 
     row2 = row2 - 1 
     lines = lines + 1 
    Else 
     Rows(row2).Delete 
     Rows(row2 - 1).Select 
     row2 = row2 - 1 
    End If 
Next r 

End Sub  

Auch, wie ich lerne, wenn Sie Ideen, wie mein Code effizienter (verbessern sie) zu machen, oder wenn es irgendwelche Nuancen über die Programmierung, die Sie Ich weiß es nicht, ich würde mich freuen, es zu hören.

Ich habe gerade festgestellt, dass nicht alle meine Code tut, was ich dachte, es würde. Anstatt die gesamte Auswahl zu betrachten, wird nur die aktive Zelle betrachtet. Ich habe versucht, "IsEmpty (ActiveCell)" durch "IsEmpty (Selection)" zu ersetzen, aber es würde so tun, als ob alles Text darin hätte. Wie auch immer, wenn zwei Unterinformationen vorhanden sind, wird die zweite gelöscht. (Die vierte Zeile des Beispiels würde gelöscht.)

'remove unneeded rows 
Dim d As Integer 
Dim lines As Integer 
lines = 1 

For r = 1 To row2 - 1 
    If Not IsEmpty(ActiveCell) Then 
     Rows(row2 - 1).Select 
     row2 = row2 - 1 
     lines = lines + 1 
    Else 
     Rows(row2).Delete 
     Rows(row2 - 1).Select 
     row2 = row2 - 1 
    End If 
Next r 
+0

Was unterscheidet die Funktionsnamen von den Funktionsbeschreibungen? Zum Beispiel, haben nur die Funktionsnamen die Wortfunktion in ihnen? –

+0

Die tatsächliche Beschreibung war zu lang, um alle einzufügen, aber ein Beispiel ist "SUM Funktion" - "Verwenden Sie diese Funktion, um die Werte in Zellen hinzuzufügen." Sie haben alle das erste Wort in Großbuchstaben gefolgt von dem einzelnen Wort "Funktion". Ich habe versucht, die Suchfunktion zu beschränken, indem ich "xlWhole" anstelle von "xlParts" verwendete. –

+0

Ok, also beginnen die Funktionsnamen immer mit mindestens drei Großbuchstaben? Sind in den Daten leere Zeilen vorhanden? –

Antwort

0

Dies kann viel einfacher durch Vermeidung der Select-Anweisung erfolgen. Im Allgemeinen, wenn Sie Dinge in Excel manipulieren, möchten Sie Select vermeiden, weil es die Dinge verlangsamt und Ihren Code schwerer zu pflegen macht.

Der folgende Code durchläuft die ersten 500 Zeilen in Spalte A. Wenn er eine leere Zeile findet, löscht er diese Zeile. In diesem vereinfachten Fall habe ich gerade getestet, ob die Zellen A + B beide leer waren. Wenn die Zeile nicht leer ist, prüft sie, ob die ersten drei Buchstaben groß geschrieben sind. Wenn sie es nicht sind, müssen sie eine Beschreibung Reihe sein, so dass er sich bewegt, um die Zellinhalte der Spalte B

Sub Shift_Over2() 
    Dim i As Integer 
    For i = 500 To 1 step -1 
     If Range("A" & i).Value = "" And Range("B" & i).Value = "" Then 
      Rows(i).Delete 
     ElseIf UCase(Left(Range("A" & i).Value, 3)) <> Left(Range("A" & i).Value, 3) Then 
      Range("B" & i).Value = Range("A" & i).Value 
      Range("A" & i).Value = "" 
     End If 
    Next i 
End Sub 

Der Grund dafür könnte der Code nicht ausgeführt wurde, weil Sie die Suchfunktion zu benutzen versuchten (die gibt einen Bereich als Boolean (true/false) zurück. Aber auch nach der Behebung dieses Problems funktionierte es immer noch nicht wie beabsichtigt, da es jede Beschreibung behandeln würde, die das Wort "function" als Funktionsnamen enthielt.