标签: word-vba

从MS Word中提取数据

我正在寻找一种从Word文件中提取/抓取数据到数据库的方法.我们的公司程序与MS Word文件中记录的客户会议记录,主要是由于历史和惯性.

我希望能够从这些会议纪要行动项目拉进一个数据库,以便我们可以从一个Web界面访问它们,把它们变成任务,因为他们完成了更新.

这是最好的方法:

  1. 从Word里面的VBA宏创建CSV然后上传到DB?
  2. VBA宏在Word中使用连接数据库(一个人如何从VBA连接到MySQL?)
  3. 通过win32com的Python脚本然后上传到DB?

最后一个是我的吸引力,因为网络界面正在使用Django建成的,但我从来没有使用win32com或蟒蛇试图脚本字.

编辑:我已经开始提取与VBA的文本,因为它使得它更容易一些处理Word对象模型.我遇到了一个问题 - 所有文本都在表格中,当我将字符串拉出我想要的CELLS时,我会在每个字符串的末尾得到一个奇怪的小方框字符.我的代码看起来像:

sFile = "D:\temp\output.txt"
fnum = FreeFile
Open sFile For Output As #fnum

num_rows = Application.ActiveDocument.Tables(2).Rows.Count

For n = 1 To num_rows
    Descr = Application.ActiveDocument.Tables(2).Cell(n, 2).Range.Text
    Assign = Application.ActiveDocument.Tables(2).Cell(n, 3).Range.Text
    Target = Application.ActiveDocument.Tables(2).Cell(n, 4).Range.Text
    If Target = "" Then
        ExportText = ""
    Else
        ExportText = Descr & Chr(44) & Assign & Chr(44) & _
            Target & Chr(13) & Chr(10)
        Print #fnum, ExportText
    End If
Next n

Close #fnum
Run Code Online (Sandbox Code Playgroud)

小控制字符框有什么用?是什么类型的字符代码来自Word?

python vba ms-word pywin32 word-vba

5
推荐指数
1
解决办法
6729
查看次数

Word宏,存储当前选择(VBA)

我有一个Word文档,其中包含大约4000个表单字段,我必须将其导出到数据库.问题是4000个字段中没有一个在"书签"字段中有信息,因此我无法获得存储在其中的信息.

我正在尝试创建一个宏来帮助编写书签(FormField.Name)的过程,但无法设法做到正确.问题是我想要更改用户选择中包含的FormFields的名称,并且只更改它们.我设法找到了这个解决方案:

Sub Macro2()
    Dim myFile As String
    Dim fnum As Integer
    Dim sFileText As String
    Dim currentField As FormField

    myFile = "c:\testMacro.txt"
    fnum = FreeFile()
    Open myFile For Input As fnum

    For Each currentField In Selection.FormFields
        Input #fnum, sFileText

        With currentField
            .StatusText = sFileText
            .OwnStatus = True
        End With

        currentField.Select
        Application.WordBasic.FormFieldOptions Name:=sFileText
    Next currentField
End Sub
Run Code Online (Sandbox Code Playgroud)

但它不起作用,因为在For Each循环中更改了Selection对象,之后它只包含选择的第一个FormField.

所以这是我的问题,有没有办法保存当前选择并在更改后加载它.

我试过了 :

Dim mySelection as Selection
Set mySelection = Selection
Run Code Online (Sandbox Code Playgroud)

但是如果我改变了Selection,变量mySelection也会改变(这很正常......)而且我没有找到任何克隆对象的方法.

有人知道如何做到这一点?

谢谢

vba ms-word word-vba

5
推荐指数
1
解决办法
2万
查看次数

Word中的Visual Basic宏调整大小/居中/删除所有图像

我在网上找到了一个VBA宏来调整Word文档中的所有图像:

Sub ResizeAllImages()
''# make all images (both inline and floating)
''# 11 cm wide while preserving aspect ratio

Dim oShp As Shape
Dim oILShp As InlineShape

For Each oShp In ActiveDocument.Shapes
    With oShp
        .Height = AspectHt(.Width, .Height, _
        CentimetersToPoints(11))
        .Width = CentimetersToPoints(11)
    End With
Next

For Each oILShp In ActiveDocument.InlineShapes
    With oILShp
        .Height = AspectHt(.Width, .Height, _
        CentimetersToPoints(11))
        .Width = CentimetersToPoints(11)
    End With
