VBA基于单元格内容的操作

时间:2016-05-19 02:58:23

标签: excel-vba vba excel

我正在尝试整理我复制到Excel工作表中的信息,以便我可以更好地对其进行分类。它从一个列开始,如大纲,但没有项目符号,我想把子信息放在主要信息旁边的列中。

宏观目的:
来自:

SUM函数

SUM的描述

IF功能

IF功能描述

日期功能

DATE功能说明

DATE功能的第二个描述

DAYS功能

DAYS功能说明

FIND,FINDB函数

FIND,FINDB的描述

INDEX功能

INDEX功能描述

到:

SUM函数。 。 。 。 。 。 。 。 SUM的描述 IF功能。 。 。 。 。 。 。 。 。 。 。 IF功能描述
DATE功能。 。 。 。 。 。 。 。 DATE功能的说明
 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 DATE功能的第二个描述
DAYS功能。 。 。 。 。 。 。 。 DAYS功能的说明
FIND,FINDB功能。 FIND,FINDB的描述
INDEX功能。 。 。 。 。 。 。 INDEX功能的说明

我认为我的工作应该有效,但在尝试将子信息转换为正确时,我会一直收到错误91或1004。

问题代码:

' 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

我刚开始学习VBA,所以我的代码可能是基本的,但我认为我的问题是“.find”不是布尔表达式,我不知道一个等效的布尔函数,或者如何将其转换为一个。

也许有办法一次完成所有操作,而不是使用“for,to,next”功能,但我不知道如何开始。

完整代码:

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    

另外,正如我正在学习的那样,如果您对如何提高我的代码效率(改进它)有所了解,或者如果您注意到我不知道编程有任何细微差别,我会很高兴听到它

我刚刚意识到并非所有代码都按照我的想法行事。它不是查看整个选择,而是仅查看活动单元格。我尝试将“IsEmpty(ActiveCell)”替换为“IsEmpty(Selection)”,但它会像所有内容都包含文本一样。但实际上,如果有两组子信息,那么第二个子信息将被删除。 (示例的第四行将被删除)

'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

1 个答案:

答案 0 :(得分:0)

通过避免select语句可以更简单地完成此操作。通常,在Excel中操作事物时,您希望避免使用Select,因为它会降低速度,并且会使代码难以维护。

以下代码循环遍历A列中的前500行。如果找到空行,则删除该行。在这种简单的情况下,我只测试了细胞A + B是否都是空的。如果row不为空,则检查前三个字母是否大写。如果不是,则它必须是描述行,因此它将单元格内容移动到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

您的代码无法运行的原因是因为您尝试将find函数(返回范围)用作布尔值(true / false)。然而,即使在修复该问题之后,它仍然无法按预期工作,因为它会将其中包含“function”一词的任何描述视为函数名称。