能否根据单元格内容调整excel宏?

能否根据单元格内容调整excel宏?,excel,vba,ms-office,Excel,Vba,Ms Office,为了工作,我下载了一系列电子表格,其中一个单元格列中有测验名称。每个测验通常有5-10次尝试,电子表格中报告了大约10次测验 我有一个宏,可以按测验名称对数据进行排序,以便将尝试分组在一起,但我想在每个分组之前和之后添加一个空格,以便将不同的测验分开。你能用宏来做这个吗 例如,如果我有: Quiz Name 1 Quiz Name 1 Quiz Name 1 Quiz Name 2 Quiz Name 2 Quiz Name 2 我可以有一个宏来识别测验名称的更改位置并添加一个空格,使其看起来

为了工作,我下载了一系列电子表格,其中一个单元格列中有测验名称。每个测验通常有5-10次尝试,电子表格中报告了大约10次测验

我有一个宏,可以按测验名称对数据进行排序,以便将尝试分组在一起,但我想在每个分组之前和之后添加一个空格,以便将不同的测验分开。你能用宏来做这个吗

例如,如果我有:

Quiz Name 1
Quiz Name 1
Quiz Name 1
Quiz Name 2
Quiz Name 2
Quiz Name 2
我可以有一个宏来识别测验名称的更改位置并添加一个空格,使其看起来像:

Quiz Name 1
Quiz Name 1
Quiz Name 1
-blank row-
Quiz Name 2
Quiz Name 2
Quiz Name 2

我可以用宏添加一行,但我不知道如何调整它。任何帮助都将不胜感激。

是的。可以根据单元格内容调整excel宏的条件,也可以使用宏来识别测验名称的更改位置并添加空格

注意:这不是一个聪明的答案,只是简单地给出了问题和措辞,我的印象是,也许OP只是想知道这是否可行,然后才尝试自己去做

因为我很多时候都想知道某件事是否可能,但随后我自己尝试找出它是如何可能的,然后在我找到它之后,我然后尝试研究其他人是如何做的,并将其与我自己的代码进行比较。我觉得当我用这种方式做事时,我对事情的运作方式和原因有了更好的理解。而不是仅仅知道这一点就可以实现

以下是一些帮助代码:

Sub InsertRowAtChange()

Dim CurrentValue As String
Dim Lastinstance As Long
Dim CurrentCell As Range


CurrentValue = Range("A1").Value
Set CurrentCell = Range("A1")

