скопируйте Excel в Word, затем запустите макрос в Word, затем скопируйте обратно в Excel [дубликат]

Чтобы выполнить модификацию запросов, вам необходимо аннотировать метод с дополнительным @Modifying, как описано в справочной документации следующим образом:

@Modifying
@Query("update Content v set v.published = false where v.division = :division and v.section = :section")
void unPublishContent(@Param("division") String division, 
                     @Param("section") String section);

1
задан Community 9 July 2018 в 19:34
поделиться

2 ответа

Вы не можете использовать глобальные объекты Excel изнутри Word без явной квалификации (они просто там не существуют). В частности, это означает, что вы не можете использовать Sheets. Вы также должны явно объявлять типы переменных своих параметров, иначе они будут рассматриваться как Variant. Это важно для ссылочных типов, поскольку это помогает предотвратить ошибки во время выполнения, потому что компилятор знает, что ключевое слово Set требуется.

Sub divider(wb1 As Object, dt1 As Document)
    Set dt1 = ThisDocument
    If dt1.Paragraphs.Count > 65000 Then
        Set cutrange = dt1.Range(dt1.Paragraphs(1).Range.Start, dt1.Paragraphs(65000).Range.End)
        If wb1.Sheets(wb1.Sheets.Count).Cells(1, 1) <> "" Then
            wb1.Sheets.Add After:=wb1.Sheets.Count
        End If
    Else
        Set cutrange = dt1.Content
        If wb1.Sheets(wb1.Sheets.Count).Cells(1, 1) <> "" Then
            wb1.Sheets.Add After:=wb1.Sheets.Count
        End If
    End If
    cutrange.Cut Destination:=wb1.Sheets(wb1.Sheets(wb1.Sheets.Count)).Cells(1, 1)
    wb1.Sheets(wb1.Sheets.Count).Cells(1, 1).TextToColumns Destination:=wb1.Sheets(1).Cells(1, 1)
End Sub

Примечание. Вам также не нужно передавать dt1 вообще. Вы никогда не используете значение в параметре и фактически устанавливаете его на что-то еще. Это может быть источником ошибок, если вы используете внутренние вызовы, потому что dt1 неявно передается ByRef (он получает бокс, когда вы вызываете его через Application.Run). Это означает, что всякий раз, когда вы вызываете divider, все, что вы передаете dt1 в вызывающем коде, будет изменено на ThisDocument. Вы должны либо удалить параметр, либо указать, что он ByVal.

2
ответ дан Comintern 16 August 2018 в 00:25
поделиться
  • 1
    Я смущен тем, как Set dt1 = wordapp.Documents.Open(wpath) и dt1 = ThisDocument оказываются разными: разве они не указывают на одно и то же? - но если это помогает, хорошо (что значит «вставить» и т.д.)? И ... э-э, какой тип переменной был бы cutrange be (является ли это той переменной, которую вы подразумеваете, я должен явно объявить?)? Я действительно не знаю, как работает слово vba, поэтому ближайший я могу догадаться, это строка ... Кроме того, я подумал, что если вы включите библиотеку excel, тогда вы можете использовать такие вещи, как листы и еще много чего. Должен ли я тогда просто разрезать его и вернуть его в макрос Excel? – Graham Perry 27 January 2017 в 20:41
  • 2
    Извините, если это много (возможно, глупых) вопросов, но я никогда не пытался ничего близкого к этому сложному с использованием vba раньше, никогда не использовал vba в слове раньше, так что это немного подавляющее. – Graham Perry 27 January 2017 в 20:42
  • 3
    Вы передаете переменную dt1 из Excel в Word. Первое, что вы делаете, это установить на ThisDocument. Не имеет значения, что это было в вызывающей функции. – Comintern 27 January 2017 в 20:42
  • 4
    Легче концептуализировать, если переменные имеют разные имена в каждой функции. – Comintern 27 January 2017 в 20:44
  • 5
    Ааа, ладно. Я пытаюсь сохранить переменные одинаковыми, так что легче следовать тому, что относится к чему, но это выглядело так, потому что строка wb1 терпела неудачу, так же как и dt1. Таким образом, вместо этого вы бы рекомендовали, а затем просто возвращали прерывание и позволяли макросу Excel обрабатывать его, поскольку Word не может использовать листы? Или есть способ предоставить Word возможность обрабатывать листы? Я также до сих пор не понимаю, что вы имели в виду при объявлении типов переменных переменных. Благодаря! – Graham Perry 27 January 2017 в 20:52

Заимствован из другой ссылки SO.

Sub Sample()
    Dim wdApp As Object, newDoc As Object
    Dim strFile As String

    strFile = "C:\Some\Folder\MyWordDoc.dotm"

    '~~> Establish an Word application object
    On Error Resume Next
    Set wdApp = GetObject(, "Word.Application")

    If Err.Number <> 0 Then
        Set wdApp = CreateObject("Word.Application")
    End If
    Err.Clear
    On Error GoTo 0

    wdApp.Visible = True

    Set newDoc = wdApp.Documents.Add(strFile)

    Call wdApp.Run("YHelloThar", "Hello")

    '
    '~~> Rest of the code
    '
End Sub
1
ответ дан ryguy72 16 August 2018 в 00:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: