精华内容
下载资源
问答
  • Excel VBA单元格合并与拆分

    万次阅读 2018-12-30 15:26:10
    对于合并单元格这里提供”从上到下“和“从下到上”合并单元格两种方式,”从上到下“的方法需要记录当前列有多少个相同的单元格和判断相应的单元格是否是合并单元格,过程相对来说繁琐一些,“从下到上”的方法则...

    对于合并单元格这里提供”从上到下“和“从下到上”合并单元格两种方式,”从上到下“的方法需要记录当前列有多少个相同的单元格和判断相应的单元格是否是合并单元格,过程相对来说繁琐一些,“从下到上”的方法则相对简单一些 ,代码量相对来说也比较少。
    1.”从上到下“的方法

    Sub 从上到下合并单元格()
    '
    Dim i, l, m As Integer
    '禁止弹出提示的对话框
    Application.DisplayAlerts = False
    
    k% = InputBox("请输入合并单元格所在的列")
    
    '*****************在1995-2006年,excel工作簿包含65536行,但现在的office 2007中工作簿包含1048576行,
    '*****************从A列最后一行向上找,找到有数据的行为止
     l = [A65536].End(xlUp).Row      'l记录当前表格的最后一行的行数
     
     For i = 1 To l
      
    '判断该单元格是否是合并单元格
    
    If Cells(i, k).MergeCells = True Then    
         If Cells(i - m, k) = Cells(i + 1, k) Then     
          m = m + 1                               'M代表一个有多少个相同的单元格   
        Else  
             m = 0
        End If
    Else
             m = 0
          If Cells(i, k) = Cells(i + 1, k) Then  
            m = m + 1
          End If
    End If 
      Range(Cells(i, k), Cells(i + m, k)).Merge
     Next
     Application.DisplayAlerts = True
     End Sub
    

    2.”从下到上“的方法

    Sub 从下到上合并单元格()
    Dim i, l As Integer
    '禁止弹出提示的对话框
    Application.DisplayAlerts = False
    
    k% = InputBox("请输入合并单元格所在的列")
    '*****************在1995-2006年,excel工作簿包含65536行,但现在的office 2007中工作簿包含1048576行,
    '*****************从A列最后一行向上找,找到有数据的行为止
     l = [A65536].End(xlUp).Row      'l记录当前表格的最后一行的行数
     
     For i = l To 2 Step -1
         If Cells(i, k) = Cells(i - 1, k) Then
          Range(Cells(i, k), Cells(i - 1, k)).Merge
        End If
     Next
      Application.DisplayAlerts = True  
    End Sub
    
    1. 单元格的拆分
      当单元格进行合并之后就是如何进行拆分,拆分和合并原理大致相似,就是先判断是否是合并单元格,然后获取合并单元格的数目,进行拆分和填充。相应代码如下:
    Sub 拆分单元格()
    
    Dim i, l, m As Integer
    
    '禁止弹出提示的对话框
    Application.DisplayAlerts = False
    
    k% = InputBox("请输入拆分单元格所在的列")
    '*****************在1995-2006年,excel工作簿包含65536行,但现在的office 2007中工作簿包含1048576行,
    '*****************从A列最后一行向上找,找到有数据的行为止
     l = [A65536].End(xlUp).Row      'l记录当前表格的最后一行的行数
     For i = 1 To l
          '判断该单元格是否是合并单元格
           If Cells(i, k).MergeCells = True Then
              m = Cells(i, k).MergeArea.Count                           '记录合并单元格的个数
              Range(Cells(i, k), Cells(i + m - 1, k)).UnMerge      ‘拆分单元格
              Range(Cells(i, k), Cells(i + m - 1, k)).FillDown       ’填充单元格
              i = i + m - 1   
          End If    
     Next
      Application.DisplayAlerts = True
    End Sub
    

    `

    展开全文
  • Range.Merge 方法:由指定的Range对象创建合并单元格 (一)对选择的区域进行合并 Sub 合并单元格() Selection.Merge '对选中的单元格区域执行此段代码,进行合并,仅保留左上角值 End Sub ******************...

    Range.Merge 方法:由指定的Range对象创建合并单元格

    (一)对选择的区域进行合并

    Sub 合并单元格()

           Selection.Merge              '对选中的单元格区域执行此段代码,进行合并,仅保留左上角值

    End Sub

    **********************

    (二)对相同相邻单元格进行合并

    原料如下:

    部门 职工 职级
    1部门
    展开全文
  • 合并单元格之前要提前将数据列排序好,然后再复制以下代码,运行宏程序。 批量合并单元格 Sub RngMergeCondition() '批量合并单元格 Dim rngUser As Range Dim rngMerge As Range Dim rngSelect As Range Dim i ...

    合并单元格之前要提前将数据列排序好,然后再复制以下代码,运行宏程序。

    批量合并单元格

    Sub RngMergeCondition() '批量合并单元格
        Dim rngUser As Range
        Dim rngMerge As Range
        Dim rngSelect As Range
        Dim i As Long, j As Long
        Dim lngRowFirst As Long
        Dim lngClnFirst As Long
        Dim arr As Variant
        Dim brr As Variant
        Dim strTemp As String
        Dim lngBK As Long
        Dim shtUser As Worksheet
        On Error Resume Next
        Set rngSelect = Selection
        Set rngUser = Application.InputBox("请选择需要合并的单元格区域!", Default:=rngSelect.Address, Type:=8)
        Set rngUser = Intersect(rngUser.Parent.UsedRange, rngUser)
        '使用Intersect规避用户选择整列数据
        If rngUser Is Nothing Then MsgBox "选择的单元格区域不能为空白": Exit Sub
        arr = rngUser.Value
        ReDim brr(1 To UBound(arr), 1 To 2)
        '结果数组,第一列保存值,第二列保存合并行数
        For i = 1 To UBound(arr)
            strTemp = ""
            For j = 1 To UBound(arr, 2)
                strTemp = strTemp & "@@" & arr(i, j)
                '合并多列字符串为单个字符串
            Next
            brr(i, 1) = strTemp
            '字符串装入结果数组
            If i > 1 Then
            '如果不是第一行
                If brr(i - 1, 1) = strTemp Then
                    If lngBK = 0 Then lngBK = i - 1
                    'lngBK变量赋值结果数组用于存放合并行数的位置
                    brr(lngBK, 2) = brr(lngBK, 2) + 1
                    '累计相同值的行数
                Else
                    lngBK = i
                End If
            End If
        Next
        Application.ScreenUpdating = False
        Application.DisplayAlerts = False
        lngRowFirst = rngUser.Row
        '用户选择单元格区域的开始行
        lngClnFirst = rngUser.Column
        '用户选择单元格区域的开始列
        Set shtUser = rngUser.Parent
        For i = 1 To UBound(brr)
            If brr(i, 2) > 0 Then
                For j = 1 To UBound(arr, 2)
                    Set rngMerge = shtUser.Cells(i + lngRowFirst - 1, lngClnFirst + j - 1)
                    rngMerge.Resize(brr(i, 2) + 1, 1).Merge
                Next
            End If
        Next
        Application.ScreenUpdating = True
        Application.DisplayAlerts = True
    End Sub
    

    批量撤销合并单元格

    Sub unMergeRng() '撤销合并单元格
        Dim rngUser As Range
        Dim rngMerge As Range
        Dim lngRowFirst As Long
        Dim lngRowEnd As Long
        Dim lngClnFirst As Long
        Dim lngColEnd As Long
        Dim lngRowMerge As Long
        Dim i As Long
        Dim j As Long
        Dim rngSelect As Range
        On Error Resume Next
        Set rngSelect = Selection
        '用户初始选择的单元格
        Set rngUser = Application.InputBox("请选择需要撤销合并的单元格区域!", Default:=rngSelect.Address, Type:=8)
        '用户选择需要撤销合并的单元格区域
        Set rngUser = Intersect(rngUser.Parent.UsedRange, rngUser)
        'Intersect避免用户选择整列等单元格范围时,程序运算数据虚大,运算效率低下
        If rngUser Is Nothing Then MsgBox "选择的单元格区域不能为空白": Exit Sub
        lngRowFirst = rngUser.Row
        '运算范围的初始行
        lngRowEnd = lngRowFirst + rngUser.Rows.Count - 1
        '运算范围的结束行
        lngClnFirst = rngUser.Column
        '运算范围的开始列
        lngColEnd = lngClnFirst + rngUser.Columns.Count - 1
        '运算范围的结束列
        Application.ScreenUpdating = False
        For i = lngRowFirst To lngRowEnd
        '遍历行
            For j = lngClnFirst To lngColEnd
            '遍历列
                lngRowMerge = Cells(i, j).MergeArea.Rows.Count
                '合并单元格的行数
                If lngRowMerge > 1 Then
                    With Cells(i, j).Resize(lngRowMerge, 1)
                        .Select
                        .UnMerge
                        '撤销合并
                        .Value = Cells(i, j)
                        '填充数据
                    End With
                End If
            Next
            i = i + lngRowMerge - 1
            '跳过已处理完的合并行
        Next
        rngSelect.Select
        Application.ScreenUpdating = True
    End Sub
    
    展开全文
  • 最近的项目中,用到了很多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宏,水平有限,如有不妥或不完善之处,还欢迎各位网友不吝赐教,以利共同提高。

    
    展开全文
  • 设置单元格的行列坐标并写的word文档中Sub SetTablePosition() Dim tbl As Table Dim cell As cell Dim tblIndex As Integer Dim cellContent As String 以下遍历表格中存在的单元格 For Each tbl In This...
  • A---区域获取合并跨行数 var a=sheet.Range["A1"].MergeArea.Rows.Count; B---区域获取合并跨列数 var b=sheet.Range["A1"].MergeArea....获取合并单元格跨的格子数量 var c=sheet.Range["A1"].MergeArea.Cells.Count;
  • phpword合并单元格

    2021-03-23 12:30:00
    1. php合并单元格你嵌入html语言不就可以了吗 ?else{$sql = mysql_query("select * from price group by company ",$conn);while($row = mysql_fetch_array($sql)){?>
  •  UseCount = Application.WorksheetFunction.CountA(Range("A1:A1000")) '调用Excel函数CountA获取【合并单元格】的数量,并赋值给UseCount  EndRow = .Range("D1000").End(xlUp).Row '使用End()方法获取需要合并...
  • 按照项目需求,参考网上资源,实现了VBA宏控制Excel 按行插入和删除的事件处理,插入行后的单元格合并以及实现通过单元格的动态条件公式自动计算功能。
  • VBA-Excel中单元格的引用方法

    千次阅读 2020-02-23 13:45:38
    VBA-Excel中单元格的引用方法 使用VBA对Excel中的单元格单元格区域进行选择有很多种方法,可以归结为两大类: 使用行列数进行选择 根据已经选择的单元格(区域)进行再选择 1、使用range属性 VBA中可以使用range...
  • 作用描述:Excel本身所带的跨越合并功能可以对区域数据按行进行合并,但没有提供按列进行合并的功能,借助于此宏脚本实现该功能1、按下Alt+F8...' 纵向合并单元格 On Error GoTo ErrorHandler Dim co, ro, hi, wi As...
  • 1用VBA在Excel中分解合并单元格的代码范例:Sub分解合并单元格并填充()Set已选择的区域=Selection首行=已选择的区域.Row行数=已选择的区域.Rows.CountIf首行+行数-1=65536Then行数=ActiveSheet.UsedRange.Row+...
  • 今天还是讲讲单元格操作 一、删除空行 如果是上面的表格要删除空行的话,我们想到的是先删掉第1行,再第2行,再第3行……但是对于程序来说,删完第1行后,第2行就变成了第1行后面就会出错,所以我们先从后面...
  • VBA合并多个Excel文档

    千次阅读 2018-06-03 13:55:56
    Sub 合并当前目录下所有工作簿的全部工作表() Dim MyPath, MyName, AWbName Dim Wb As Workbook, WbN As String Dim G As Long Dim Num As Long Dim BOX As String Application.ScreenUpdating = False MyPath = ...
  • VBA单元格、工作表、工作簿

    千次阅读 2019-04-30 23:08:35
    详解VBA单元格、工作表、工作簿各种表示、方法,注意事项。
  • Excel 2016版里,每个工作簿的单元格行数:104 8576,列数:1 6384,单元格个数:104 8576 × 1 6384 = 171 7986 9181 一个单元格内字符容量是32767个字符,实际上,我们根本用不到这么大的容量。 VBA中单元格学习...
  • ro, hi, wi As Integer 'co起始列,ro起始行,hi需要合并行数,wi需要处理的列数 co = Selection.Column ro = Selection.Row hi = Selection.Rows.Count wi = Selection.Columns.Count ActiveSheet.Cells(ro, co ...
  • n = Selection.Rows.Count '选中区域的行数 a = Selection.Row '选中区域的起始行 b = Selection.Column '选中区域的起始列 Application.DisplayAlerts = False '禁用警告提示 For i = a + n - 1 To a + 1 Step -1 '...
  • VBA快速合并字符串方法

    千次阅读 2020-12-23 02:16:44
    本文将就讲一下VBA中快速连接字符串的集中方法。 我们使用一个简单的示例,提取1-10中的偶数并输出结果,判断偶数非常简单,程序主框架如下。 Sub Demo() Dim i As Integer, msg As String For i = 1 To 10 If ...
  • 老板们喜欢将相同内容合并着看,而做统计的时候合并单元格带来的痛苦是谁用谁知道哇。今天我们一起脱离苦海,走上人生巅峰。总体思路是:合并时从下至上,即从最后一行开始判断单元格内容是不是相同,相同则合并,不...
  • 解决原始文件(包含2个标题列第一列是合并单元格数据内容)根据行数切割失败办法 暂时解决办法如下: 假设原始文件内容如下: 请先将第一行中ABC单元格的内容先暂时保存一下: 客户数据导入模板 注意请...
  • 在网上找EXCEL多文件合并的方法,思路: 一、Linux 或者window+cmder,直接用命令行cat合并EXCEL文件,但是,需要安装辅助东西才能直接处理(也许也不可以,但是,可以用文件格式转换工具转换是可行的,把EXCEL文件...
  • 如果指定的单元格不在合并的范围内,则该属性返回指定的单元格。只读。Variant类型。 Range.Address,以宏语言返回区域引用。String 类型,只读。如::$A$3:$A$10 o_xls.Visible = TRUE o_xls.WindowState = -...
  • '1、用VBA单元格中输入普通公式 Sub t1() Range("d2") = "=b2*c2" End Sub '2、用VBA单元格输入带引号的公式 Sub t3() Range("c16") = "=SUMIF(A2:A6,""b"",B2:B6)" '遇到单引号就把单引号加倍 ...
  • datatable 合并单元格 跨页显示

    千次阅读 2019-06-19 18:39:24
    简单说一下原理,就是相同的需要合并的行的第一行需要将下面的行覆盖,rowspan就是占用几行的意思(一开始还以为是所在行的索引),然后在后台可以很方便的计算出有几行的是相同的需要合并。 "columnDefs": [{ ...
  • [a1]>"z" 错误值判断:vba|application.isError([a1]) 日期判断:vba.isDate([a1]) 指定数字格式:range().numberFormatLocal = "0.00" 3、单元格合并 合并:就是merge 返回合并后信息:mergeArea.address Range("a2...
  • 批量合并excel工作簿中同名工作表,适用条件: 1、所有要汇总的工作簿在同一个文件夹中,这里以后缀为.xlsx为例; 2、需要合并的工作表名称相同(如: “sheet1”),且数据字段一样(如:A列表示序号,B列表示姓名,...
  • Word表格之VBA知识

    千次阅读 多人点赞 2019-01-28 13:56:10
    Table对象(因为是对象,...下面是Table的常用方法(注意是部分,不是全部,只例出重要的方法,下面的属性皆如此,如果详细面全部的了解,请看Word VBA自带的帮助。VBAWD10.chm) 使用Table对象 可使用 Tables(...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 633
精华内容 253
关键字:

vba合并单元格行数

友情链接: sh_armStm32_v1.7.tar.gz