Next
End Sub
Run Code Online (Sandbox Code Playgroud)

我找不到可用于对齐所有图像的方法的名称.有谁知道我需要添加什么,以及我必须添加它的位置?

最后,我想删除我觉得太小的图片.我该怎么做...如果形状的宽度小于5,并且形状的高度小于5,则删除形状.

为了便于阅读大量在线文本,我有时希望将所有内容粘贴到单词中,然后重新排列.我用句号 - 手动线替换每个句点 - 空格,这为每个句子提供了一个新的行.我就读得更好了.由于我粘贴了所有东西,图形也来了,所以我希望能够控制所有图像的大小,并摆脱任何不必要的图像.

ms-word word-vba

5
推荐指数
1
解决办法
4万
查看次数

查找黄色文本的所有实例并将字体颜色更改为红色

我需要一个vba宏来搜索MS Word 2007文档中字体颜色为黄色的所有文本并将其更改为红色.打印输出中不会显示黄色.手动选择和更改将花费我几个小时.

vba ms-word word-vba

5
推荐指数
3
解决办法
3万
查看次数

如何获取Word应用程序的Hwnd/Process Id,并将其设置为Foreground Window

我希望我的Word应用程序在自动化完成后进入前台.

Excel中的等效项是直接的 - Excel Application对象具有.Hwnd属性,您可以将其与Windows API结合使用:

SetForegroundWindow((IntPtr)excelApp.Hwnd);
Run Code Online (Sandbox Code Playgroud)

但是,Word应用程序没有.Hwnd属性.

我尝试在这个序列中使用Activate():

wordDoc.Activate();
wordApp.Activate();
Run Code Online (Sandbox Code Playgroud)

但这不起作用.

我已经看过使用应用程序名称查找进程,但可能有多个Word运行副本.

谢谢

c# vba office-interop word-vba

5
推荐指数
1
解决办法
7457
查看次数

从Word Doc表单控件获取数据

我正在Word.docm(启用了宏的Word 2013 doc)中构建表单,旨在对Access数据库进行编程以从完成的表单中导入数据。我已经放置了textBox和comboBox控件来接收用户输入,但是我无法取出数据。

我看过的示例使用了Document.FormFields这样的集合(在Word中):

Dim fld as FormField
for each fld in ActiveDocument.FormFields
    Debug.Print fld.Name & " - " & fld.Result.Text
next
Run Code Online (Sandbox Code Playgroud)

但是在我的文档中Document.FormFields是空的,但是Document.Fields有19个元素,恰好是表单中控件的数量。很好,除了我似乎无法使用Field对象获得任何控件的名称或值。Field.Result.Text始终为空白,并且没有Field.Name属性。

那么,Field对象和FormField对象之间有什么区别?为什么我Fields看到的所有示例都使用我的控件FormFields

我使用了错误的表单控件吗?遗留控件,ActiveX控件和内容控件共有三种类型(我希望我不是唯一认为这很荒谬的一种)。我正在使用ActiveX类型。

ms-access vba ms-word access-vba word-vba

5
推荐指数
1
解决办法
1万
查看次数

文档中链接对象的文件路径的VBA列表

我有许多大型Microsoft Word文档,其中包含许多Microsoft Excel电子表格中的许多链接文件.打开Word文档时,即使未选中"打开时更新链接文件"选项:

在此输入图像描述

Word仍会通过打开和关闭每个链接的相关Excel电子表格来检查其源头的每个链接(因此,对于x个链接,即使来自同一个电子表格,Word也会打开并关闭电子表格x次).这意味着打开文档需要很长时间.

我发现如果包含链接对象源的电子表格已经打开,文档打开得更快,因此Word不会保持打开,关闭,重新打开它们.

到目前为止,我所拥有的解决方案的开头是创建链接对象的所有文件路径的列表,通过以下VBA代码完成:

Sub TypeArray()

Dim List(), Path As String
Dim i, x As Integer
Dim s As InlineShape
Dim fso As FileSystemObject, ts As TextStream

Set fso = New FileSystemObject
Set ts = fso.OpenTextFile("C:\MyFolder\List.txt", 8, True)

With ts
    .WriteLine (ActiveDocument.InlineShapes.Count)
End With

For Each s In ActiveDocument.InlineShapes
        Path = s.LinkFormat.SourcePath & "\" _
        & s.LinkFormat.SourceName
        With ts
            .WriteLine (Path)
        End With
