我正在尝试整理我复制到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
答案 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”一词的任何描述视为函数名称。