Do While CurrentValue <> ""

    Lastinstance = Range("A:A").Find(What:=CurrentValue, After:=CurrentCell, LookIn:=xlFormulas, LookAt:= _
        xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row

      Set CurrentCell = Range("A" & Lastinstance + 1)
      CurrentValue = CurrentCell

      Rows(Lastinstance + 1).Insert

Loop


End Sub 
Sub InsertRowAtChange()
将当前值设置为字符串
尽可能长
小电流单元作为量程
CurrentValue=范围(“A1”)。值
设置当前单元格=范围(“A1”)
在当前值“”时执行此操作
Lastinstance=Range(“A:A”).Find(What:=CurrentValue,After:=CurrentCell,LookIn:=xlFormulas,LookAt:=_
xlWhole,SearchOrder:=xlByRows,SearchDirection:=xlPrevious)。行
设置CurrentCell=Range(“A”&Lastinstance+1)
CurrentValue=CurrentCell
行(Lastinstance+1)。插入
环
端接头
另外一个选项是,如果你不喜欢循环,你更愿意使用所有内置的Excel函数和公式来完成工作

Sub InsertRowAtChange2()

Dim DataRange As Range
Dim LastRow As Long


LastRow = Range("B1048576").End(xlUp).Row

Set DataRange = Range("B2", Range("B" & LastRow))

With DataRange

     .EntireColumn.Insert 'Add a temp column for a formula

     .Offset(0, -1).FormulaR1C1 = "=IF(AND(NOT(ISNA(R[-1]C)),R[-1]C[1]<>RC[1]),1,"""")"

     .Offset(0, -1) = .Offset(0, -1).Value 'Remove Formulas

     Set DataRange = .Offset(0, -1).SpecialCells(xlCellTypeConstants, xlNumbers) 'Numbers represent changes in rows

 End With

 'Add a row at each change in data

 If WorksheetFunction.Count(DataRange) > 0 Then

    DataRange.EntireRow.Insert

 End If

     'Delete Temp Column

     DataRange.Columns(1).EntireColumn.Delete



On Error GoTo 0

Set DataRange = Nothing

End Sub
Sub InsertRowAtChange2()
变暗数据范围作为范围
最后一排一样长
LastRow=范围(“B1048576”)。结束(xlUp)。行
设置数据范围=范围(“B2”,范围(“B”和最后一行))
使用数据范围
.EntRecolumn.Insert'为公式添加临时列
.Offset(0,-1)。公式1c1=“=IF(AND(NOT(ISNA(R[-1]C)),R[-1]C[1]RC[1]),1,“”“
.Offset(0,-1)=.Offset(0,-1).Value“删除公式”
设置数据范围=.Offset(0,-1)。特殊单元格(xlCellTypeConstants,xlNumbers)的数字表示行中的更改
以
'在每次数据更改时添加一行
如果WorksheetFunction.Count(数据范围)>0,则
DataRange.EntireRow.Insert
如果结束
'删除临时列
DataRange.Columns(1).entireclumn.Delete
错误转到0
设置数据范围=无
端接头

编辑要过滤的第二列

列号是单元格(x,y)表示法的第二部分,其中行是第一行,因此它在指定为列y的所有行中循环,因此将其更改为2将给出正确的结果

Sub insertrows()
Dim lastrow As Integer
lastrow = Worksheets("Sheet1").Cells(Rows.Count, 2).End(xlUp).Row
For i = lastrow To 2 Step -1
If Cells(i, 2).Value <> Cells(i - 1, 2).Value Then
Rows(i).Insert
End If
Next i
End Sub
子插入行()
将最后一行设置为整数
lastrow=工作表(“Sheet1”)。单元格(Rows.Count,2)。结束(xlUp)。行
对于i=最后一行到2步骤-1
如果单元格(i,2).值单元格(i-1,2).值则
第(i)行。插入
如果结束
接下来我
端接头
这个怎么样

Sub insertrows()
Dim lastrow As Integer
lastrow = Worksheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row
For i = lastrow To 2 Step -1
If Cells(i, 1).Value <> Cells(i - 1, 1).Value Then
Rows(i).Insert
End If
Next i
End Sub
子插入行()
将最后一行设置为整数
lastrow=工作表(“Sheet1”)。单元格(Rows.Count,1)。结束(xlUp)。行
对于i=最后一行到2步骤-1
如果单元格(i,1).值单元格(i-1,1).值则
第(i)行。插入
如果结束
接下来我
端接头
子组_2()
最后一排一样长
我想我会坚持多久
昏暗的街道,只要你乞求
昏暗的一排(尾端一样长)
I=1
对于I=1到10000
如果单元格(I,1).Value=-1,则
LASTROW=I-1
如果结束
下一个
行_=0
行结束=0
对于I=1到最后一行
如果(单元格(I,1)。值=2或单元格(I,1)。值=3或单元格(I,1)。值=4或单元格(I,1)。值=5或单元格(I,1)。值=6或单元格(I,1)。值=7或单元格(I,1)。值=8或单元格(I,1)。值=9或单元格(I,1)。值=10),则
如果(第0行),则
行_End=I
如果结束
其他的
第四行=I+1
如果结束
如果((第0行)和(第0行结束)),则
行(行Beg&“:”&行结束)。组
ROW_Beg=ROW_Beg+1
行结束=0
如果结束
接下来我
行_=0
行结束=0
对于I=1到最后一行
如果(单元格(I,1)。值=3或单元格(I,1)。值=4或单元格(I,1)。值=5或单元格(I,1)。值=6或单元格(I,1)。值=7或单元格(I,1)。值=8或单元格(I,1)。值=9或单元格(I,1)。值=10),则
如果(第0行),则
行_End=I
如果结束
其他的
第四行=I+1
如果结束
如果((第0行)和(第0行结束)),则
行(行Beg&“:”&行结束)。组
ROW_Beg=ROW_Beg+1
行结束=0
如果结束
接下来我
行_=0
行结束=0
对于I=1到最后一行
如果(单元格(I,1)。值=4或单元格(I,1)。值=5或单元格(I,1)。值=6或单元格(I,1)。值=7或单元格(I,1)。值=8或单元格(I,1)。值=9或单元格(I,1)。值=10),则
如果(第0行),则
行_End=I
如果结束
其他的
第四行=I+1
如果结束
如果((第0行)和(第0行结束)),则
行(行Beg&“:”&行结束)。组
ROW_Beg=ROW_Beg+1
行结束=0
如果结束
接下来我
行_=0
行结束=0
对于I=1到最后一行
如果(单元格(I,1).值=5或单元格(I,1).值=6或单元格(I,1).值=7或单元格(I,1).值=8或单元格(I,1).值=9或单元格(I,1).值=10),则
如果(第0行),则
行_End=I
如果结束
其他的
第四行=I+1
如果结束
如果((第0行)和(第0行结束)),则
行(行Beg&“:”&行结束)。组
罗乌贝格酒店
Sub Group_2()
Dim LASTROW As Long
Dim I As Long
Dim ROW_Beg As Long
Dim ROW_End As Long
I = 1
For I = 1 To 10000
    If Cells(I, 1).Value = -1 Then
        LASTROW = I - 1
    End If
Next

ROW_Beg = 0
ROW_End = 0

For I = 1 To LASTROW
    If (Cells(I, 1).Value = 2 Or Cells(I, 1).Value = 3 Or Cells(I, 1).Value = 4 Or Cells(I, 1).Value = 5 Or Cells(I, 1).Value = 6 Or Cells(I, 1).Value = 7 Or Cells(I, 1).Value = 8 Or Cells(I, 1).Value = 9 Or Cells(I, 1).Value = 10) Then
        If (ROW_Beg <> 0) Then
            ROW_End = I
        End If
    Else
        ROW_Beg = I + 1
    End If
    If ((ROW_Beg <> 0) And (ROW_End <> 0)) Then
        Rows(ROW_Beg & ":" & ROW_End).Group
        ROW_Beg = ROW_Beg + 1
        ROW_End = 0
    End If
Next I


ROW_Beg = 0
ROW_End = 0
    For I = 1 To LASTROW
    If (Cells(I, 1).Value = 3 Or Cells(I, 1).Value = 4 Or Cells(I, 1).Value = 5 Or Cells(I, 1).Value = 6 Or Cells(I, 1).Value = 7 Or Cells(I, 1).Value = 8 Or Cells(I, 1).Value = 9 Or Cells(I, 1).Value = 10) Then
        If (ROW_Beg <> 0) Then
            ROW_End = I
        End If
    Else
        ROW_Beg = I + 1
    End If
    If ((ROW_Beg <> 0) And (ROW_End <> 0)) Then
        Rows(ROW_Beg & ":" & ROW_End).Group
        ROW_Beg = ROW_Beg + 1
        ROW_End = 0
    End If
Next I

ROW_Beg = 0
ROW_End = 0
    For I = 1 To LASTROW
    If (Cells(I, 1).Value = 4 Or Cells(I, 1).Value = 5 Or Cells(I, 1).Value = 6 Or Cells(I, 1).Value = 7 Or Cells(I, 1).Value = 8 Or Cells(I, 1).Value = 9 Or Cells(I, 1).Value = 10) Then
        If (ROW_Beg <> 0) Then
            ROW_End = I
        End If
    Else
        ROW_Beg = I + 1
    End If
    If ((ROW_Beg <> 0) And (ROW_End <> 0)) Then
        Rows(ROW_Beg & ":" & ROW_End).Group
        ROW_Beg = ROW_Beg + 1
        ROW_End = 0
    End If
Next I

ROW_Beg = 0
ROW_End = 0
    For I = 1 To LASTROW
    If (Cells(I, 1).Value = 5 Or Cells(I, 1).Value = 6 Or Cells(I, 1).Value = 7 Or Cells(I, 1).Value = 8 Or Cells(I, 1).Value = 9 Or Cells(I, 1).Value = 10) Then
        If (ROW_Beg <> 0) Then
            ROW_End = I
        End If
    Else
        ROW_Beg = I + 1
    End If
    If ((ROW_Beg <> 0) And (ROW_End <> 0)) Then
        Rows(ROW_Beg & ":" & ROW_End).Group
        ROW_Beg = ROW_Beg + 1
        ROW_End = 0
    End If
Next I

    ROW_Beg = 0
ROW_End = 0
    For I = 1 To LASTROW
    If (Cells(I, 1).Value = 6 Or Cells(I, 1).Value = 7 Or Cells(I, 1).Value = 8 Or Cells(I, 1).Value = 9 Or Cells(I, 1).Value = 10) Then
        If (ROW_Beg <> 0) Then
            ROW_End = I
        End If
    Else
        ROW_Beg = I + 1
    End If
    If ((ROW_Beg <> 0) And (ROW_End <> 0)) Then
        Rows(ROW_Beg & ":" & ROW_End).Group
        ROW_Beg = ROW_Beg + 1
        ROW_End = 0
    End If
Next I

    ROW_Beg = 0
ROW_End = 0
    For I = 1 To LASTROW
    If (Cells(I, 1).Value = 7 Or Cells(I, 1).Value = 8 Or Cells(I, 1).Value = 9 Or Cells(I, 1).Value = 10) Then
        If (ROW_Beg <> 0) Then
            ROW_End = I
        End If
    Else
        ROW_Beg = I + 1
    End If
    If ((ROW_Beg <> 0) And (ROW_End <> 0)) Then
        Rows(ROW_Beg & ":" & ROW_End).Group
        ROW_Beg = ROW_Beg + 1
        ROW_End = 0
    End If
Next I

    ROW_Beg = 0
ROW_End = 0
    For I = 1 To LASTROW
    If (Cells(I, 1).Value = 8 Or Cells(I, 1).Value = 9 Or Cells(I, 1).Value = 10) Then
        If (ROW_Beg <> 0) Then
            ROW_End = I
        End If
    Else
        ROW_Beg = I + 1
    End If
    If ((ROW_Beg <> 0) And (ROW_End <> 0)) Then
        Rows(ROW_Beg & ":" & ROW_End).Group
        ROW_Beg = ROW_Beg + 1
        ROW_End = 0
    End If
Next I

    ROW_Beg = 0
ROW_End = 0
    For I = 1 To LASTROW
    If (Cells(I, 1).Value = 9 Or Cells(I, 1).Value = 10) Then
        If (ROW_Beg <> 0) Then
            ROW_End = I
        End If
    Else
        ROW_Beg = I + 1
    End If
    If ((ROW_Beg <> 0) And (ROW_End <> 0)) Then
        Rows(ROW_Beg & ":" & ROW_End).Group
        ROW_Beg = ROW_Beg + 1
        ROW_End = 0
    End If
Next I


    ROW_Beg = 0
ROW_End = 0
    For I = 1 To LASTROW
    If (Cells(I, 1).Value = 10) Then
        If (ROW_Beg <> 0) Then
            ROW_End = I
        End If
    Else
        ROW_Beg = I + 1
    End If
    If ((ROW_Beg <> 0) And (ROW_End <> 0)) Then
        Rows(ROW_Beg & ":" & ROW_End).Group
        ROW_Beg = ROW_Beg + 1
        ROW_End = 0
    End If
Next I
End Sub