Next s
End Sub

'-------------------------------------------------------------------------------------- …
Run Code Online (Sandbox Code Playgroud)

excel vba ms-word excel-vba word-vba

5
推荐指数
1
解决办法
3548
查看次数

Excel VBA:在向MS-Word添加文本时设置字体样式和大小

我想使用Excel VBA创建一个word文档,并添加各种字体样式和大小的文本.这是我的代码:

Sub CreateNewWordDoc()
    Dim wrdDoc As Word.Document
    Dim wrdApp As Word.Application
    Set wrdApp = CreateObject("Word.Application")
    Set wrdDoc = wrdApp.Documents.Add

    Dim charStart As Long
    Dim charEnd As Long

    With wrdDoc
        For i = 1 To 3
            charStart = wrdApp.Selection.Start
            .Content.InsertAfter (" some text")
            charEnd = wrdApp.Selection.End
            If i = 1 Then
                'set the text range (charStart,charEnd) to e.g. Arial, 8pt
            Else
                If i = 2 Then
                    'set the text range (charStart,charEnd) to e.g. Calibri, 10pt
                Else
                    'set the text range …
Run Code Online (Sandbox Code Playgroud)

fonts vba ms-word excel-vba word-vba

5
推荐指数
1
解决办法
3万
查看次数

如何以编程方式更改"不要在相同样式的段落之间添加空格"?

我正在尝试以编程方式更改"不要在相同样式的段落之间添加空格".为了解决这个问题,我录制了一个宏,在此期间我打开了段落对话框(页面布局>段落),选中了复选框(不添加空格)和宏,在此期间我取消选中复选框(添加空格).两者都不影响"不要在相同样式的段落之间添加空格"...他们有相同的代码:

Sub AddSpaceBetweenParagraphsOfSameStyle()
'
' AddSpaceBetweenParagraphsOfSameStyle Macro
' Add space between paragraphs of the same style.
'
    With Selection.ParagraphFormat
        .LeftIndent = InchesToPoints(0.5)
        .RightIndent = InchesToPoints(0)
        .SpaceBefore = 12
        .SpaceBeforeAuto = False
        .SpaceAfter = 12
        .SpaceAfterAuto = False
        .LineSpacingRule = wdLineSpaceMultiple
        .LineSpacing = LinesToPoints(1)
        .Alignment = wdAlignParagraphLeft
        .WidowControl = True
        .KeepWithNext = False
        .KeepTogether = False
        .PageBreakBefore = False
        .NoLineNumber = False
        .Hyphenation = True
        .FirstLineIndent = InchesToPoints(-0.25)
        .OutlineLevel = wdOutlineLevelBodyText
        .CharacterUnitLeftIndent = 0
        .CharacterUnitRightIndent = 0
        .CharacterUnitFirstLineIndent = 0
        .LineUnitBefore …
Run Code Online (Sandbox Code Playgroud)

vba ms-word word-vba

5
推荐指数
2
解决办法
4839
查看次数

当我在VBA中读取它们的值时,如何阻止Word选择每个FormField?

我在Word 2013中有一个模板文档,用户填写了大量的Legacy Text FormFields.在文档的最后,我添加了一个按钮,将答案编译成没有格式化的字符串,然后将其复制到剪贴板.

可以工作,但是在读取每个FormField时,Word文档会在每个文本字段和文档末尾之间来回跳过.这在视觉上令人担​​忧.有没有办法收集每个FormField的值而不用Word将光标/焦点移动到每个字段时读取?

以下是代码示例:

Private Sub cmdCreateNote_Click()

    Call cmdClearNote_Click

    Dim ff As FormFields
    Set ff = ActiveDocument.FormFields

    Dim Output As String
    Output = ff("ddReviewType").Result & vbCrLf

    If ff("chFacInfo").Result Then
        Dim FacInfo
        FacInfo = Array("Field1: ", _
            "Field2: ", _
            "Field3: ", _
            "Field4: ", _
            "Field5: ")

        Output = Output & "FIRST SECTION" & vbCrLf

        For Index = 1 To 5
            If ff("chFacInfo" & Index).Result Then
                Output = Output & FacInfo(Index - 1) & ff("txFacInfo" & …
Run Code Online (Sandbox Code Playgroud)

vba ms-word word-vba

5
推荐指数
2
解决办法
441
查看次数