精华内容
下载资源
问答
  • 最近的项目中,用到了很多Excel的VBA宏功能,用户的新需求也有很多需要用VBA宏来实现。为满足业务需求, 自己搜索网上的相关资料,尝试不同的解决方法,最终解决了用户的需求,在此记录下来,做一个总结,也希望能...

            最近的项目中,用到了很多Excel的VBA宏功能,用户的新需求也有很多需要用VBA宏来实现。为满足业务需求,

    自己搜索网上的相关资料,尝试不同的解决方法,最终解决了用户的需求,在此记录下来,做一个总结,也希望能给

    别的网友有所帮助。

            首先用户的第一个需求,是Excel WorkSheet中原有的行不可删除,只能修改某些栏位。用户可以新插入行,而新插入

    的行可以删除。如下图所示:

             2001,2002,2003和2004四行数据 不允许删除,而Inserted这行数据是后来插入的,可以删除。

            Excel可以整个sheet锁定,却没有按行锁定,而且即使能按行锁定,由于存在插入删除,行序会动态变化,

    锁定位置也无法固定。所以必须用锁定以外的方法来解决。

            首先想到的就是监听Worksheet的插入和删除事件。如果插入删除都有响应事件,那在事件中做拦截处理就

    很容易实现功能了。可惜的是,Excel虽然功能无比强大,但是worksheet的响应事件却并不丰富,仅有一个change

    事件,能响应所有的worksheet中改变内容的操作,其他事件似乎都不太有用:

     

             还好,在网上搜到了在这个事件中判断整行插入和删除的方法:

             '选择了一整行
            If Target.Address Like "$#*:$#*" Then

            但是这只能判断出是整行选择,至于是插入还是删除,就得自己去区别处理了。

             插入比较简单,Target.row所指向的是一个空行,而且已经存在于Excel中了,所以直接判断第一个单元格为空就好:

              '如果TargetRow的第一列值为空,且不是最后一行,说明是插入
                'Sheet1.UsedRange.Row 表示有数据的开始行序,Sheet1.UsedRange.Rows.Count 表示有数据的行数,二者相加就是最后一行序
                If (Trim(Sheet1.Cells(Target.Row, 1).Value) = "" And _
                    Target.Row <> (Sheet1.UsedRange.Row + Sheet1.UsedRange.Rows.Count)) Then

              之所以要区分是否最后一行,因为在最后一行插入时,插入前选中的行也就是插入位置本身就是空行,而在其他位置插入,

    插入位置不是空行,所以需要特别区分。

             而删除操作就比较麻烦,因为Worksheet_change的Target参数中,没有任何关于被删除行的信息,而且当事件发生时,删除行

    已经从Excel中移除,Target.row指向的是一个新行。所以就需要提前把删除行的信息在选择事件中记录下来:

    '在Slection change 事件中,保存选择的行号和第一列的值
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
        selectedRow = Target.Row
        selectedId = Sheet1.Cells(Target.Row, 1).Value
    End Sub

              这样,在change事件中,就可以取得删除行的selectedId,如果是新插入的数据,第一列值就是Inserted,可以删除;否则,就是

    原有的数据,不允许删除:

           当然,要完整实现用户功能,还需要增加一些完善措施,例如多行选中的剔除:

           '如果选择多于一行
        If (Selection.Rows.Count > 1) Then
            MsgBox "Only allowed select one row"
            Application.Undo
        Else

           还有禁止首行插入,首列标记的约定等。具体可以看实现代码。

           第二个需求是插入单元格后,能自动合并。如下图所示:

     

         插入新城市之后,省份要自动合并。这里,继续沿用上面的方法,在Worksheet的change事件中,进行处理:

               这里只处理了插入行的合并,对于删除行需要的合并,可以参照第一个需求,采用首列标记的做法来区别处理。

               合并单元格时,需要区分插入的位置,合并单元格中间插入的,无需合并;合并单元格末尾插入的,需要调整

    合并单元格大小;而在整个表格最后插入的,除了调整合并单元格大小外,还需要绘制边框。

                这里引用到了在模块中定义的三个方法:findLastRow 找到当前数据的最后一行,findPrevMerge 找到需要合并

    的单元格,setRangeBorder 设置Range的边框:

             第三个需求,是需要设定单元格的条件公式自动计算。具体如下图所示:

               支出部分各个项目的值,要根据相应的收入部分,按比例拆分。例如,对于200801列,项目1的支出应该是1500 *

    1000 /(1000+900+1500)。200802没有收入,就按收入总额的占比进行拆分,所以项目1在200802的支出应该是3000*3000/

    (3000+2000+5000)。上部分收入数据发生改变后,下部分支出数据要自动拆分,所以决定用单元格的宏公式来实现。

               首先定义一个方法:

            '设置Sheet3的动态公式
            Sub setDynamicFormula()

             当然,需要先定义一个公用方法findNext,去找到收入和支出合并单元格的range,后面设定公式时,会用到这两个

    range对象。

             获取收入的range后,可以拼出汇总total收入和当期收入的公式:

        Set revRng = findNext(Sheet3, categoryCol, titleRow + 1, "收入")
         '汇总Total的公式
        sumTotal = "SUM(R" & revRng.Row & "C" & totalCol & ":R" & (revRng.Row + revRng.Rows.Count - 1) & "C" & totalCol & ")"
         '汇总收入的公式
        sumRev = "SUM(R" & revRng.Row & "C:R" & (revRng.Row + revRng.Rows.Count - 1) & "C)"

         汇总Total收入,指定的行是收入Range的所有行,列是收入Total所在列,都是绝对引用。

         汇总当期收入,行一样,列只有C,意味着取要设定公式的单元格的列。

         最后,循环对支出Range所在行的所有期间列的支出单元格,设定计算公式:

           For i = totalCol + 1 To Sheet3.UsedRange.Column + Sheet3.UsedRange.Columns.Count - 1
            For j = 0 To costRng.Rows.Count - 1
                Sheet3.Cells(costRng.Row + j, i).NumberFormatLocal = "#######.00" '保留两位小数
         
                '如果当前收入为空或为0,采用总收入占比拆分,否则用当前收入占比拆分
                Sheet3.Cells(costRng.Row + j, i).FormulaR1C1 = "=IF(OR(R[-" & rowOffset & "]C="""",R[-" & rowOffset & "]C=0)," & _
                         "R[-" & rowOffset & "]C" & totalCol & "/" & sumTotal & "*R" & totalCostRow & "C," & _
                         "R" & totalCostRow & "C*R[-" & rowOffset & "]C/" & sumRev & ")"
                        
                 Sheet3.Cells(costRng.Row + j, i).Locked = True
            Next j
        Next i  

         在这里,当前期收入的行,采用的是相对引用,当前收入的列,直接采用单元格的值,而totalCost的行,及total收入的列,

    则都采用的绝对引用。

         最后,把setDynamicFormula()方法加入到workbook的open事件中,当Excel打开时,就会自动实现单元格计算公式的赋值。

        

          示例Excel宏文件已经上传CSDN:http://download.csdn.net/download/yangdanbo1975/10205254

          由于本人是第一次搞VBA宏,水平有限,如有不妥或不完善之处,还欢迎各位网友不吝赐教,以利共同提高。

    
    展开全文
  • 试了很多代码都不行...以下是还能想起来的一些试过的(B8:S200是需要清空的区域) <code>Worksheets("sheet1").Range("B8:S200").Clear Worksheets("sheet1"... </p>
  • 目录 示例: 实现代码1: 单元格删除Delete方法 ...现在需要做统计,希望能够将这些空行批量删除,该如何用VBA实现? 日期/时间 产品 数量 2012/10/29 产品1 83 2012/10/30 产品1 184 ..

    目录

    示例:

    实现代码1:

    单元格删除Delete方法

    单元格删除的通用算法

    实现代码2

    利用Union获取整个单元格区域进行统一操作

    Union方法的注意事项

    单元格插入Insert方法


    示例:

        如图所示,该表为某公司入库流水账,由于工作人员疏忽,在记录中产生了许多空行。现在需要做统计,希望能够将这些空行批量删除,该如何用VBA实现?

    日期/时间产品数量
    2012/10/29产品183
    2012/10/30产品1184
       
    2012/11/1产品346
    2012/11/2产品397
    2012/11/3产品184
    2012/11/4产品147
       
       
    2012/11/7产品3187
    2012/11/8产品184
    2012/11/9产品2105
    2012/11/10产品2128
       
    2012/11/12产品33
    2012/11/13产品3141
    2012/11/14产品2145
    2012/11/15产品2194
    2012/11/16产品1174
    2012/11/17产品217
       
    2012/11/19产品3151
    2012/11/20产品1115
    2012/11/21产品2187
    2012/11/22产品2190
    2012/11/23产品1166
    2012/11/24产品242
    2012/11/25产品1133
    2012/11/26产品1188
    2012/11/27产品276
    2012/11/28产品3172
    2012/11/29产品320
    2012/11/30产品223
    2012/12/1产品244
    2012/12/2产品1159
    2012/12/3产品156

    实现代码1:

    Option Explicit
    
    Sub 批量删除空行1()
        Dim RowN As Long
        For RowN = Cells(Rows.Count, "A").End(xlUp).Row To 2 Step -1
            If WorksheetFunction.CountA(Intersect(Rows(RowN), Columns("A:C"))) = 0 Then
                Rows(RowN).Delete shift:=xlShiftUp
            End If
        Next
    End Sub
    

    单元格删除Delete方法

    单元格删除需要执行Delete方法,其语法为

    Rng.Delete (Shift)

        其中,Rng为所需删除的单元格。可选参数Shift可以为xIShiftToLeft(删除后右侧单元格左移)或xIShiftUp(删除后下方单元格上移)。当省略该参数时,Excel将根据Rng所表示的单元格形状进行判断。实质上,删除整行时,默认为xIShiftUp。

    单元格删除的通用算法

        批量删除行时,所执行的循环必须按照从下往上的顺序进行循环。如本例中,若按照从第2行至最后一行循环的顺序进行,将会发生以下情况:
        当RowN为8时,程序判断为空行,执行删除操作后,第8行以下所有的行均上移一行。进入下一次循环时,RowN为9时,由于原先的空行(第9行)将会变为第8行(如图所示),程序将不再进行判断。因而该方法会导致空行删除不彻底,开发者应避免此类错误的发生。

    实现代码2

    Sub 批量删除空行2()
        Dim RowN As Long
        Dim Rng As Range
        For RowN = 2 To Cells(Rows.Count, "A").End(xlUp).Row
            If WorksheetFunction.CountA(Intersect(Rows(RowN), Columns("A:C"))) = 0 Then
                If Rng Is Nothing Then
                    '若Rng未赋值,则设置Rng为当前行
                    Set Rng = Rows(RowN)
                Else
                    '若Rng已赋值,则设置Rng为当前行与原Rng的合并区域
                    Set Rng = Union(Rng, Rows(RowN))
                End If
            End If
        Next
        '若空行存在,则删除
        If Not Rng Is Nothing Then Rng.Delete shift:=xlShiftUp
        
    End Sub

    利用Union获取整个单元格区域进行统一操作

        本解决方案是单元格批量操作经常使用的手段:利用1个变量Rng表示所有需要处理的单元格的集合,然后利用Union方法不断将满足条件的单元格添加到该集合中来。

    Union方法的注意事项

        在使用Union方法时需注意,由于Rng初始值为Nothing,若参数也为Nothing,将产生如图所示的运行时错误。为避免该错误的发生,应对Rng对象进行判断,若其为Nothing,就应直接赋值,而不使用Union方法。

    单元格插入Insert方法

    与删除方法对应的是单元格插入Insert方法,其语法为

    Rng.Insert (Shift,Copyorigin)

        其中,Rng为单元格对象,该单元格对象指定了插入单元格的位置和大小,当执行插入操作后,将会在Rng所表示的单元格或单元格区域的相同位置插入相同大小的空白单元格。
        参数Shift表示Rng所表示的单元格对象在插入新单元格后的移动方向,可以为xIShiftToRight(活动单元格右移)或者xIShiftDown(活动单元格下移)。
        CopyOrigin表示插入的单元格的格式设置,可以为xlFormatFromRightOrBelow,表示新单元格格式与Rng所表示的单元格区域最下行的下一行或最右列右一列的格式相同,或者xIFormatFromLef tOrAbove,表示新单元格格式与Rng所表示的单元格最上行的上一行或最左列的左一列格式相同。
     

     

     

    展开全文
  • VBA删除如下内容,解决思路都不同 删除1列的空行(本文要做的) 删除整个区域内的空行 删除整个区域内的空格(这个一般很少有这种需求,用处不大----可用currentregion .specialcells()解决) 下...

    1 要解决的问题:删除某列中的空单元格/空行

    暂时只实现了删除一列中的空行,并没有实现多行的判断空行和删除方法。----之后再做更复杂的

    1.1 需求分析

    用VBA删除如下内容,解决思路都不同

    1. 删除1列的空行(本文要做的)
    2. 删除整个区域内的空行
    3. 删除整个区域内的空格(这个一般很少有这种需求,用处不大----可用currentregion .specialcells()解决
    4. 下面是原始数据,下面看看如何处理

    2 如果是删除全表/某区域的空单元格, 直接在当前列删除

    简洁代码:删除区域内所有空单元格 cells ---实际需要少,so用处不大

    使用 sheet.usedrange / region.currentregion .specialcells()

    • 删除,表格页面内使用区域的空格所在的行
    • 局限性就是表格的上方,左边还会存在一些空行空列,不过这个手动删下就可以了
    • 这个只是删除了空的cells 并不是删除了空行
    Sub 删空单元格()
    
     ActiveSheet.UsedRange.SpecialCells(xlCellTypeBlanks).Delete
     
    End Sub

    3 如果是删一列的空行

    3.1 代码1:基础代码,假设确认知道这列的长度,关键是倒着删

    • 熟悉 isempty() 或者用 if   xxxx=""
    • 删除单元格后,要设置属性 shift:=xlup等
    • 需要倒着删除,否则会因为一边删除行,一遍重新排列有问题
    Sub 删一列的空行()
    
       For i = 20 To 1 Step -1    '需要倒着删除
          If IsEmpty(Cells(i, 1)) Then
             Cells(i, 1).Delete shift:=xlUp
          End If
       Next i
       
    End Sub

    3.2 改进版: 先查这一列的非空最大行数

    Sub jackma_delete_row()
    
    
    For i = Range("c65536").End(xlUp).Rows To 1 Step -1
    
       If IsEmpty(Cells(i, 3)) Then
          rows(i).Delete shift:=xlUp
       End If
    
    Next i
    
    End Sub

    3.3 也可以不用 isempty()  函数,直接判断  if cells()=""

    • 直接判断 if cells(i,j) =""
    • 这种删除整行不合适  rows(i) .delete,会影响其他列的元素
    Sub ponyma_del_row1()
    
    For i = Range("c65536").End(xlUp).Row To 1 Step -1
       If Cells(i, 3) = "" Then
          Cells(i, 3).Delete
    '      Rows(i).Delete
       End If
    
    Next i
    
    End Sub
    

    3.3 如果是要先删除前面的 重复行,可以正着查询。

    
    '这次收到的需求是,要删掉相同的行里,前面的行
    Sub del_test2()
    
    
    Dim ws1 As Object
    Dim ws2 As Object
    Dim ws3 As Object
    
    Set ws1 = Worksheets("sheet1")
    Set ws2 = Worksheets("sheet2")
    Set ws3 = Worksheets("sheet3")
    
    
    'maxr1 = ws1.Range("a1").End(xlDown).Row
    
    '删行后会导致行数变少
    'End(xlDown) 最大的问题还是可能一列中间有空的,断了,查找不准
    '反过来查比较准, range("a9999").end(xlup).row
                                               
                                               
    maxr1 = 999       '其实经验发现,把这些配置值放表里出错可能性大,要么弄个控件,要么干脆放代码里
    
    For i = 1 To maxr1
    
      If WorksheetFunction.CountIf(ws1.Columns(1), ws1.Cells(i, 1)) > 1 Then
         ws1.Rows(i).Delete
      End If
    
    
    Next
    
    
    
    Debug.Print "done"
    
    End Sub

    4 不动原数据,将非空数据放到另外一列

    4.1 错误版:

    • 要明白“写入列”的循环数,明显和“输出列”的循环数 应该不同!
    • 这么写相当于 输出列 那行为空的时候,只是不往 写入列写,所以没覆盖,也是空的
    Sub jackma_delete_row2()
    
    For i = 1 To Range("c65536").End(xlUp).Rows
    
       If Not IsEmpty(Cells(i, 3)) Then
          Cells(i, 9) = Cells(i, 3)
       End If
    
    Next i
    
    End Sub
    

    4.2 正确版: 写入列/输出列,应该是单独的循环变量!

    Sub jackma_delete_row2()
    k = 1
    
    For i = 1 To Range("c65536").End(xlUp).Rows
    
       If Not IsEmpty(Cells(i, 3)) Then
          Cells(k, 9) = Cells(i, 3)
          k = k + 1
       End If
    
    Next i
    
    End Sub
    

    5 先写入数组array中,再写到其他地方,据说这样能大幅提高速度!

    把需要的筛选的数据,存在数据,然后从数组写到需要的地方,这是个好习惯

    第1版:局限性很大,没有自动查这列的 元素个数,以及 最大非空行是多少

    Sub 删除空格4()
    Dim arr1()                          '定义了一个数组,并且是动态数组,因为没指定大小
     
     
    ReDim arr1(11)                      '动态数组,使用前必须重新redim,数组大小
    j = 0                              'j=1开始,不会越界,但arr1(0)为空,因为赋值跳过了它
    For i = 1 To 11 Step 1
       If Not IsEmpty(Cells(i, 1)) Then
          arr1(j) = Cells(i, 1)
          j = j + 1
       End If
    Next i
     
     
    For j = 0 To UBound(arr1())
        Cells(j + 1, 9) = arr1(j)      '单元格得从1开始,arr(),默认得从0开始,但可以改
    Next j
     
     
    End Sub

    第2版重写

    • 注意debug.print用来监测的时候,需要注意,放在循环的位置,尤其是在k=K+1这种变化时,和放在哪个for循环之内外!
    
    Sub ponyma_array22()
    Dim arr1()  '当数组定义,且默认开始的index为0! preserve时需要有0的index
    'dim arr1 当变量定义
    
    
    k = 1
    m = 1
    
    
    ReDim arr1(0 To Application.WorksheetFunction.CountA(Range("c:c")))
    
       For i = 1 To Range("c65536").End(xlUp).Row Step 1
           If Cells(i, 3) <> "" Then
         
              Debug.Print Cells(i, 3)
              arr1(k) = Cells(i, 3)
              Debug.Print arr1(k)
              k = k + 1
    '          Debug.Print arr1(k),写在这里问题1:k已经变了,下一个k还没赋值为空,2最后的k越界
    '          循环是很精巧的,放的地方很讲究,放得不对,就错误百出
    '           Debug.Print arr1(k) 如果放在k=K+1 后,就看起来没打印出东西,因为都打印的arr1的空元素
             
           End If
       Next i
       
       For j = 1 To UBound(arr1(), 1)
           Cells(m, 10) = arr1(j)
           m = m + 1
       Next j
    
    End Sub

    第3版

    Option Explicit
    
    Sub ponyma1()
    
    
    Dim arr1()
    Dim k1, k2, k
    Dim i, j
    k1 = WorksheetFunction.CountA(Range("a:a"))
    k2 = Range("a65536").End(xlUp).Row
    Debug.Print "这列非空数据个数k1=" & k1
    Debug.Print "这列最后1个有数据的行数k2=" & k2
    
    
    'arr1(0) = 1
    'ReDim Preserve arr1(1, k)
    '这样会越界,因为你需要preserve数据。但是index系不符合
    '但是,如果不preserve 就无所谓
    '或者虽然 dim arr1() 是动态数据从index0开始,但是arr1()一直为空,preserve也不会出现index越界问题
    
    ReDim Preserve arr1(1 To k1)
    'ReDim Preserve arr1(1, k1) 这样就会越界。。。因为语法是2维数组了!
    'ReDim Preserve arr1(1 to k1) 这样就对的
    
    k = 1
    For i = 1 To k2
       If Cells(i, 1) <> "" Then
          arr1(k) = Cells(i, 1)
          Debug.Print arr1(k)
          k = k + 1
       End If
    Next i

    展开全文
  • Range(“A1:D4”).CopyRange(“E5”) Range.Delete 方法 删除对象 RANGE(“A1:D5,F2:G2”).delete 同时删除A1:D5,F2:G2,两个指定区域 Range(“1:1,8:8,12:12”).delete 同时删除第1,第8,第12 Range.Insert 方法...

    ​EXCEL是由很多的对象组成,每个对象都有他的属性和方法,所谓的对象可以理解为所有存在的东西,在同一个程序里的对象之间是存在关系的,比如说上下级关系或同级关系,上下级关系之间用英文句点“.”连接。

    例如:

    application.workbooks(1).worksheets(1).range(“A1”)

    意思就是当前应用程序(excel)下面的已经打开的第一个工作薄下面的第一个工作表里面的A1单元格,但一般情况下我们不需要这么麻烦,如果我们只对当前的表格操作,前面的都可以省略,只需要写range(“A1”)就可以了,如果我们在工作表1中要对同一个工作薄里的工作表2进行操作就要指明工作表,但不需要指定工作薄名,不指定工作薄默认是在同一个工作薄,不指定工作表,默认在同一个工作表,如果我们在第一个工作薄要去操作第二个工作薄就要指定第二个工作薄。除了可以使用数字去指定第几个工作薄或第几个工作表,我们还可以直接指定其名称,这样可以更直接知道是对哪个工作薄或工作表进行操作,前提是要知道它的名称。比如:

    workbooks(“2019年销售记录”).worksheets(“一月份销售记录”).range(“A1”)

    代表一个名为“2019年销售记录”的工作薄里面的一个名为"一月份销售记录"的工作表的A1单元格

    每个对象都有它的属性和方法,对象和属性或方法之间也是用英文的句点“.”连接,比如说一个单元格,宽度多少,高度多少,对齐方式是什么,有没边框,边框是单实线、双实线、还是虚线,有没背景色,什么背景色等,这些都是单元格的属性。我们可以对这些属性进行设置。

    例如:

    rows(1).rowheight=20 指定当前工作表第一行的行高为20磅,所以这个连接的英文句点“.”可以理解为:什么“的”什么。

    对于刚刚开始学习VBA的朋友,建议在VBA代码编辑器的立即窗口中进行练习,进入立即窗口的方法在EXCEL中同时按ALT+F11,打开代码编辑器,如果在打开的编辑器里没看到立即窗口可以按Ctrl+G或点击菜单栏的“视图”》“立即窗口”,就可以打开立即窗口,建议把代码编辑器窗口调节成下图一样,方法及时看到运行结果。

    输入代码并回车会在对应区域中显示结果
    如果当前的活动工作表是打开的第一个工作薄里的第一个工作表,那么下面这几行代码效果是完全一样的。

    Cells(1,1).value

    Range(“A1”).value

    sheets(1).cells(1,1).value=1

    worksheets(1).cells(1,1).value=1

    workbooks(1).worksheets(1).cells(1,1).value=1

    application.workbooks(1).worksheets(1).cells(1,1).value=1

    其中worksheets可以简写成sheets

    如上面的sheets(1).cells(1,1).value=1和worksheets(1).cells(1,1).value=1是完全一样的

    工作表格是EXCEL的基础,那么VBA的基础就是怎么使用VBA对表格进行操作,知道了怎么使用VBA操作当前工作表,以后再要操作其它的工作表或工作薄就容易了。以下是本人对一些基本操作的总结。都是以当前活动工作表为例。

    在指定的区域上进行写入,删除,复制,粘贴,写入公式,填充公式等等,这些都是最基本的操作。这样看来要在表格上干什么都要先指定一个区域,整个表格是表格中最大的一个区域,单元格就是表格中最小的区域,区域可以用range(“区域对象”)来表示。

    比如:

    Range(“A1”).Select 选择A1单元格

    Range(“A1:F10”).Select选择A1到F10区域

    Range(Cells(1, 1), Cells(3, 3)).select 选择A1:C3区域

    Range(“A:A”).Select选择A列

    Range(“A:F”).Select选择A-F列

    RANGE(“A1:D5,F2:G2,H:H”).Select同时选择A1:D5,F2:G2,H列三个指定区域

    Range(“1:1”).Select 选择第一行

    Range(“1:1,8:8,12:12”).Select同时选择第1,第8,第12行

    Range可以用英文中括号[]代替,可以是下面的格式

    Range(“A1”) 可以简写成 [A1]

    Range(“A2:B2”) 可以简写成 [A2:B2]

    但是:

    Range(“1:1,8:8,12:12”) 不能简写成 [“1:1,8:8,12:12”]

    Range(Cells(1, 1), Cells(3, 3)) 不能简写成 [Cells(1, 1), Cells(3, 3)]

    一个工作表由很多的单元格组成,所有的单元格集合在一起用cells表示,所以cells也代表就代所有的单元格,如果要指定某一个单元格只需要在cells后面指定行和列就可以,如:cells(1,1),就代表第一行第一列交叉的单元格A1,后面不指定单元格就代表所有单元格,如cells.select就是选择当前工作表的所有单元格,工作表除了是由单元格组成,同时也是由行或列组成,因此选择单元格或行或列还有都可以有多种,一行或一列也是一个区域,所以也是可以使用range指定的。

    比如下面几种单元格的选择方法

    cells(10).select 选择整个表格里的第10个单元格,顺序是从左到右,再从上到下,这个用法用到的机会并不多

    Cells(1, 1).Select 选择第一行第一列交叉的单元格,就是A1

    Cells使用方法和range使用方法是不一样的,range(“A1”)是以列号字母加行号代表,列号在前行号在后,要以英文双引号""括起来,意味是字符串的形式,cells(1,1),以索引号行号加列号,行号在前列号在后,中间用英文逗号隔开,不用加英文双引号,意味着里面的数字就是数值。

    其实cells还有一个用法,cells(1,“A”).select也是选择A1,这个就有点混血儿的感觉了。前面是行号,数值1,后面是字符列号"A",在编写程序的时候使用cells比使用range更灵活。可以方便使用变量替换.

    cells是不能像range一样直接指定区域的,但可以配合Resize属性指定区域,Resize属性是调整指定区域的大小。

    比如:

    Cells(1, 1).Resize(4, 4).Select 意思是第一行第一列交叉的单元格(就是A1)为左上角第一个单元格向右下调整成一个4*4的单元格区域。相当于range(“A1:D4”)

    Rows是当前工作表所有行的集合,因此也可以使用rows来指定行

    比如:

    Rows(1).select 选择第一行

    Rows.select 选择所有行,和Cells.Select 及 Columns.Select 是同样的效果,相当于选择表格上所有单元格。

    columns是当前工作表所有列的集合

    Columns(1).select 选择第一列

    Columns.Select 选择所有列

    上面说到了怎么选择单元格,行,列,区域,都是直接指定的,有明确目标的,但我们学习VBA就是要实现智能化,自动化,这样的我们就要用到变量来代替,那么怎么用变量来选择区域呢?

    上面的例子有提到,使用range(“A1”)这样的方法来选择是要加英文双引号的,代表是字符串类型,使用cells(1,1)这样的方法来选择的时候是不加双引号的,代表是数值类型。而变量可以代表任意类型,当然也可以手动指定变量是什么类型。如果不指定,那么变量是一个可变的类型,会根据情况自适应类型。不指定类型使用起来好像方便,但可能会存在一些情况。

    一是占用的存储占用空间大,二是运行速度会慢一些,毕竟它每次运行的时候还要判断一下自己应该是哪个类型。三是在给变量赋值的时候它不会检查是否符合类型要求,可能会存在一些未知的错误或冲突,查找起错误的原因会比较困难。比如有两个文本型的数字变量a=“2”,b=“3”,那么可以在立即窗口中分别使用msgbox a + b,msgbox a - b,msgbox a * b,msgbox a / b,看一下结果分别是什么,你会发现,两个变量相减,相乘,相除都是和数值计算一样,但相加就不一样的,a+b结果是23,而不是5,因为+号在VBA中可以用于连接两个字符串。如果你不指定变量的类型,一开始给这个本应该是数值型的变量赋值了一个字符型的数值,在运行的过程中系统不会提示任何错误,这样在发生错误的时候你可以不知道,或发现错误,但查找起来要花费很多时间。

    回到正题,和变量配合使用,要使用符号&进行连接,变量无论是什么类型都是不需要再双引号的。

    使用变量选择Range的方法示例:

    X = 2

    y = 3

    Cells(X, y).Select 选择第2行第3列交叉的单元格

    Range(“a” & X).Select 选择A2单元格

    Range(“a” & X & “:c5”).Select 选择A2:C5区域

    Range(“a1:” & “c” & y).Select 选择A1:C3区域

    Range(“a” & X & “:” & “b” & y).Select 选择A2:B3选择

    下面介绍一下几个Range对象最常用的属性和方法:

    Range.value属性,返回返设置range对象的内容

    如:

    a=Range(“A1”).value 返回单元格A1的值给变量a

    Range(“A1”).value=“姓名” 把A1单元格内容设置为 “姓名”,注意,设置的内容为字符串时需要用英文双引号括起来,数值或变量等其它类型是不用双引号的。

    要把内容设置为公式,要在公式前加一个=号,如下所示,在E2单元格加入求和公式,里面使用了变量来指定求和区域

    Range(“E2”).value = “=sum(A” & t & “😄” & t & “)”

    range.row属性,返回对象的行号,如果是一个区域返回左上角第一个单元格的行号

    如:a=Range(“D10”).row 返回单元格D10所在的行号10给变量a

    range.column属性,返回对象的列号,如果是一个区域返回左上角第一个单元格的列号

    如:b=Range(“B2:F5”).column 返回指定区域左上角第一个单元格b2所在的列号给变量b,注意这里返回的是数值列号不是字母列号,B就是第2列,所以返回的是2

    Range.Select 方法 选择对象

    range(“A1”).select 选择A1单元格

    Range.Clear 方法 清除对象,可使用具体参数指定只清除内容或公式或格式等

    Range(“A1:G37”).Clear 清除A1:G37 单元格区域的内容、公式和格式设置等。

    Range.Copy 方法将单元格区域复制到指定的区域或剪贴板中。如果没指定目标区域将复制到剪贴板。

    下例所示把区域A1:D4复制到 E5开始的同等大小区域。就是复制到E5:H8,可以使用具体参数设置复制粘贴的类型,比如仅复制公式,仅复制值等。

    Range(“A1:D4”).CopyRange(“E5”)

    Range.Delete 方法 删除对象

    RANGE(“A1:D5,F2:G2”).delete 同时删除A1:D5,F2:G2,两个指定区域

    Range(“1:1,8:8,12:12”).delete 同时删除第1,第8,第12行

    Range.Insert 方法 插入

    Range(“1:1,8:8,12:12”).Insert 同时在第1,第8,第12行上面插入一行空白行

    以上列举了小部分常用的对象、属性和方法,每个对象都有不同的属性和方法,不同的属性和方法可能会有多个参数,想要获得详情的属性和方法参数只考帮助文档,在VBA代码编辑器中按F1可打开VBA帮助文档。

    展开全文
  • vba clear清除公式、内容、格式的使用 一、清除所有属性 Sheet9.Cells.Clear 清除默认表Y1:Z10这个范围的所有属性 Range("Y1:Z10").Clear 所指定的范围的单元格中的格式、值、批注等全部被清空。 二、清除...
  • 函数作用:在多个工作表中查找一个范围内符合某个指定条件的项目对应指定范围加总求和..........................59 '35.函数作用:返回 Column 英文字.......................60 '36.函数作用:查找指定列名的列数.......
  • 系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动...4.test04 隔m列()插入n列空白列() 5.test05 合并工作簿 6.test06 更改工作表名 7.test07 解除excel结构限制 8.test08 解除工
  • 同时还有其他工作表,现在要实现在上述几张工作表的第9查找 内容为 摘要、期初余额、本期借方、本期贷方、借方累计、贷方累计 的单元格 所在的列,并将对应的列删除 Sub 删除列() Dim sh As Worksheet For ...
  • 宏,VBA中的语句、对象、方法及属性,判断、循环、分支语句,函数与公式
  • 项目背景近期接到一个工作任务,在运行设备中,会定期生成数据记录文件(txt 格式),我需要将这个文件中的 1000 个数据导入到 Excel 中,通过公式计算,得到需要的另外两列数据,将这两列数据作为数据源...
  • VBA常用技巧

    2014-12-21 16:39:28
    技巧26 禁止删除指定工作表 12 技巧27 自动建立工作表目录 12 技巧28 工作表的深度隐藏 12 技巧29 防止更改工作表的名称 12 技巧30 工作表中一次插入多行 12 技巧31 删除工作表中的空行 12 技巧32 删除工作表的重复...
  • 一、excel vba是什么?Visual Basic for Applications(VBA)是微软开发出来在其桌面应用程序中执行通用的自动化(OLE)任务的编程语言。主要能用来扩展Windows的应用程序功能,特别是Microsoft Office软件。简单来说...
  • Excel VBA 中使用字典总结 collection(集合)对象 VBA中有一个集合对象(collection),Collection 对象是一组可称为“单元”的有序项目的集合,可以理解为可以随意增减数量的一维数组。 Collection对象提供了一种...
  • Excel VBA Range单元格操作实例

    千次阅读 2020-02-16 21:51:53
    四、Range操作 4.2取得最后一个非空单元格 xlDown/xlToRight/xlToLeft/xlUp Dim ERow as Long ...注意:使用PasteSpecial方法时指定xlPasteAll(粘贴全部),并不包括粘贴列宽 Sub CopyWithSameCol...
  • 问题 左上角为a1 比如其中,key2 ,key4, key6 后面都可能带空格 key1 key2 key3 key4 key5 key6 key7 key8 key9 key10 key11 key12 key10 key10 ...VBA方法 所有的工...
  • [VBA]探讨在工作表中找到最后一

    万次阅读 2012-02-02 14:35:42
    在ExcelVBA中,使用End(xlUp)查找最后一是最常使用且最为简单的方法,它假设要有一列总包含有数据(数字、文本和公式等),并且在该列中最后输入数据的单元格的下一不会包含数据,因此不必担心会覆盖掉已有数据。...
  • Exit Sub End If If Target.Value = "关" Then '如果选择的是关,则将C3单元格赋值为 0 Cells(3, 3).Value = "0" Else '如果选择的是开,则将C3单元格赋公式 Cells(3, 3).Formula = "=RAND()" End If End Sub 使用...
  • Vba菜鸟教程

    万次阅读 多人点赞 2020-05-02 18:21:15
    文章目录Vba菜鸟教程编辑器宏vba基本语法运算符变量语句简写语句sub语句调用语句退出语句分支语句循环语句判断语句公式与函数在单元格输入公式利用单元格公式返回值调用工作表函数利用vba函数自定义函数操作对象操作...
  • 评估公式并从单元格中删除公式(Evaluate formula and remove formula from cell)我想评估公式并从单元格中删除保留其值的公式。 如何使用Apache POI完成此操作?下面是我的代码,我评估所有的公式。FormulaEvaluator...
  • VBA传递参数步骤

    2020-12-22 06:54:40
    到目前为止,你已经创建了简单的可以执行具体任务的VBA过程,这些过程在它们运行前没有要求你提供额外的数据。然而,在现实生活中,过程(子程序和函数)经常需要参数。参数(自变量)是过程工作时需要的一个或多个数值...
  • Range("a1:d10").ClearContents '清除A1:D10区域的公式/值 Range("a1:d10").Clear'全清(值,格式,批注) 代码如下: Sub clear() range("a1:d10").clearcontents end Sub 二、用VBA代码清除单元格的格式 代码...
  • ' 由'开始的是注释,直到本行结束 ' Range() --用于指定某一个或者某一些单元格区域 ' Rows() --指定某一或者多行 ' Columns() --指定某一列或者多列 Sub MyCode() Sheet2.UsedRange.ClearContents ' 删除Sheet...
  • VBA dialogs 调用对话框

    2021-11-03 12:05:43
    Application.Dialogs(6).Show是删除文档 Application.Dialogs(7).Show是页面设置 Application.Dialogs(8).Show是打印对话框 Application.Dialogs(9).Show是选择打印机对话框 Application.Dialogs(12).Show是重排窗口...
  • 利用VBA开发数据汇总工具通常在日常工作中总会用到Excel并且经常会遇到Excel将多个表格进行汇总。经过工作中的实践,发现用VBA开发具有一定重复性的功能,能够极大提高工作效率。最近,将本人曾开发的的Excel数据...
  • excel vba 列 Excel VBA:将列标题切换为数字 (Excel VBA: Switch Column Headings to Numbers) It's Friday, and your brain is almost full, but let's try to cram a little bit of Excel VBA in there before ...
  • Excel表格,想以其中某一列为索引,查找另一个表格中同样索引的,找到该行的某个内容复制到原来的表格指定的位置中。还可以删除原有表格中重复的内容。应用场景非常多,比如:利用学生学号和考场分配表查找学生...
  • 当对一个没有图表的工作表进行删除操作时会报错 Sheet1.ChartObjects.Delete ' 所有要先进行判断,如果图表数大于0才执行删除操作 End If Sheet3.Rows(1).Copy Destination:=Sheet2.Rows(1) ' 将Sheet3第1的数据...
  • Excel VBA编程

    万次阅读 多人点赞 2019-04-11 16:45:51
    文章目录如何创建VBAVBA语法规则声明变量给变量赋值让变量存储的数据参与运算关于声明变量的其他知识变量的作用域特殊的变量——数组声明多维数组声明动态数组其他创建数组的方法数组函数利用UBound求数组的最大索引...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,487
精华内容 594
关键字:

vba删除指定行公式