将数据从 Excel 复制到 Mac 上的新 Word 文档

问题描述 投票:0回答:1

我编写了 Office 365、Excel VBA 代码,将数据从 Excel 复制到新的 Word 文档。

该代码可在 Windows PC 上运行。

在 Apple Mac 上,它锁定在

.Paste
命令上。

此后我添加了两项操作系统类型测试。
一个用于应用程序绑定(不确定是否需要,但以防万一),但不知道 Apple Mac 语法使用什么。
另一个是目前

.Paste
声明的失败点。

如何解析 Mac 语法?

我通过宏暂时放入 Msg 测试行,以确定 Mac 上的失败位置。 它到达了

.Paste
语句之前的行,但没有到达
.Paste
之后的消息。

Sub WriteToWord() 

    'Which Operating System is this Macro being run on 
    Dim OSname As String 
    OSname = Application.OperatingSystem 
    If InStr(1, OSname, "windows", vbTextCompare) Then 
        OStype = 1  'ie Windows OS 
    Else 
        OStype = 2  'ie Mac OS 
    End If 
     
    If OStype = 1 Then  ' ie Winidows OS 

        'Application Binding - Late 
        Dim wdApp As Object 
        Set wdApp = CreateObject("Word.Application") 
    Else    ' ie MAC OS 
       ' This needs to be updated for MacOS if it is different from Windows or remove the If test

    End If 

    ' Set variables 
    Set wb = ThisWorkbook 
    Set wsPISDetail = Sheets("PIS Detail") 
    Set wsPISWordLoad = Sheets("PIS Word Load") 
    PISRow = 0 
    colA = 1 
    colB = 2 
    colP = 16      

    'Get the PIS Response ROW to write to Word Document 
    PISRow = Application.InputBox("Enter the Row Number to Write to MS Word")      

    'Get PIS Response Data 
    wsPISDetail.Select 
    Range(Cells(PISRow, colA), Cells(PISRow, colP)).Select 
    Application.CutCopyMode = False 
    Selection.Copy 
    wsPISWordLoad.Select 
    Range(Cells(1, colB), Cells(16, colB)).Select 
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:= _ 
        False, Transpose:=True 
    Set PISData = wsPISWordLoad.Range("A1:B16")     

    'Create and Write to the new Word Document 
    With wdApp 
        .Visible = True 
        .Activate        
        Set wdDoc = .documents.Add        

        With .Selection 
            .ParagraphFormat.Alignment = wdAlignParagraphLeft 
            .Font.Size = 11 
            .TypeParagraph         

            If OStype = 1 Then  ' ie Winidows OS 
            PISData.Copy 
            .Paste 
            Else    ' ie MAC OS 
            ' MacStuff 
            ' before i put this IF test in, it is the .Paste statement above that fails on MacOS 
            End If             

        'Header 
            With wdDoc.Sections(1).Headers(1).Range 
                .Font.Name = "Arial" 
                .Font.Size = 14 
                .Font.Bold = True 
                .InsertAfter Text:="Header 1 text stuff)" 
                .InsertAfter vbNewLine 
                .InsertAfter vbNewLine 
                .Font.Name = "Arial" 
                .Font.Size = 12 
                .InsertAfter Text:="Header 2 text stuff" 
                .Font.Bold = False 
            End With         

        'Footer 
            Set PISOrgName = wsPISWordLoad.Range("B1") 
            With wdDoc.Sections(1).Footers(1).Range 
                .InsertAfter PISOrgName 
                .InsertAfter vbTab 
                .InsertAfter vbTab 
                .InsertAfter Text:="Page " 
                .Fields.Add Range:=.Characters.Last, Text:="PAGE", PreserveFormatting:=False 
                .InsertAfter Text:=" of " 
                .Fields.Add Range:=.Characters.Last, Text:="NUMPAGES", PreserveFormatting:=False 
              End With 
        End With 
    End With 

'When the macro ends take the cursor to this Worksheet 
    With wsPISDetail 
        .Select 
    Range("A2").Activate 
    End With 

End Sub
excel vba macos ms-word copying
1个回答
0
投票

FWIW 我无法让 .Paste 或任何 .Paste 变体(.PasteSpecial 等)在当前版本的 Mac Excel/Word 上工作。如果您在 StackOverflow 中搜索

[ms-word] [excel] [macOS] Paste

您会发现一些建议,其中之一可能适合您。这似乎是与在 Mac 上使用跨应用程序自动化相关的一系列问题之一。下面详细介绍一下。

我目前的“解决方案”,没有经过很好的测试,目前也不是很强大,是在Word的Normal模板中放置一个宏来执行粘贴,并使用Word的Application.Run方法来运行它。即,您在 Normal.dotm(在 Word 的 VB 编辑器中)中创建一个新模块,并在其中创建一个 Sub mypaste() 。本来我尝试过

Sub mypaste()
Selection.Paste
End Sub

然后在 Excel 中,而不是

With wdApp
.
.
  With.Selection
  .
  .
    .Paste

你愿意

With wdApp
.
.
  With.Selection
  .
  .
  End With
  .Run "mypaste"

除了即使这样也挂了。所以,我尝试异步运行 .Paste,如下所示:

Sub mypaste()
Application.OnTime Date + (Timer + 0.1) / 86400#, "myRealpaste"
End Sub

Sub myRealPaste()
Application.Selection.Paste
End Sub

这似乎确实有效。这表明该问题与 Excel 在同一线程上复制和粘贴有关。 (本质上,Application.OnTime 启动一个新线程,然后继续,因此 Excel VBA 调用的任何内容实际上都不会执行粘贴。)

建议在 .Run "mypaste" 之后立即在 Excel 代码中放置一点延迟。有几种方法可以做到这一点,我让你研究一下。

Normal.dotm 不是存储任何宏的好地方,但在这种情况下,我还没有弄清楚如何将相同的代码放入某种插件中,加载它并调用它。

关于您的代码的其他一些完全不相关的注释:

  • 如果需要,您应该能够使用编译时常量和 编译时 #If 块来确定您的代码是哪个操作系统 正在运行,例如

    #如果是 Mac 那么 操作系统类型 = 2 #别的 操作系统类型 = 2 #结束如果

(或者不必设置 OSType 变量,只需用 #If 块包围相关代码块)

  • 最好声明 wdDoc 等变量,并在使用完它们后将其值设置为 Nothing。

最后,AFAICS Microsoft 从未对我见过的有关此主题的任何消息做出明显回应。这对他们来说并不罕见,但这确实让我想知道他们的开发人员是否知道如何配置 MacOS 以避免此类问题,并且实际上忘记了他们必须这样做,因此从未告诉我们其他人。如果是这样,可能与沙箱有关。有一次,我什至尝试使用美国版的 Mac 和 MS 软件来设置我的整个系统,以防万一这是秘密成分,但显然不是。或者也许这个东西在苹果芯片上表现更糟(我这里有一个小型的 M1 Mac mini)。

© www.soinside.com 2019 - 2024. All rights reserved.