精华内容
下载资源
问答
  • ## # 用Excel的VBA能够从Excel中读取数据,也能够实现数据写入到单元格中,但是怎么实现一个Function中实现先读取数据,再写到表的其他单元格呢?**__ Public Function test1() As String Dim strArray() As ...
  • 今天女朋友工作上出了点麻烦,就是要向Word中批量添加图片以及整理成Excel数据的图片名。其中图片名需要设置段落和文字格式,有些图片还是共享一个图片名。这可是个繁琐而枯燥的工作。我一直相信重复劳动是对人这...

    今天女朋友工作上出了点麻烦,就是要向Word中批量添加图片以及整理成Excel数据的图片名。其中图片名需要设置段落和文字格式,有些图片还是共享一个图片名。这可是个繁琐而枯燥的工作。我一直相信重复劳动是对人这种智慧生物的侮辱(手动狗头,所以决定解放一下她。下面整理下需求:

    1. 从文件夹中向Word里批量添加整理好的图片,并设置图片格式。
    2. 为图片设置整理成Excel数据的图片名,其中有个难点是图片名是给好的,独特的,无法通过程序批量生成,只能通过程序引入。
    3. 有些图片共用一个图片名,只需在最后一个图片下写入图片名,前面图片下面并不需要。

    解决思路:

    1. 因为Word、Excel都是微软的office产品,所以最佳方式还是利用VBA在Word中写宏来解决。
    2. 有两个素材,一个是包含图片的文件夹和包含图片名数据的Excel表格。必须通过手选图片,选好图片后然后程序会根据图片数顺序选取相对应的数据写入图片名,并在其过程中,设置好图片和图片名格式。
    3. 解决图片共用图片名问题 。好在她的问题中大多数共用图片名的图片个数为两个,可以通过选取图片数个数来做判断,不过这个个数也可以修改。

    因为VBA使用的VB语言好久没用了,花时间搜集了点资料,粗略写出了这段程序,虽然还有很大优化空间,但是问题解决了,就暂时先用着,等以后有空再说。

    下面是Word中写入的宏:

    Sub InsertPic()
        Dim xlApp As Excel.Application    '从外部文件中读取和修改所用Excel数据的个数
        Dim xlBook As Excel.Workbook
        Dim xlSheet As Excel.Worksheet
        Dim anotherFileName As String
        Dim number As Integer    'Excel中被选用的数据的个数
    
        anotherFileName = "C:\Users\Feng\Desktop\111.xlsx"
        Set xlApp = New Excel.Application
        Set xlBook = xlApp.Workbooks.Open(anotherFileName)
        Set xlSheet = xlBook.Worksheets(1)
    
        Dim myfile As FileDialog
        Dim i As Integer '代表行号
        Dim j As Integer '代表列号
        Dim samePic As Integer '代表其实是一整张图的图数
        Dim countNum As Integer '设定如果是几个图为一个整图,前面图就跳过
        Dim r As String
        Dim c As String
        
        number = xlSheet.Cells(3, 5).Value   '这个位置是记录Excel中所用数据的个数的变量,就不设置主函数和功能函数了,代码不多,同时也利于检测是否共用了图片名
        i = number + 1 '设置开始行数
        j = 1   '设置开始列
        
        countNum = 0 '如果是整个图,就前面图跳过,从最后一个图开始写标题
        samePic = 2   '几张图是整图,就把这个数设置为几,例如两张图是整数,就把这个数设置为2
        
        
        Set myfile = Application.FileDialog(msoFileDialogFilePicker)
        With myfile
            .InitialFileName = "\"
            If .Show = -1 Then
                For Each fn In .SelectedItems
                    countNum = countNum + 1
                    Set mypic = Selection.InlineShapes.AddPicture(FileName:=fn, SaveWithDocument:=True)
                    '按比例调整相片尺寸
                    WidthNum = mypic.Width
                    c = 20         '在此处修改相片宽,单位厘米
                    mypic.Width = c * 28.35
                    mypic.Height = (c * 28.35 / WidthNum) * mypic.Height
                    If Selection.Start = ActiveDocument.Content.End - 1 Then  '如光标在文末
                        Selection.TypeParagraph    '在文末添加一空段
                    Else
                        Selection.MoveDown
                    End If
                    
                    If (myfile.SelectedItems.Count = samePic And countNum < samePic) Then    '如果选定的是两张图,那直接跳过第一张图,命名第二张
                        GoTo NextLoop
                    Else
                         'Selection.Text = Basename(fn)    '函数取得文件名
                    
                        chan = DDEInitiate(app:="Excel", topic:="system") '打开一个DDE通道
                        DDEExecute channel:=chan, Command:="[open(" & Chr(34) & "C:\Users\Feng\Desktop\111.xlsx" & Chr(34) & ")]"
                        '在一个应用程序中执行打开.xls文件命令,需要指出的是,文件所放位置需要修改为自己的文件位置。
                        DDETerminate channel:=chan '关闭DDE通道
                        chan = DDEInitiate(app:="Excel", topic:="111.xlsx") '打开一个DDE通道
                        dse = "r" + CStr(i) + "c" + CStr(j) '确定单元格位置
                        a = DDERequest(channel:=chan, Item:=dse)  '获取单元格数据
                         Selection.InsertAfter (a) '在鼠标停留位置插入获得数据
                        With Selection.ParagraphFormat             '设置文字段落格式
                        .Alignment = wdAlignParagraphCenter         '文字居中
                        With Selection.Font                 '设置文字字体格式
                        .Name = "宋体"
                        .Size = "14"
                        End With
                        End With
                        i = i + 1
                        number = number + 1
                        Selection.EndKey
                        
                        If Selection.Start = ActiveDocument.Content.End - 1 Then  '如光标在文末
                            Selection.TypeParagraph    '在文末添加一空段
                        Else
                            Selection.MoveDown
                        End If
                        
                    End If
    NextLoop:       Next fn '结束此次循环,继续下一个循环
    
            Else
            End If
        DDETerminateAll '关闭所有以及打开的DDE通道
        xlSheet.Cells(1, 5) = number
        xlApp.ActiveWorkbook.Close Savechanges:=True     '保存该工作表
        
        End With
        Set myfile = Nothing
        xlApp.Workbooks.Close '关闭此工作表
    
    End Sub
    

    注意要点:

    1. 要引用Microsoft Excel Object Library。方式是“工具->引用->Microsoft Excel Object Library”。
    2. 存放图片名的Excel数据表在宏运行前要关闭,不然会无法写入变量。造成图片名和图片不匹配。
    3. 程序是通过识别选取图片数量来判断是否是公用图片名的,但是这个数量是可以修改的,通过修改程序中‘samePic’变量值来实现,如果无公用图片名可以将值设置为0。
    4. 注意Excel表格中数据是自动选取的,所以Excel表格中数据要是排序好的,而且和你选取的图片要一一对应,否则会图片和图片名不吻合。数据开始的行和列也是可以修改的。
    5. 关于图片的格式和图片名的格式都是可以根据需求修改的。
    6. Word文档完全处理好之后,可以将Excel数据表第3行第5列设置的变量删除,但是程序运行过程中不要删除,否则会导致图片名又会从头开始读入。

    因为程序临时写的,本身结构散乱并且有很多冗余瑕疵。欢迎随时提出其中问题,如果对您有用我会再次优化,另外遇到任何问题都可以在评论中提出来,我看到会及时回复的。

    展开全文
  • word vba设置表格样式

    千次阅读 2019-01-17 17:51:23
     '功能:光标表格中处理当前表格;否则处理所有表格!  Application.ScreenUpdating = False '关闭屏幕刷新  Application.DisplayAlerts = False '关闭提示  On Error Resume Next '忽略错误  '*************...

    Sub 表格处理()
        '功能:光标在表格中处理当前表格;否则处理所有表格!
        Application.ScreenUpdating = False  '关闭屏幕刷新
        Application.DisplayAlerts = False  '关闭提示
        On Error Resume Next  '忽略错误
        '***************************************************************************
        Dim mytable As Table, i As Long
        If Selection.Information(wdWithInTable) = True Then i = 1
        For Each mytable In ActiveDocument.Tables
            If i = 1 Then Set mytable = Selection.Tables(1)
            With mytable
                '取消底色
                .Shading.ForegroundPatternColor = wdColorAutomatic
                .Shading.BackgroundPatternColor = wdColorAutomatic
                Options.DefaultHighlightColorIndex = wdNoHighlight
                .Range.HighlightColorIndex = wdNoHighlight
                .Style = "表格主题"
                
                '单元格边距
                .TopPadding = PixelsToPoints(0, True) '设置上边距为0
                .BottomPadding = PixelsToPoints(0, True) '设置下边距为0
                .LeftPadding = PixelsToPoints(0, True)  '设置左边距为0
                .RightPadding = PixelsToPoints(0, True) '设置右边距为0
                .Spacing = PixelsToPoints(0, True) '允许单元格间距为0
                .AllowPageBreaks = True '允许断页
                '.AllowAutoFit = True '允许自动重调尺寸
                
                '设置边框
                .Borders(wdBorderLeft).LineStyle = wdLineStyleNone
                .Borders(wdBorderRight).LineStyle = wdLineStyleNone
                .Borders(wdBorderTop).LineStyle = wdLineStyleThinThickMedGap
                .Borders(wdBorderTop).LineWidth = wdLineWidth225pt
                .Borders(wdBorderBottom).LineStyle = wdLineStyleThickThinMedGap
                .Borders(wdBorderBottom).LineWidth = wdLineWidth225pt
                
                With .Rows
                    .WrapAroundText = False '取消文字环绕
                    .Alignment = wdAlignRowCenter '表水平居中  wdAlignRowLeft '左对齐
                    .AllowBreakAcrossPages = False '不允许行断页
                    .HeightRule = wdRowHeightExactly '行高设为最小值   wdRowHeightAuto '行高设为自动
                    .Height = CentimetersToPoints(0) '上面缩进量为0
                    .LeftIndent = CentimetersToPoints(0) '左面缩进量为0
                End With
                
                With .Range
                    With .Font '字体格式
                        .Name = "宋体"
                        .Name = "Times New Roman"
                        .Color = wdColorAutomatic '自动字体颜色
                        .Size = 12
                        .Kerning = 0
                        .DisableCharacterSpaceGrid = True
                    End With
                    
                    With .ParagraphFormat '段落格式
                        .CharacterUnitFirstLineIndent = 0 '取消首行缩进
                        .FirstLineIndent = CentimetersToPoints(0) '取消首行缩进
                        .LineSpacingRule = wdLineSpaceSingle '单倍行距  wdLineSpaceExactly '行距固定值
                        '.LineSpacing = 20 '设置行间距为20磅,配合行距固定值
                        .Alignment = wdAlignParagraphCenter '单元格水平居中
                        .AutoAdjustRightIndent = False
                        .DisableLineHeightGrid = True
                    End With
                    
                    .Cells.VerticalAlignment = wdCellAlignVerticalCenter  '单元格垂直居中
                    
                End With
                
                '设置首行格式
                .Cell(1, 1).Select ' 选中第一个单元格
                With Selection
                    .SelectRow '选中当前行
                    Selection.Rows.HeadingFormat = wdToggle '自动标题行重复
                    .Range.Font.Bold = True '表头加粗黑体
                    .Shading.ForegroundPatternColor = wdColorAutomatic '首行自动颜色
                    .Shading.BackgroundPatternColor = -603923969 '首行底纹填充
                End With
                
                '自动调整表格
                .Columns.PreferredWidthType = wdPreferredWidthAuto
                .AutoFitBehavior (wdAutoFitContent) '根据内容调整表格
                .AutoFitBehavior (wdAutoFitWindow) '根据窗口调整表格
                
            End With
            
            If i = 1 Then Exit For
        Next
        '***************************************************************************
        Err.Clear: On Error GoTo 0 '恢复错误捕捉
        Application.DisplayAlerts = True  '开启提示
        Application.ScreenUpdating = True   '开启屏幕刷新
    End Sub

    展开全文
  • Word表格之VBA知识

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

    Table对象(因为是对象,所以用Set赋值)

    该对象代表一个单独的表格。Table 对象是Tables集合的一个成员。Tables集合包含了指定的选定内容范围文档中的所有表格

    下面是Table的常用方法(注意是部分,不是全部,只例出重要的方法,下面的属性皆如此,如果详细面全部的了解,请看Word VBA自带的帮助。VBAWD10.chm)

    使用Table对象

    可使用 Tables(index) 返回一个 Table 对象,其中 index 为索引号。索引号代表选定内容、范围或文档中表格的位置。下例将活动文档中的第一个表格转换为文本。

    ActiveDocument.Tables(1).ConvertToText Separator:=wdSeparateByTabs

    使用Add方法可以在指定范围内新增一表格。下例在活动文档的起始处添加一 3 x 4 表格。

    Set myRange = ActiveDocument.Range(Start:=0, End:=0)

    ActiveDocument.Tables.Add Range:=myRange, NumRows:=3, NumColumns:=4

    Cell 方法

    返回一个 Cell 对象,该对象代表表格中的一个单元格

    expression.Cell(Row, Column)

    expression      必需。该表达式返回一个Table对象。

    Row   Long 类型,必需。指返回的表格行数。可以是介于 1 和表格行数之间的任意整数。

    Column    Long 类型,必需。指返回的表格单元格数目。可以是介于 1 和表格列数之间的任意整数。

    示例

    本示例在新文档中创建一个 3x3 表格,并在表格的第一个和最后一个单元格中插入文本。

    Dim docNew As Document

    Dim tableNew As Table

    Set docNew = Documents.Add

    Set tableNew = docNew.Tables.Add(Selection.Range, 3, 3)

    With tableNew

        .Cell(1,1).Range.InsertAfter "First cell"

        .Cell(tableNew.Rows.Count, _

            tableNew.Columns.Count).Range.InsertAfter "Last Cell"

    End With

    本示例删除活动文档的第一个表格中的第一个单元格的内容。

    If ActiveDocument.Tables.Count >= 1 Then

        ActiveDocument.Tables(1).Cell(1, 1).Delete

    End If

    Split 方法

    在表格中紧靠指定行的上面插入一空段落,并且返回一个 Table 对象,此对象包含指定行及其下一行。(简单的的理解:就是指向拆分后的下面的表格,不清楚也没关系,看下面的例子。)

    expression.Split(BeforeRow)

    expression      必需。该表达式返回一个 Table 对象。

    BeforeRow     Variant 类型,必需。将要拆分的表格的前一行。可以为 Row 对象或行号。

    本示例在活动文档(应试是新建文档)中创建一张 5x5 的表格,并且在第三行之前进行拆分。然后为结果表格(新的 3x5 表格)的单元格添加底纹。

    Set newDoc = Documents.Add

    Set myTable = ActiveDocument.Tables.Add(Range:=Selection.Range, _

        NumColumns:=5, NumRows:=5)

    myTable.Split(BeforeRow:=myTable.Rows(3)).Shading _

        .Texture = wdTexture10Percent

    Table属性

    Range 属性

    本示例复制表格 1 中的首行。

     

    If ActiveDocument.Tables.Count >= 1 Then _

        ActiveDocument.Tables(1).Rows(1).Range.Copy

    End if

    Borders 属性

    该属性返回一个 Borders 集合,该集合代表指定对象的所有边框。

    expression.Borders

    expression      必需。该表达式返回“应用于”列表中的一个对象。

    示例

    本示例对活动文档中的第一个表格应用内部和外部边框。

    Set myTable = ActiveDocument.Tables(1)

    With myTable.Borders

        .InsideLineStyle = wdLineStyleSingle

        .OutsideLineStyle = wdLineStyleDouble

    End With

    Columns 属性

    返回一个 Columns 集合,该集合代表在某一区域、所选内容或表格中所有表格列。只读

    示例

    本示例显示活动文档的第一个表格中的列数。

    If ActiveDocument.Tables.Count >= 1 Then

        MsgBox ActiveDocument.Tables(1).Columns.Count

    End If

    本示例将当前列的宽度设置为 1 英寸。

    If Selection.Information(wdWithInTable) = True Then

        Selection.Columns.SetWidth ColumnWidth:=InchesToPoints(1), _

            RulerStyle:=wdAdjustProportional

    End If

    Rows 属性

    该属性返回一个 Rows 集合,该集合代表某个范围、所选部分或表格中所有的表格行。只读。

    本示例删除活动文档第一个表格的第二行。

    ActiveDocument.Tables(1).Rows(2).Delete

    本示例为插入点所在行的各单元格设置边框。

    Selection.Collapse Direction:=wdCollapseStart

    If Selection.Information(wdWithInTable) = True Then

        Selection.Rows(1).Borders.OutsideLineStyle =  wdLineStyleSingle

    Else

        MsgBox "The insertion point is not in a table."

    End If

    Column 对象

    代表单个表格列。Column 对象是 Columns 集合的一个元素。Columns 集合包括某一表格、选定内容或区域中的所有列。

    使用 Column 对象

    使用 Columns(index) 可返回单独的 Column 对象,其中 index 为索引序号。索引序号代表该列在 Columns 集合中的位置(从左至右计算)

    下列示例选定活动文档中的表格 1 的第一列。

    ActiveDocument.Tables(1).Columns(1).Select

    用 Cell 对象的 Column 属性可返回一个 Column 对象。下列示例删除单元格 1 中的文字,插入新文字,然后对该列进行排序。

    With ActiveDocument.Tables(1).Cell(1, 1)

        .Range.Delete

        .Range.InsertBefore "Sales"

        .Column.Sort

    End With

    用 Add 方法可在表格中添加一列。下列示例为活动文档的第一张表格中添加一列,然后将列宽设置为相等。

    If ActiveDocument.Tables.Count >= 1 Then

        Set myTable = ActiveDocument.Tables(1)

        myTable.Columns.Add BeforeColumn:=myTable.Columns(1)

        myTable.Columns.DistributeWidth

    End If

    说明

    用 Selection 对象的 Information 属性可返回当前列号。下列示例选定当前列并在消息框中显示其列号。

    If Selection.Information(wdWithInTable) = True Then

        Selection.Columns(1).Select

        MsgBox "Column " _

            & Selection.Information(wdStartOfRangeColumnNumber)

    End If

    Cell 对象

    代表单个表格单元格。Cell 对象是 Cells 集合中的元素。Cells 集合代表指定对象中所有的单元格。

    使用 Cell 对象

    用 Cell(row, column) 或 Cells(index)可返回 Cell 对象,其中 row 为行号,column 为列号,index 为索引序号。下列示例给第一行的第二个单元格加底纹。

    Set myCell = ActiveDocument.Tables(1).Cell(Row:=1, Column:=2)

    myCell.Shading.Texture = wdTexture20Percent

    下列示例给第一行的第一个单元格加底纹。

    ActiveDocument.Tables(1).Rows(1).Cells(1).Shading _

        .Texture = wdTexture20Percent

    用 Add 方法可在 Cells 集合中添加 Cell 对象。也可用 Selection 对象的 InsertCells 方法插入新单元格。下列示例在 myTable 的第一个单元格之前插入一个单元格。

    Set myTable = ActiveDocument.Tables(1)

    myTable.Range.Cells.Add BeforeCell:=myTable.Cell(1, 1)

    本示例将第一个表格的头两个单元格设定为一个域 (myRange)。区域设定之后,用 Merge 方法合并两个单元格。

    Set myTable = ActiveDocument.Tables(1)

    Set myRange = ActiveDocument.Range(myTable.Cell(1, 1) _

        .Range.Start, myTable.Cell(1, 2).Range.End)

    myRange.Cells.Merge

    说明

    使用带 Rows 或 Columns 集合的 Add 方法添加一行或一列单元格。

    使用 Selection 对象的 Information 属性返回当前行号和列号。下面的示例改变选中部分第一个单元格的宽度,再显示单元格的行号和列号。

    If Selection.Information(wdWithInTable) = True Then

        With Selection

            .Cells(1).Width = 22

            MsgBox "Cell " & .Information(wdStartOfRangeRowNumber) _

                & "," & .Information(wdStartOfRangeColumnNumber)

        End With

    End If

    Row 对象

    代表表格的一行。Row 对象是 Rows 集合中的一个元素。Rows 集合包括指定部分、区域或表格中的所有行。

    使用 Row 对象

    用 Rows(index) 可返回单独的 Row 对象,其中 index 为索引序号。索引序号代表该行在选定部分、区域或表格中的位置。下列示例删除活动文档中第一张表格的首行。

    ActiveDocument.Tables(1).Rows(1).Delete

    用 Add 方法可在表格中添加行。下列示例在选定部分首行前插入一行。

    If Selection.Information(wdWithInTable) = True Then

        Selection.Rows.Add BeforeRow:=Selection.Rows(1)

    End If

    说明

    用 Cells 属性可修改 Row 对象中的单个单元格。下列示例在选定部分中添加一张表格,并在表格第二行的各单元格内插入数字。

    Selection.Collapse Direction:=wdCollapseEnd

    If Selection.Information(wdWithInTable) = False Then

        Set myTable = _

            ActiveDocument.Tables.Add(Range:=Selection.Range, _

            NumRows:=3, NumColumns:=5)

        For Each aCell In myTable.Rows(2).Cells

            i = i + 1

            aCell.Range.Text = i

        Next aCell

    End If

    访问表格行或列时产生的错误

    如果要访问绘制表格中单独的行或列,而该表格又不统一,则会产生一个运行时错误。例如,如果活动文档中第一张表格的每列中具有不同数量的行,则使用下列指令将导致出错。

    Sub RemoveTableBorders()

        ActiveDocument.Tables(1).Rows(1).Borders.Enable = False

    End Sub

    要避免这种错误可首先使用 SelectColumn  SelectRow 方法选定一列或一行中的单元格。选定单元格后,再使用 Selection 对象的 Cells 属性。下列示例选定第一张文档表格中的第一行。Cells 属性用于访问选定的单元格(第一行中的所有单元格)以删除边框。

    Sub RemoveTableBorders()

        ActiveDocument.Tables(1).Cell(1, 1).Select

        With Selection

            .SelectRow

            .Cells.Borders.Enable = False

        End With

    End Sub

    下列示例选定第一张文档表格的第一列。For Each...Next 循环语句用于在所选内容(第一列中的所有单元格)的每个单元格中添加文字。

    Sub AddTextToTableCells()

        Dim intCell As Integer

        Dim oCell As Cell

        ActiveDocument.Tables(1).Cell(1, 1).Select

        Selection.SelectColumn

        intCell = 1

        For Each oCell In Selection.Cells

            oCell.Range.Text = "Cell " & intCell

            intCell = intCell + 1

        Next oCell

    End Sub

    处理表格

    创建一张表格,插入文字,并应用格式

    下列示例在活动文档的开头插入一张 4 列 3 行的表格。For Each...Next 结构用于循环遍历表格中的每个单元格。在 For Each...Next 结构中,InsertAfter 方法用于将文字添至表格单元格(单元格 1、单元格 2、以此类推)。

    Sub CreateNewTable()

        Dim docActive As Document

        Dim tblNew As Table

        Dim celTable As Cell

        Dim intCount As Integer

        Set docActive = ActiveDocument

        Set tblNew = docActive.Tables.Add( _

            Range:=docActive.Range(Start:=0, End:=0), NumRows:=3, _

            NumColumns:=4)

        intCount = 1

        For Each celTable In tblNew.Range.Cells

            celTable.Range.InsertAfter "Cell " & intCount

            intCount = intCount + 1

        Next celTable

        tblNew.AutoFormat Format:=wdTableFormatColorful2, _

            ApplyBorders:=True, ApplyFont:=True, ApplyColor:=True

    End Sub

    在表格单元格中插入文字

    下列示例在活动文档中第一张表格的第一个单元格中插入文字。Cell 方法返回单独的 Cell 对象。Range 属性返回一个 Range 对象。Delete 方法用于删除现有的文字,而 InsertAfter 方法用于插入文字“Cell 1,1”。

    Sub InsertTextInCell()

        If ActiveDocument.Tables.Count >= 1 Then

            With ActiveDocument.Tables(1).Cell(Row:=1, Column:=1).Range

                .Delete

                .InsertAfter Text:="Cell 1,1"

               ' .text="cell 1,1" 上面两行,可以用这一行表示。

            End With

        End If

    End Sub

    返回表格单元格中的文字,不包括表格结束单元格标记

    下列示例返回并显示文档中第一张表格的第一行中每个单元格的内容。

    Sub ReturnTableText()

        Dim tblOne As Table

        Dim celTable As Cell

        Dim rngTable As Range

        Set tblOne = ActiveDocument.Tables(1)

        For Each celTable In tblOne.Rows(1).Cells

            Set rngTable = ActiveDocument.Range(Start:=celTable.Range.Start, _

                End:=celTable.Range.End - 1)         '注意这里用了-1

            MsgBox rngTable.Text

        Next celTable

    End Sub

     

    Sub ReturnCellText()

        Dim tblOne As Table

        Dim celTable As Cell

        Dim rngTable As Range

        Set tblOne = ActiveDocument.Tables(1)

        For Each celTable In tblOne.Rows(1).Cells

            Set rngTable = celTable.Range

            rngTable.MoveEnd Unit:=wdCharacter, Count:=-1

            MsgBox rngTable.Text

        Next celTable

    End Sub

     

    将文本转换为表格

    下列示例在活动文档的开头插入用制表符分隔的文本,然后将这些文本转换为表格。

    Sub ConvertExistingText()

        With Documents.Add.Content

            .InsertBefore "one" & vbTab & "two" & vbTab & "three" & vbCr

            .ConvertToTable Separator:=Chr(9), NumRows:=1, NumColumns:=3

        End With

    End Sub

     

    返回每个表格单元格的内容

    下列示例定义一个数组,该数组的元素个数等于文档中第一张表格(假定为 Option Base 1)中的单元格数。For Each...Next 结构用于返回每个表格单元格的内容,并将文字指定给相应的数组元素。

    Sub ReturnCellContentsToArray()

        Dim intCells As Integer

        Dim celTable As Cell

        Dim strCells() As String

        Dim intCount As Integer

        Dim rngText As Range

        If ActiveDocument.Tables.Count >= 1 Then

            With ActiveDocument.Tables(1).Range

                intCells = .Cells.Count

                ReDim strCells(intCells)

                intCount = 1

                For Each celTable In .Cells

                    Set rngText = celTable.Range

                    rngText.MoveEnd Unit:=wdCharacter, Count:=-1

                    strCells(intCount) = rngText

                    intCount = intCount + 1

                Next celTable

            End With

        End If

    End Sub

    (测试环境.docVBA中有更好的方法,可以参考)

    将活动文档中的所有表格复制到新文档中

    本示例将当前文档中的表格复制到新文档中。

    Sub CopyTablesToNewDoc()

        Dim docOld As Document

        Dim rngDoc As Range

        Dim tblDoc As Table

        If ActiveDocument.Tables.Count >= 1 Then

            Set docOld = ActiveDocument

            Set rngDoc = Documents.Add.Range(Start:=0, End:=0)

            For Each tblDoc In docOld.Tables

                tblDoc.Range.Copy

                With rngDoc

                    .Paste

                    .Collapse Direction:=wdCollapseEnd

                    .InsertParagraphAfter

                    .Collapse Direction:=wdCollapseEnd

                End With

            Next

        End If

    End Sub

     

    以下为我对表格的认识:(陋见)

    在“测试环境.doc”中有不少的例子(在VBA中),也有解释,

    两个文档花了我8小时以上(即一个工作日以上)

    关于表格在VBA中的相关说明:

    1.         如下图,类似于回车 在VBA中也是chr(13),竖线就是chr(7),怎么知道的?

    2.         当然是看老大们知道的。不过。在“测试环境.doc”中有相关的宏能得到这些数字。这也是授之以渔吧。

    3.         重点推荐“测试环境.doc的相关代码用了我不少功夫,慢慢体会。不懂的可以提出来。

     

    Ch(13)

    Ch(7)

     

    4.         因为chr(13)为段落标记,所以在VBA中,ActiveDocument.Paragraphs.Count测得的段落数与工具、字数统计是不一样的。

    5.         如果这样统计:表格中单元格中类似的 且不为空就为一个段落,否则不算。这就与工工具、字数统计的段落数一样了。

    6.         如果要新建一个表格,再添加一些字符(包括数字)的话,更好的方法是:先字符写入文档中(当然,要加一些标记,以便确定单元格),再利用Word的表格、转换、文字转换为表格。这样,速度快一些。有以下的代码为证。

    Sub 表格5()

    '先放到文档,再放入表格

    Dim i%, astring As String

    Dim adoc As Document

    Dim atime As Long

    Application.ScreenUpdating = False '关闭屏幕更新

    atime = Timer '设atime为正前时间

    For i = 1 To 1000

        astring = astring & i & Chr(13)

    Next

        Set adoc = Documents.Add

            adoc.Content = astring

            adoc.Range.ConvertToTable Separator:=wdSeparateByParagraphs, NumColumns:=10, _

            NumRows:=100

    Application.ScreenUpdating = True

        MsgBox "先放到文档的运行时间为:" & Timer - atime

        '1.28,1.07,1.03

    End Sub

    Sub 表格6()

    '先生成表格,再向单元格中添数

    Dim i%, astring As String

    Dim adoc As Document

    Dim atime As Long

    Dim atable As Table

    Application.ScreenUpdating = False '关闭屏幕更新

    atime = Timer '设atime为正前时间

    Set adoc = Documents.Add

    Set atable = adoc.Tables.Add(Selection.Range, 100, 10)

    With atable.Range

        For i = 1 To 1000

            .Cells(i).Range.Text = i

        Next

    End With

    Application.ScreenUpdating = True

        MsgBox "先放到文档的运行时间为:" & Timer - atime

        '16.3,15.53,15.35

    End Sub

    '几乎是15倍的差别,谁快谁慢应该大家知道了。还顺带说一话:有的软件在操作Word的表格时,就是用类似于“表格6”的方法,而且也没有用Appplication.ScreenUpdating=true。所以,看上去就像在看动画片。(例如:“青山预算之星”的“输出到Word”就是)看来,国产软件还需努力。

    7.         有些尤意末尽的,大家慢慢在程序中体会。

    8.         特别强调:微软本身的许多功能,不是一般的VBA的程序,比VBA要快很多,不明白内部是用什么语言或什么原理在工作。例如:a.邮件合并,速度奇快。如果你试着用VBA来做,速度奇慢。b.修订功能;c.工具、宏、命令listcommands的运行速度。
    等等,都是我们VBA一族所不能及的。(不过来,如果我们的VBA与微软快,微软不PK我们才怪。呵呵,阿Q精神一下,找一下心理平衡。

    展开全文
  • 在word vba中Range、Selection 对象有多种移动、定位、选择文本内容的方法和属性。 这些方法和属性中,有两类枚举常量是经常要用到的,一类是移动、定位、选择的单位常量WdUnits,比如是按照行、段落、单词、还是...

    转自:http://www.exceloffice.net/archives/1598

    在word中经常需要操作特定位置的文本内容,定位文本内容就显得尤为重要。

    在word vba中Range Selection 对象有多种移动、定位、选择文本内容的方法和属性。

    在这些方法和属性中,有两类枚举常量是经常要用到的,一类是移动、定位、选择的单位常量WdUnits,比如是按照行、段落、单词、还是句子进行移动、定位。

    以下就是在word中会用到的16种单位常量枚举:

    名称说明常量的定义
    wdCell121个单元格Const wdCell=12
    wdCharacter11个字符Const wdCharacter=1
    wdCharacterFormatting13字符格式Const wdCharacterFormatting=13
    wdColumn9一列Const wdColumn=9
    wdItem16选中的项目Const wdItem=16
    wdLine5一行Const wdLine=5
    wdParagraph4一个段落Const wdParagraph=4
    wdParagraphFormatting14段落格式Const wdParagraphFormatting=14
    wdRow10一行Const wdRow=10
    wdScreen7一个屏幕Const wdScreen=7
    wdSection8一个节Const wdSection=8
    wdSentence3一句话Const wdSentence=3
    wdStory6全文Const wdStory=6
    wdTable15一个表格Const wdTable=15
    wdWindow11一个窗口Const wdWindow=11
    wdWord2一个单词Const wdWord=2

    另一类是移动、定位、选择的方向枚举常量WdMovementTypeWdCollapseDirection等。

    如下所示:

    名称说明常量的定义
    wdExtend1将当前的选择区域的结尾扩展到指定单位的结尾Const wdExtend=1
    wdMove0取消当前的选择区域,

     

    然后将光标移动到指定单位的结尾

    Const wdMove=0
    wdCollapseStart1取消当前的选择区域,然后将光标定位到开头Const wdCollapseStart=1
    wdCollapseEnd0取消当前的选择区域,然后将光标定位到结尾Const wdCollapseEnd=0

    1.使用Collapse方法快速取消选择内容区域,使光标不选中任何一个字符。

    Visual Basic

    Sub QQ1722187970() Const wdCollapseStart = 1 Const wdCollapseEnd = 0 With Word.Selection .Collapse (wdCollapseStart) '不带参数默认是wdCollapseStart .Collapse End With End Sub

    1

    2

    3

    4

    5

    6

    7

    8

    9

    Sub QQ1722187970()

        Const wdCollapseStart = 1

        Const wdCollapseEnd = 0

        With Word.Selection

            .Collapse (wdCollapseStart)

            '不带参数默认是wdCollapseStart

            .Collapse

        End With

    End Sub

    如果在word文档中选中了某段文本内容区域,则运行上述代码将取消选中文本内容区域,光标将定位在取消选择前的文本内容区域的起始位置。如果把参数改为wdCollapseEnd,则定位在结束位置。

    如果要折叠的区域是一个段落,则wdCollapseEnd后将定位在当前段落标记符之后的一个字符前,也就是下一个段落的开头。如果要折叠的区域是整个word文档的最后一个段落,则wdCollapseEnd后将定位到最后一个段落标记符前。

    可以用以下的代码进行验证:

    Visual Basic

    Sub QQ1722187970() Dim oDoc As Document Set oDoc = Word.ActiveDocument Dim oRng As Range Dim oP As Paragraph With oDoc Set oP = .Paragraphs(1) Set oRng = oP.Range Debug.Print oRng.Start, oRng.End oRng.Collapse 0 Debug.Print oRng.Start, oRng.End End With End Sub

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    Sub QQ1722187970()

        Dim oDoc As Document

        Set oDoc = Word.ActiveDocument

        Dim oRng As Range

        Dim oP As Paragraph

        With oDoc

            Set oP = .Paragraphs(1)

            Set oRng = oP.Range

            Debug.Print oRng.Start, oRng.End

            oRng.Collapse 0

             Debug.Print oRng.Start, oRng.End

        End With

    End Sub

    2.使用HomeKey和 EndKey方法使光标定位到指定单位内容的开头和结尾。

    Visual Basic

    Sub QQ1722187970() With Word.Selection .HomeKey wdLine Debug.Print .Start .EndKey wdLine Debug.Print .End End With End Sub

    1

    2

    3

    4

    5

    6

    7

    8

    Sub QQ1722187970()

        With Word.Selection

            .HomeKey wdLine

            Debug.Print .Start

            .EndKey wdLine

            Debug.Print .End

        End With

    End Sub

    上述代码将返回光标所在的内容区域的那一行的开始位置和那一行的结束位置。

    如果要从当前光标所在的位置开始扩展选择的话,可以添加第二个参数,代码如下:

    Visual Basic

    Sub QQ1722187970() With Word.Selection .HomeKey wdLine, wdExtend .EndKey wdLine, wdExtend End With End Sub

    1

    2

    3

    4

    5

    6

    Sub QQ1722187970()

        With Word.Selection

            .HomeKey wdLine, wdExtend

            .EndKey wdLine, wdExtend

        End With

    End Sub

    经过测试,HomeKey和 EndKey方法的第一个参数unit只能用wdLine和wdStory,其它单位都不能用。

    3.使用StartOfEndOf方法实现与HomeKey、EndKey类似的效果。

    4.使用Expand方法扩展当前的选择区域

    代码如下:

    Visual Basic

    Sub QQ1722187970() With Word.Selection .Expand wdParagraph End With End Sub

    1

    2

    3

    4

    5

    Sub QQ1722187970()

        With Word.Selection

            .Expand wdParagraph

        End With

    End Sub

    它与EndOf、EndKey、HomeKey等方法不同的是,它会自动当当前选择区域左右扩展到指定的单位区域内,比如当选中某个段落中的某些文本内容时,使用上述代码将自动选中当前选择区域所在的整段段落区域。

    5.使用Shrink方法不断地收缩选区

    Shrink方法可以将当前的选择区域按照整个文档(entire document),节( section),段落( paragraph),句子( sentence),单词( word),插入点( insertion point)的顺序不断地收缩当前的选择区域。

    6.使用Extend方法不断地扩展选区,或者按照指定的字符扩展选区。

    与Shrink方法类似的,当使用Extend方法不带参数时,可以按照单词(word),句子( sentence),段落( paragraph),节( section),整个文档( entire document)这样的顺序依次扩展当前的选择区域。

    当Extend方法带参数时,它可以带一个字符参数,表示将与当前选择区域的结尾位置开始向下寻找该字符,如果找到了就扩展当前的选区到该字符。这里要特别注意的就是,该参数只能是一个字符,如果超过一个字符,该方法将会无效。

    代码如下:

    Visual Basic

    Sub QQ1722187970() With Word.Selection .Extend "点" End With End Sub

    1

    2

    3

    4

    5

    Sub QQ1722187970()

        With Word.Selection

            .Extend "点"

        End With

    End Sub

    利用这个方法可以实现很多逐字符判断的程序。

    7.使用Move方法快速地前后移动任意的单位:

    使用Move方法有两个参数,一个是Unit参数,表示要移动的单位,另一个参数是Count,表示要移动的单位数量,如果是负数则往前移动,如果是正数则往后移动。

    比如如下的代码可以定位到中间的页面:

    Visual Basic

    Sub QQ1722187970() '当前位置插入一个分节符 Word.Selection.InsertBreak wdSectionBreakNextPage '继续插入一个分节符 Word.Selection.InsertBreak wdSectionBreakNextPage '定位到中间的页面 Word.Selection.Move wdSection, -1 End Sub

    1

    2

    3

    4

    5

    6

    7

    8

    Sub QQ1722187970()

        '当前位置插入一个分节符

        Word.Selection.InsertBreak wdSectionBreakNextPage

        '继续插入一个分节符

        Word.Selection.InsertBreak wdSectionBreakNextPage

        '定位到中间的页面

        Word.Selection.Move wdSection, -1

    End Sub

     

    其它相关文章推荐:

    展开全文
  • 使用VBA 修改word文档,添加文本框并文本框中加入表格,修改表格中某个单元格的值
  • 因为个人习惯将所学归纳总结,常常写WORD,但是写完的代码只能以高清截图的方式放到WORD里面,查看的时候还得放大,同时图片多了之后整个WORD文档很臃肿,所以网上搜索前人的经验之后,此基础上增加了些许改动,...
  • Sub create() ' ' create 宏 ' ' Dim docActive As Document  Dim tblNew As Table  Dim celTable As Cell  Dim intCount As Integer  Set docActive = ActiveDocument  Set tblNew = docAc
  • word的宏_vba统一设置表格宽度

    万次阅读 2017-12-05 11:35:09
    近来需要编辑一个文档,其中有一个问题,就是把表格都设置为100宽,因为表格很多,处理很麻烦,于是就打算学下vba,把表格处理好. 把内容存下来用于后续参考。宏的简单操作宏一个实用操作就是 录用-> 执行, 比如,...
  • Excel VBA 操作 Word(入门篇)

    万次阅读 多人点赞 2018-07-03 13:14:56
    原文地址本文的对象是:有一定Excel VBA基础,对Word VBA还没有什么认识,想Excel中通过VBA操作Word还有困难的人。 一、新建Word引用需要首先创建一个对 Word Application 对象的引用。在VBA中,工具-引用,选取...
  •  '******************************村名下对应的所有目录下搜索XLS文件*******************************    For Each Key In CunDic.keys '查找所有目录中的控制点文件    For m = 0 To UBound(CGType) - 1  ...
  • 即指定段落中的字符与行网格对齐 .FarEastLineBreakControl = True '将东亚语言文字的换行规则应用于指定的段落 .WordWrap = True '指定段落或文本框的西文单词中间断字换行 .HangingPunctuation = True '指定段落...
  • 1,打开一个doc文档; 2,代码编写: 变量定义 .版本 2 .局部变量 wdapp, 对象 ... .... .... .... ....' doc文档中精确定位表格单元格中并写入文本 wdapp.获取(“word.application”) ' 加载已经打开的d...
  • Word批量给每个单元格插入书签

    千次阅读 2017-11-16 15:53:13
    项目中需要生成word报表。网上找了些用代码直接...当表格中存在大量单元格时,一个一个添加书签非常麻烦。于是使用脚本来替代重复的工作。 在word页面Alt+F11打开编辑器, 输入 Sub TestAddMarket()  Dim M
  • 关于VBA编辑word自动生成报告

    万次阅读 2016-08-02 20:15:59
    关于VBA编辑word自动生成报告 这适合于图比较多,表比较多,并且报告格式单一,但每天需要大量出word报告的情况 -工具使用 -难点 -功能块 参考文件 工具 如图片所示,虽然版本可以不同,但库的类别相差...
  • word-vba应用

    2020-04-16 17:51:31
    本文的对象是:有一定Excel VBA基础,对Word VBA还没有什么认识,想Excel中通过VBA操作Word还有困难的人。 一、新建Word引用 需要首先创建一个对 Word Application 对象的引用。在VBA中,工具-引用,选取...
  • VBA+批处理实现WORD转EXCEL数据分析开发日志WORD程序转EXCEL并处理数据项目目的开发日志2020-09-01(批处理)开发日志V1.2.1 2020-09-05业务流程分以下几步:当前版主要的问题当前版次要的问题技术小结2020-09-05 WORD...
  • 最近vba代码,对word当中的表格进行操作,当时系统传过来的字符串的进行分割之后生成的条数是不确定的。所以要通过代码控制对行的插入 同时将分割之后的字符串进行相应的填充表格当中。具体的代码如下: ...
  • 使用Word过程中,若是掌握一些批量技巧,可以让你工作效率翻番,本期Word妹与大家分享几个超级好用的Word技巧。1、批量对齐图片选中全文,按Ctrl+H打开查找和替换对话框,之后查找中输入代码:^g(表示图形),...
  • 该资源是一个名为Test的excel 文件,下载后打开,如果你的excel是2007版则会加载项里出现Custmization 下拉框,如果是2003版,则直接菜单栏里多出一个Customization下拉框,下拉框里包含三个按钮,其中一个有弹...
  • 通过VBAword中的表格导入到excel中

    万次阅读 2018-04-09 15:43:41
    通过VBAword中的表格导入到...1、添加“开发工具”选项卡 打开word(我的是office2007),点击左上角“office 按钮”,点击“word选项”,打开如下图所示界面:勾选“功能区显示“开发工具”选项卡”2、VBA编辑界...
  • VBA改变单元格中固定字符的颜色

    千次阅读 2011-03-30 09:43:00
    比如我们要将选中的单元格中的字符串"『一時団体情報』"改变为红色,执行以下操作即可。   Private Sub Button_Click() cString = "『一時団体情報』" nColor = 3 nLenth = Len...
  • 使用vba为excel文字添加下划线

    千次阅读 2013-08-11 15:13:12
    使用vba为excel文字添加下划线,示例代码 Sub city() Dim a As String Dim b1 As String Dim b2 As String Dim b3 As String For i = 2 To 45 For j = 2 To 13 a = Worksheets("主要城市").Cells(i, j)
  • (转)Excel VBA 操作 Word(入门篇)

    千次阅读 2018-04-14 20:45:00
    本文的对象是:有一定Excel VBA基础,对Word VBA还没有什么认识,想Excel中通过VBA操作Word还有困难的人。 一、新建Word引用 需要首先创建一个对 Word Application 对象的引用。在VBA中,工具-引用,选取...
  • 语法 expression.AddPicture( FileName , LinkToFile , SaveWithDocument , Left , Top , Width , Height ) expression 一个表示 Shapes 对象的变量。 参数 参数 名称 必需/可选 ...MsoTriStat
  • Excel给每个单元格都有一个默认的名字,其命名规则是列标加横标,例如D3表示第四列、第三行的单元格。...→【定义】命令这时显示【定义名称】对话框,当前工作簿中的名称】框里输入名字,点...
  • 巧用VBA自动处理Word表格

    千次阅读 2006-06-08 10:45:00
    巧用VBA自动处理Word表格 来源:...而Visual Basic for Applications(VBA)的应用更为Word 增添了不少特色,合理而恰当地使用VBA可为用户提供极大的方便。下面介绍几则使用VBA编程自动处理Word表格的例子。
  • Word VBA 常用语句

    2019-07-26 14:36:09
    原文地址:WordVBA常用语句作者:cathay 转帖:从n多地方google出来的。。。。。。。。。 '定制模块行为 '(1)强制对模块内所有变量进行声明 Option Explicit '标记模块为私有,仅对同一工程中其它模块有用,宏...

空空如也

空空如也

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

vba在word的单元格添加