Vba error 6124

Error 6124 on User (NOT DEVELOPER) Machine Word VBA

Hello All,

I have the following code in a UserForm and it works perfectly on the Developer (my) machine:

Code:

Private Sub CashANDCreditButton_Click()
Dim WD As Word.Document
    Set WD = ActiveDocument

  txtPO = POField.Text
  txtFacility = FacilityField.Text
  txtCity = CityField.Text
  txtST = STField.Text
  txtCreditAmount = CreditAmountField.Text
  txtCashAmount = CashAmountField.Text
  txtLocation = LocationField.Text
  Set WD = ActiveDocument
  With WD
    .SelectContentControlsByTag("POTag").Item(1).Range.Text = txtPO
    .SelectContentControlsByTag("FacilityTag").Item(1).Range.Text = txtFacility
    .SelectContentControlsByTag("CityTag").Item(1).Range.Text = txtCity
    .SelectContentControlsByTag("STTag").Item(1).Range.Text = txtST
    .SelectContentControlsByTag("CashAmountTag").Item(1).Range.Text = "$" & txtCashAmount & " CASH and "
    .SelectContentControlsByTag("CreditAmountTag").Item(1).Range.Text = "$" & txtCreditAmount & " CREDIT"
    .SelectContentControlsByTag("LocationTag").Item(1).Range.Text = txtLocation
End With
Unload Me
End Sub

Private Sub CashButton_Click()

Dim WD As Word.Document
    Set WD = ActiveDocument

  txtPO = POField.Text
  txtFacility = FacilityField.Text
  txtCity = CityField.Text
  txtST = STField.Text
  txtCashAmount = CashAmountField.Text
  txtLocation = LocationField.Text
  Set WD = ActiveDocument
  With WD
    .SelectContentControlsByTag("POTag").Item(1).Range.Text = txtPO
    .SelectContentControlsByTag("FacilityTag").Item(1).Range.Text = txtFacility
    .SelectContentControlsByTag("CityTag").Item(1).Range.Text = txtCity
    .SelectContentControlsByTag("STTag").Item(1).Range.Text = txtST
    .SelectContentControlsByTag("CashAmountTag").Item(1).Range.Text = "$" & txtCashAmount
    .SelectContentControlsByTag("CreditAmountTag").Item(1).Range.Text = ""
    .SelectContentControlsByTag("LocationTag").Item(1).Range.Text = txtLocation
End With
Unload Me
End Sub


Private Sub ClearButton_Click()
POField.Text = ""
FacilityField.Text = ""
CityField.Text = ""
STField.Text = ""
LocationField.Text = ""
CashAmountField.Text = ""
CreditAmountField.Text = ""
End Sub

Private Sub CreditButton_Click()
Dim WD As Word.Document
    Set WD = ActiveDocument

  txtPO = POField.Text
  txtFacility = FacilityField.Text
  txtCity = CityField.Text
  txtST = STField.Text
  txtCreditAmount = CreditAmountField.Text
  txtLocation = LocationField.Text
  Set WD = ActiveDocument
  With WD
    .SelectContentControlsByTag("POTag").Item(1).Range.Text = txtPO
    .SelectContentControlsByTag("FacilityTag").Item(1).Range.Text = txtFacility
    .SelectContentControlsByTag("CityTag").Item(1).Range.Text = txtCity
    .SelectContentControlsByTag("STTag").Item(1).Range.Text = txtST
    .SelectContentControlsByTag("CreditAmountTag").Item(1).Range.Text = "$" & txtCreditAmount & " CREDIT"
    .SelectContentControlsByTag("CashAmountTag").Item(1).Range.Text = ""
    .SelectContentControlsByTag("LocationTag").Item(1).Range.Text = txtLocation
End With
Unload Me
End Sub


Private Sub UserForm_Initialize()
Dim WD As Word.Document
    Set WD = ActiveDocument

POField.Text = WD.SelectContentControlsByTag("POTag").Item(1).Range.Text
FacilityField.Text = WD.SelectContentControlsByTag("FacilityTag").Item(1).Range.Text
CityField.Text = WD.SelectContentControlsByTag("CityTag").Item(1).Range.Text
STField.Text = WD.SelectContentControlsByTag("STTag").Item(1).Range.Text
LocationField.Text = WD.SelectContentControlsByTag("LocationTag").Item(1).Range.Text

End Sub

HOWEVER, if any User/Client uses it, it returns an error 6124 on this line:

Code:

.SelectContentControlsByTag("POTag").Item(1).Range.Text = txtPO

I appreciate any and all help in advance! I have tried to Google and can’t find an answer.

Icon Ex Номер ошибки: Ошибка 6124
Название ошибки: Word Error 6124
Описание ошибки: Ошибка 6124: Возникла ошибка в приложении Microsoft Word. Приложение будет закрыто. Приносим извинения за неудобства.
Разработчик: Microsoft Corporation
Программное обеспечение: Microsoft Word
Относится к: Windows XP, Vista, 7, 8, 10, 11

Анализ «Word Error 6124»

Люди часто предпочитают ссылаться на «Word Error 6124» как на «ошибку времени выполнения», также известную как программная ошибка. Разработчики программного обеспечения, такие как Microsoft Corporation, обычно принимают Microsoft Word через несколько уровней отладки, чтобы сорвать эти ошибки перед выпуском для общественности. Поскольку разработчики программного обеспечения пытаются предотвратить это, некоторые незначительные ошибки, такие как ошибка 6124, возможно, не были найдены на этом этапе.

Пользователи Microsoft Word могут столкнуться с ошибкой 6124, вызванной нормальным использованием приложения, которое также может читать как «Word Error 6124». Если происходит «Word Error 6124», разработчикам будет сообщено об этой проблеме, хотя отчеты об ошибках встроены в приложение. Затем Microsoft Corporation будет иметь знания, чтобы исследовать, как и где устранить проблему. Поэтому, когда вы сталкиваетесь с запросом на обновление Microsoft Word, это обычно связано с тем, что это решение для исправления ошибки 6124 и других ошибок.

Когда происходит ошибка 6124?

Сбой во время выполнения Microsoft Word, как правило, когда вы столкнетесь с «Word Error 6124» в качестве ошибки во время выполнения. Вот три наиболее заметные причины ошибки ошибки 6124 во время выполнения происходят:

Ошибка 6124 Crash — Ошибка 6124 остановит компьютер от выполнения обычной программной операции. Если данный ввод недействителен или не соответствует ожидаемому формату, Microsoft Word (или OS) завершается неудачей.

Утечка памяти «Word Error 6124» — этот тип утечки памяти приводит к тому, что Microsoft Word продолжает использовать растущие объемы памяти, снижая общую производительность системы. Возможные провокации включают отсутствие девыделения памяти и ссылку на плохой код, такой как бесконечные циклы.

Ошибка 6124 Logic Error — логическая ошибка Microsoft Word возникает, когда она производит неправильный вывод, несмотря на то, что пользователь предоставляет правильный ввод. Это видно, когда исходный код Microsoft Corporation содержит недостаток в обработке данных.

Microsoft Corporation проблемы с Word Error 6124 чаще всего связаны с повреждением или отсутствием файла Microsoft Word. Как правило, решить проблему позволяет получение новой копии файла Microsoft Corporation, которая не содержит вирусов. Кроме того, некоторые ошибки Word Error 6124 могут возникать по причине наличия неправильных ссылок на реестр. По этой причине для очистки недействительных записей рекомендуется выполнить сканирование реестра.

Типичные ошибки Word Error 6124

Эти проблемы Microsoft Word, связанные с Word Error 6124, включают в себя:

  • «Ошибка программы Word Error 6124. «
  • «Недопустимая программа Win32: Word Error 6124»
  • «Извините, Word Error 6124 столкнулся с проблемой. «
  • «Не удается найти Word Error 6124»
  • «Word Error 6124 не найден.»
  • «Ошибка запуска программы: Word Error 6124.»
  • «Word Error 6124 не работает. «
  • «Word Error 6124 остановлен. «
  • «Ошибка в пути к программному обеспечению: Word Error 6124. «

Проблемы Microsoft Word Word Error 6124 возникают при установке, во время работы программного обеспечения, связанного с Word Error 6124, во время завершения работы или запуска или менее вероятно во время обновления операционной системы. Важно отметить, когда возникают проблемы Word Error 6124, так как это помогает устранять проблемы Microsoft Word (и сообщать в Microsoft Corporation).

Корень проблем Word Error 6124

Проблемы Word Error 6124 могут быть отнесены к поврежденным или отсутствующим файлам, содержащим ошибки записям реестра, связанным с Word Error 6124, или к вирусам / вредоносному ПО.

Особенно ошибки Word Error 6124 проистекают из:

  • Недопустимая или поврежденная запись Word Error 6124.
  • Файл Word Error 6124 поврежден от вирусной инфекции.
  • Другая программа злонамеренно или по ошибке удалила файлы, связанные с Word Error 6124.
  • Word Error 6124 конфликтует с другой программой (общим файлом).
  • Microsoft Word (Word Error 6124) поврежден во время загрузки или установки.

Продукт Solvusoft

Загрузка
WinThruster 2022 — Проверьте свой компьютер на наличие ошибок.

Совместима с Windows 2000, XP, Vista, 7, 8, 10 и 11

Установить необязательные продукты — WinThruster (Solvusoft) | Лицензия | Политика защиты личных сведений | Условия | Удаление

  1. 08-13-2012, 09:47 AM


    #1

    MS word — macro — text replacement

    Hi,
    I have to create a macro for replacing a text in a MS word document by a text.
    The target position of new text is defined by used style, so I just know the name of the style and the new text.
    My Code:
    [VBA]
    Sub OpenDocuments()
    Dim wrd1App As Word.Application
    Dim target As Word.Document
    On Error GoTo Exit_Proc
    Set wrd1App = CreateObject(«Word.Application»)

    Set target = wrd1App.Documents.Open(«C:Documents and SettingsuserMy Documentstarget.dotx»)
    Call SetProtection(target)

    On Error GoTo Exit_Proc

    Call FindAndReplaceFirstStoryOfEachType(target)

    Exit_Proc:
    wrd1App.Quit False
    Set wrd1App = Nothing

    wrd2App.Quit False
    Set wrd2App = Nothing

    MsgBox «Unexpected error. Type: » & Err.Description & Err.Number

    End Sub

    Sub FindAndReplaceFirstStoryOfEachType(source As Word.Document, target As Word.Document)

    Dim newStr As String
    newStr = «NEW STRING»

    Dim rngStory As Range
    Set rngStory = target.Range
    Call replII(«Candidate name», newStr, rngStory) ‘This procedure does not make any text replacement!!!!

    With rngStory.Find

    .Replacement.Text = newStr
    .Wrap = wdFindStop
    .Forward = True
    .Style = target.Styles(«Candidate name»)
    .Execute ‘Replace:=wdReplaceAll

    End With
    Call repIII(«Candidate name», newStr, rngStory) ‘This procedure does not make any text replacement!!!!

    rngStory.Text = newStr ‘Here I get error: 6124: you are not allowed to edit this selection because it is protected
    Dim testStr As String
    testStr = rngStory.Text

    End Sub

    Sub replII(ByVal sFindStyle As String, ByVal sReplaceText As String, ByRef rangeDocument As Range)
    With rangeDocument.Find
    .ClearFormatting
    .Style = sFindStyle
    .Replacement.ClearFormatting
    .Replacement.Text = sReplaceText
    .Execute Replace:=wdReplaceAll, Forward:=True, _
    Wrap:=wdFindContinue
    End With

    End Sub
    Sub repIII(ByVal sFindStyle As String, ByVal sReplaceText As String, ByRef rangeDocument As Range)
    With rangeDocument
    .Select
    Selection.Collapse wdCollapseStart
    Selection.TypeText sReplaceText ‘—CAPSID is an array that stores
    End With
    End Sub

    Sub SetProtection(ByRef doc As Document)
    If doc.ProtectionType <> wdNoProtection Then
    doc.Unprotect Password:=»12345″

    End If
    End Sub
    [/VBA]
    Please, could anyone explain me why rngStory.Text = newStr returns the error 6124 and why procedures replII and repIII do not make any text replacement in target MS Word document.
    Thank you very much for your advice.

    Edit : ADDED CODE TAGS Tommy


  2. 08-13-2012, 09:57 AM


    #2

    It helps if you use the VBA button or tags to make your code more readable. By my reading, this code will not compile. You also need to use Option Explicit at the top of any code modules, and then try to compile your project. This is critical in all coding, but especially so when you are creating instances of applications using CreateObject.

    You are opening a document («target» variable) and then passing that in as your «source» parameter to a subroutine, but then within that subroutine you reference your «target» parameter— which doesn’t have anything in it.

    Where are you calling this code from? Why do you need to create the Word application?

    [VBA]
    Sub OpenDocuments()
    Dim wrd1App As Word.Application
    Dim target As Word.Document
    On Error GoTo Exit_Proc
    Set wrd1App = CreateObject(«Word.Application»)

    Set target = wrd1App.Documents.Open(«C:Documents and SettingsuserMy Documentstarget.dotx»)
    Call SetProtection(target)

    On Error GoTo Exit_Proc

    Call FindAndReplaceFirstStoryOfEachType(target)

    Exit_Proc:
    wrd1App.Quit False
    Set wrd1App = Nothing

    wrd2App.Quit False
    Set wrd2App = Nothing

    MsgBox «Unexpected error. Type: » & Err.Description & Err.Number

    End Sub

    Sub FindAndReplaceFirstStoryOfEachType(source As Word.Document, target As Word.Document)

    Dim newStr As String
    newStr = «NEW STRING»

    Dim rngStory As Range
    Set rngStory = target.Range
    Call replII(«Candidate name», newStr, rngStory) ‘This procedure does not make any text replacement!!!!

    With rngStory.Find

    .Replacement.Text = newStr
    .Wrap = wdFindStop
    .Forward = True
    .Style = target.Styles(«Candidate name»)
    .Execute ‘Replace:=wdReplaceAll

    End With
    Call repIII(«Candidate name», newStr, rngStory) ‘This procedure does not make any text replacement!!!!

    rngStory.Text = newStr ‘Here I get error: 6124: you are not allowed to edit this selection because it is protected
    Dim testStr As String
    testStr = rngStory.Text

    End Sub

    Sub replII(ByVal sFindStyle As String, ByVal sReplaceText As String, ByRef rangeDocument As Range)
    With rangeDocument.Find
    .ClearFormatting
    .Style = sFindStyle
    .Replacement.ClearFormatting
    .Replacement.Text = sReplaceText
    .Execute Replace:=wdReplaceAll, Forward:=True, _
    Wrap:=wdFindContinue
    End With

    End Sub
    Sub repIII(ByVal sFindStyle As String, ByVal sReplaceText As String, ByRef rangeDocument As Range)
    With rangeDocument
    .Select
    Selection.Collapse wdCollapseStart
    Selection.TypeText sReplaceText ‘—CAPSID is an array that stores
    End With
    End Sub

    Sub SetProtection(ByRef doc As Document)
    If doc.ProtectionType <> wdNoProtection Then
    doc.Unprotect Password:=»12345″

    End If
    End Sub
    [/VBA]


  3. 08-13-2012, 12:01 PM


    #3

    Cross-posted at: http://social.msdn.microsoft.com/For…e-d22f9c6bc8b4
    For cross-posting etiquette, please read: http://www.excelguru.ca/content.php?184

    I, for one, don’t like finding that I’ve been wasting my time retracing issues that may have been dealt with elsewhere.

    Frosty: I’ve covered some of the same ground in the other forum, plus a bunch of other issues as well.

    Cheers
    Paul Edstein
    [Fmr MS MVP — Word]


  4. 08-13-2012, 12:03 PM


    #4

    You gave a more thorough analysis in your post, Paul.

    Thanks for policing the cross-post. I think I need to simply add this to my signature.


  5. 08-13-2012, 03:41 PM


    #5

    Thank you for your responses. I am sorry for the cross-post. I followed your advice, unfortunately it does not work. Still no change in the target document and still get error 6124 (returned by command: rngStory.InsertAfter str)

    My changed macro:

    Sub OpenDocuments()
    Dim wrd1App As Word.Application
    Dim wrd2App As Word.Application
    Dim source As Word.Document
    Dim target As Word.Document
    On Error GoTo Exit_Proc
    Set wrd1App = CreateObject(«Word.Application»)
    Set wrd2App = CreateObject(«Word.Application»)

    Set target = wrd1App.Documents.Open(«C:Documents and SettingsuserMy Documentstarget.dotx»)
    Call SetProtection(target)

    Set source = wrd2App.Documents.Open(«C:Documents and SettingsuserMy Documentssource.docx»)

    On Error GoTo Exit_Proc

    Call FindAndReplaceFirstStoryOfEachType(source, target)

    Exit_Proc:
    wrd1App.Quit False
    Set wrd1App = Nothing

    wrd2App.Quit False
    Set wrd2App = Nothing

    MsgBox «Unexpected error. Type: » & Err.Description & Err.Number

    End Sub

    Sub FindAndReplaceFirstStoryOfEachType(source As Word.Document, target As Word.Document)

    Dim r As Range
    Set r = source.Range
    With r.Find
    .Style = source.Styles(«CV name»)
    .Forward = True
    .Wrap = wdFindStop
    .Execute

    End With

    Dim str As String
    str = r.Text

    Dim rngStory As Range
    Set rngStory = target.Range
    Call replII(«Candidate name», str, rngStory)

    With rngStory.Find

    .Replacement.Text = r.Text
    .ClearFormatting
    .Replacement.ClearFormatting
    .Wrap = wdFindStop
    .Forward = True
    .Text = «»
    .Style = target.Styles(«Candidate name»)
    .Execute ‘Replace:=wdReplaceAll

    End With
    Call repIII(«Candidate name», str, rngStory)
    rngStory.InsertAfter str
    ‘rngStory.Text = str
    Dim testStr As String
    testStr = rngStory.Text

    End Sub

    Sub replII(ByVal sFindStyle As String, ByVal sReplaceText As String, ByRef rangeDocument As Range)
    With rangeDocument.Find
    .ClearFormatting
    .Style = sFindStyle
    .Text = «»
    .Replacement.ClearFormatting
    .Replacement.Text = sReplaceText
    .Execute Replace:=wdReplaceAll, Forward:=True, _
    Wrap:=wdFindContinue
    End With

    End Sub
    Sub repIII(ByVal sFindStyle As String, ByVal sReplaceText As String, ByRef rangeDocument As Range)
    With rangeDocument
    .Select
    Selection.Collapse wdCollapseStart
    Selection.TypeText sReplaceText ‘—CAPSID is an array that stores
    End With
    End Sub

    Sub SetProtection(ByRef doc As Document)
    If doc.ProtectionType <> wdNoProtection Then
    doc.Unprotect Password:=»12345″

    End If
    End Sub


  6. 08-13-2012, 03:46 PM


    #6

    You need to answer the rest of my questions… why are you creating separate application processes for the purpose of opening a single document? Where are you calling this code from (if you are already in Word, you do not need to use CreateObject *at all*).

    No point in troubleshooting what’s wrong when I don’t know why you’re using the structure you currently have. It would also be useful for you to go with Macropod’s responses in the other thread— he gave a good bit of helpful advice there too, not all of which you seem to have followed.

    I wouldn’t post any more code without explaining what you’re trying to do… because I think you’re making this far more difficult than it needs to be.

    Don’t forget to use your VBA tags, please.

    _______________________________________________
    Please don’t cross-post without providing links to your cross-posts. We answer questions for free. Please don’t waste the time of the people helping you.
    For cross-posting etiquette, please read: http://www.excelguru.ca/content.php?184

    — Frosty


  7. 08-13-2012, 05:49 PM


    #7

    Or rather, to sum up… you want to
    1. Look for a style («CV Name») in your source document, and whatever the text of that style is…
    2. You want to replace all instances of the style «Candidate Name» in the target document with the text contained in «CV Name» in the original document.

    This is a cleaned up version of your code…

    What isn’t working?
    [VBA]
    Sub OpenDocuments()
    Dim source As Word.Document
    Dim target As Word.Document

    On Error GoTo l_err

    Set target = Application.Documents.Open(«C:Documents and SettingsuserMy Documentstarget.dotx»)
    Set source = Application.Documents.Open(«C:Documents and SettingsuserMy Documentssource.docx»)

    ‘unprotect if necessary
    If target.ProtectionType <> wdNoProtection Then
    target.Unprotect Password:=»12345″
    End If

    Call FindAndReplace(source, target)

    l_exit:
    On Error Resume Next
    target.Saved = True
    target.Close
    Exit Sub

    l_err:
    MsgBox «Unexpected error. Type: » & Err.Description & Err.Number
    Resume l_exit
    End Sub

    Sub FindAndReplace(source As Word.Document, target As Word.Document)

    Dim r As Range
    Dim str As String
    Dim rngStory As Range
    Dim testStr As String

    Set r = source.Range
    With r.Find
    .Style = source.Styles(«CV name»)
    .Forward = True
    .Wrap = wdFindStop
    .Execute
    End With

    str = r.Text

    Set rngStory = target.Range
    With rngStory.Find
    .ClearFormatting
    .Replacement.ClearFormatting
    .Text = «»
    .Replacement.Text = str
    .Style = «Candidate name»
    .Execute Replace:=wdReplaceAll, Forward:=True, Wrap:=wdFindContinue
    End With

    With rngStory.Find
    .ClearFormatting
    .Replacement.ClearFormatting
    .Text = «»
    .Replacement.Text = str
    .Wrap = wdFindStop
    .Forward = True
    .Style = «Candidate name»
    .Execute ‘Replace:=wdReplaceAll <— why is this commented out? what do you want to have happen here?
    End With

    ‘why do you need to use selection here?
    With rngStory
    .Select
    Selection.Collapse wdCollapseStart
    Selection.TypeText str ‘—CAPSID is an array that stores
    End With

    rngStory.InsertAfter str
    ‘rngStory.Text = str
    testStr = rngStory.Text

    End Sub
    [/vba]

    Last edited by Frosty; 08-13-2012 at 06:39 PM.

    _______________________________________________
    Please don’t cross-post without providing links to your cross-posts. We answer questions for free. Please don’t waste the time of the people helping you.
    For cross-posting etiquette, please read: http://www.excelguru.ca/content.php?184

    — Frosty


  8. 08-13-2012, 06:38 PM


    #8

    It would be great if you could take the above code, and work to name it appropriately to what you want to have happen. Or describe in a very detailed manner the steps by which you want to do what it appears you’re doing.

    1. Open two documents (source and target), unprotected source doc as necessary
    2. Get the text of the first found style named CV Name in source
    3. Replace any text styled Candidate Name in the target document with the text found in #2
    4. Put the text of #2 at the very beginning of the target document

    That seems like what you want to do… is that not accurate?

    I don’t know why you are explicitly dimming things as Word.Application (which suggests you are utilizing this code somewhere other than within Word VBA) but not explicitly dimming range objects as Word.Range (which suggests you *are* using this code within Word VBA, since Dim r As Range isn’t going to work the same in Excel VBA).

    _______________________________________________
    Please don’t cross-post without providing links to your cross-posts. We answer questions for free. Please don’t waste the time of the people helping you.
    For cross-posting etiquette, please read: http://www.excelguru.ca/content.php?184

    — Frosty


  9. 08-14-2012, 04:19 AM


    #9

    To Frosty:

    >> 1. Look for a style («CV Name») in your source document, and whatever the text of that style is…

    YES

    >> 2. You want to replace all instances of the style «Candidate Name» in the target document with the text contained in «CV Name» in the original document.

    YES

    >> This is a cleaned up version of your code…

    YES

    >> What isn’t working?

    get error 6124 (returned by command: rngStory.InsertAfter str)

    get error 6124 (returned by command: rngStory.Text = str)

    My attempts with Find and Slection commands (see the macro) do not make any text replacement…

    Thank you for your advice in advance.


  10. 08-14-2012, 06:26 AM


    #10

    Are you running this code from Word?

    _______________________________________________
    Please don’t cross-post without providing links to your cross-posts. We answer questions for free. Please don’t waste the time of the people helping you.
    For cross-posting etiquette, please read: http://www.excelguru.ca/content.php?184

    — Frosty


  11. 08-14-2012, 06:36 AM


    #11

    >> Are you running this code from Word?

    YES, I am.


  12. 08-14-2012, 08:34 AM


    #12

    Do you know how to step through code using F8? My guess is that you are not finding any text based on your criteria… and then everything breaks down.

    Try stepping through the code and seeing what fails. Most likely it is that the style doesn’t exist in the document.

    I can provide some code later, but you should try to work on this on your own by simply recording macros rather than finding things on the web and throwing them together.

    Can you record a macro which finds the first instance of the style «CV Name» in that specific document? What does that code look like?

    _______________________________________________
    Please don’t cross-post without providing links to your cross-posts. We answer questions for free. Please don’t waste the time of the people helping you.
    For cross-posting etiquette, please read: http://www.excelguru.ca/content.php?184

    — Frosty


  13. 08-14-2012, 08:48 AM


    #13

    My code can successfuly find the text having style «CV Name» (in the source document). The problem is no replacement is carried out.

    Moreover, the following errors are raised

    get error 6124 (returned by command: rngStory.InsertAfter str)

    get error 6124 (returned by command: rngStory.Text = str)

    rngStory includes proper text which I would like to replace by the target text.

    How can I deal with the error 6124 ?


  14. 08-14-2012, 11:12 AM


    #14

    >> Why do you need to create the Word application?

    I just wanted to open a Word document. Is it a wrong way?


  15. 08-14-2012, 01:33 PM


    #15

    Try using F8 to step through this code and describe what happens that you don’t expect, and what it doesn’t do that you want it to do.

    I have not tried to incorporate all of the functionality of your original code, because I’m not convinced you actually want any of that functionality. It seems like you want to replace all text in a given document, based on some styled text in a different document. The below code will do that.

    If you want to do more than that, then you will need to describe what you want to do, and why you are using .InsertAfter at all.
    [VBA]
    Public Sub DemoCode()
    Dim oSource As Document
    Dim oTarget As Document
    Dim sCVName As String

    Set oSource = Documents.Open(«your path here to source.dotx»)
    Set oTarget = Documents.Open(«your path here to target.dotx»)

    ‘unprotect as necessary
    If oTarget.ProtectionType <> wdNoProtection Then
    oTarget.Unprotect Password:=»12345″
    End If

    ‘get the text to replace from the source file
    sCVName = fGetCVName(oSource)

    ‘replace all instances in the target file
    ReplaceCandidateName oTarget, sCVName

    ‘now what?

    End Sub
    Public Function fGetCVName(oDoc As Document) As String
    ‘find one instance of text styled with «CV Name» in the passed document
    ‘return the string of text
    Dim rngSearch As Range
    Dim sRet As String

    Set rngSearch = oDoc.Content
    With rngSearch.Find
    .Style = «CV Name»
    If .Execute = True Then
    sRet = rngSearch.Text
    End If
    End With

    ‘if you want to get rid of any vbcr, then uncomment this line
    ‘sRet = Replace(sRet, vbCr, «»)
    fGetCVName = sRet
    End Function
    Public Sub ReplaceCandidateName(oDoc As Document, sWithText As String)
    ‘replace all instances of text formatted with Candidate Name style with the passed text
    Dim rngSearch As Range

    Set rngSearch = oDoc.Content
    With rngSearch.Find
    .Style = «Candidate Name»
    .Replacement.Text = sWithText
    .Execute Replace:=wdReplaceAll
    End With
    End Sub
    [/vba]

    _______________________________________________
    Please don’t cross-post without providing links to your cross-posts. We answer questions for free. Please don’t waste the time of the people helping you.
    For cross-posting etiquette, please read: http://www.excelguru.ca/content.php?184

    — Frosty


  16. 08-15-2012, 03:39 PM


    #16

    Now, I get error 5844 (command: .Replacement.Text = sWithText)


  17. 08-15-2012, 04:31 PM


    #17

    What is the description of the error? I do not have the error numbers memorized and cannot fathom what error could happen on that line of code.

    You’ll need to provide a bit more detail as well as whether you are able to step through using F8.

    Even if you passed in nothing (i.e., a blank string), this code should still work. Even if the style Candidate Name didn’t exist, this could should still work. Even if the document was protected, this code would fail on the ReplaceAll line of code.

    I can’t fathom a scenario where setting up the find object with specific replacement text would cause an error.

    So, something else is going on. It may be your localized version of Word.

    Steps for you to take:
    1. What version of Word are you using
    2. Record a macro which replaces all instances of text in an open document formatted with «Candidate Name» with any text… and then post that recorded macro.

    If you can’t do both of the above, I don’t think I’ll be able to help further. Sorry.

    _______________________________________________
    Please don’t cross-post without providing links to your cross-posts. We answer questions for free. Please don’t waste the time of the people helping you.
    For cross-posting etiquette, please read: http://www.excelguru.ca/content.php?184

    — Frosty


  18. 08-17-2012, 02:29 PM


    #18

    Yes, I am VERY curious about a 5844 error! AFAIK there is no such VBA error.


Почему я получаю "Error 6124: You are not allowed to edit this section because it is protected." при запуске этого кода на определенных машинах? Я не получаю его на моей машине разработки. Закладки связаны с полями формы.

Set objWordApp = CreateObject("Word.Application")
Set oDoc = objWordApp.Documents.Open(strDocPath)
oDoc.bookmarks("CustomerName").Select
objWordApp.selection = "Mr Smith"
oDoc.bookmarks("CustomerNumber").Select
objWordApp.selection = "0001"
oDoc.save
oDoc.Bookmarks("Comments").Select
oDoc.ActiveWindow.View = 1
objWordApp.WindowState = 0
objWordApp.Visible = True
oDoc.Activate
objWordApp.Activate

4 ответа

Лучший ответ

В защищенном / ограниченном документе вам нужно ссылаться на .FormFields вместо .Bookmarks.

Вместо того:

oDoc.Bookmarks("CustomerName").Select
objWordApp.selection = "Mr Smith"

Использование:

oDoc.FormFields("CustomerName").Result = "Mr Smith"

У меня была такая же ошибка. Потребовалось время, чтобы понять это, но права доступа к файлам (в Windows) были установлены только на чтение.

В проводнике Windows щелкните файл правой кнопкой мыши и выберите свойства. Затем снимите флажок «Только для чтения» на вкладке «Общие».


0

kevin
8 Мар 2016 в 23:59

У меня была та же проблема, что и с оригинальным плакатом. Один пользователь получил ошибку 6124, а другие — нет. Я попробовал приведенные выше предложения, но никто не устранил проблему. Что сработало для меня, так это сброс Word до исходных настроек с помощью быстрого исправления в этом статья MS.

Надеюсь, это поможет кому-то другому!


0

markwat
3 Дек 2019 в 16:14

INTELLIGENT WORK FORUMS
FOR COMPUTER PROFESSIONALS

Contact US

Thanks. We have received your request and will respond promptly.

Log In

Come Join Us!

Are you a
Computer / IT professional?
Join Tek-Tips Forums!

  • Talk With Other Members
  • Be Notified Of Responses
    To Your Posts
  • Keyword Search
  • One-Click Access To Your
    Favorite Forums
  • Automated Signatures
    On Your Posts
  • Best Of All, It’s Free!

*Tek-Tips’s functionality depends on members receiving e-mail. By joining you are opting in to receive e-mail.

Posting Guidelines

Promoting, selling, recruiting, coursework and thesis posting is forbidden.

Students Click Here

Word 2013 Automation: Runtime Error 4605

Word 2013 Automation: Runtime Error 4605

(OP)

3 Dec 13 09:11

I’m testing one of our vb6 programs against Word 2013, and have run into the subject error message — but haven’t yet found a way around it. The program executes:

CODE

Set wrdApp = CreateObject("Word.Application")
Set wrdDoc = wrdApp.Documents.Open(DocName)
wrdApp.Documents(wrdDoc).Unprotect (password) 

which works just fine with Word ’03, but results in «the unprotect method or property is not available because this command is not available for reading» in Word ’13.

I thought the solution might be as simple as converting the .doc to .docx but, after recompiling, I still get the same error.

Office 2013 isn’t available on the development machine, so the reference being used is to Microsoft Word 11.0 Object Library. Could this be a contributing factor?

Any suggestions — short of rewriting?

Red Flag Submitted

Thank you for helping keep Tek-Tips Forums free from inappropriate posts.
The Tek-Tips staff will check this out and take appropriate action.

Join Tek-Tips® Today!

Join your peers on the Internet’s largest technical computer professional community.
It’s easy to join and it’s free.

Here’s Why Members Love Tek-Tips Forums:

  • Tek-Tips ForumsTalk To Other Members
  • Notification Of Responses To Questions
  • Favorite Forums One Click Access
  • Keyword Search Of All Posts, And More…

Register now while it’s still free!

Already a member? Close this window and log in.

Join Us             Close

Поискав по рунету материал на тему обработки ошибок в VBA, не увидал на первых двух страницах результатов поиска чего-то, что мне понравилось. Может плохо смотрел, но решил написать на эту тему свою статью.

Простите, но — немного словоблудия :)

Ошибки в программе

Ошибки времени исполнения программы возникают, когда среда программирования не может выполнить то, что вы хотите. Таких ситуаций может быть много. Например:

  1. Вы обращаетесь к объекту по имени, а объекта с таким именем в коллекции нет

  2. Вы хотите выделить ячеку на одном листе, а этот лист в данный момент не является активным (типичнейшая ошибка новичков в Excel VBA)

  3. Вы хотите удалить отфильтрованные автофильтром строки, а фильтр вообще не вернул записей и удалять нечего

  4. Вы ссылаетесь на элемент массива, который находится за пределами его границ.

  5. Вы пытаетесь присвоить переменной значение, которое оно не может хранить. Например, переменной типа Long нельзя присвоить строковую константу или переменной типа Integer присвоить знанчение превышающее число 32767.

На любую из этих и сотни других ситуаций среда выполнения реагирует стандартно — прерывает ход выполнения программы на том операторе, где возникла ошибка или, как ещё принято говорить, исключение. На экран выводится информация о возникшей ошибке и предлагаются стандартные варианты для продолжения работы:

  • Continue (продолжить) — этот пункт во время возникновения ошибки всегда не активен. Он активен, когда по ходу выполнения программы вы использовали оператор Stop. Кстати это очень полезный оператор для отладки программы.

  • End (завершить) — завершение исполнения программы

  • Debug (отладка) — переход в режим отладки, в котором можно посмотреть, на каком операторе возникла ошибка, что содержат переменные, можно даже перетащить жёлтую полоску, подсвечивающую текущий оператор, назад, и модифицировать знанчение переменных через окно Immediate window (впрочем это экзотика). В общем случае кнопка Debug позволяет посмотреть, где случилась ошибка и попытаться понять почему так случилось.

Если вы — автор программы, в которой случилась ошибка, то вы, должно быть, в начале будете рады увидеть подобное окно, ибо только так вы сможете отловить основные ошибки, скрытые в вашем коде. Однако, если эту ошибку видит пользователь, то для него это, мягко говоря, безрадостное и малопонятное зрелище. Ещё хуже, если за эту программу вам заплатили деньги. Поэтому в среде худо-бедно профессиональных программистов принято предусматривать обработку ошибок в своих программах.

Почему вообще в коде возникают ошибки?

  1. Много ошибок во время написания кода возникает по невнимательности или не совсем адекватного понимания того, что делаешь. Таких ошибок, как правило, очень много, особенно у начинающих программистов, но эти ошибки довольно легко отловить и исправить, так как, пока вы их не исправите, ничего не работает. Ну, например, вы должны извлечь данные из 5-го столбца, а вы извлекаете из 6-го, а их там банально нет. Ясно, что вы это очень быстро заметите.

  2. Вторая группа ошибок — это ошибки оптимиста. Когда программа написана в целом правильно, но алгоритм не готов к ударам судьбы в виде неожиданных действий со стороны пользователя, ошибок ввода-вывода (вы рассчитывали считать данные из файла, а файла с таким именем не оказалось, либо он заблокирован другим приложением), особенностей конфигурации компьютера (разные версии ОС или офиса, которые в некоторых мелочах отличаются).

  3. Тонкие логические ошибки. Чем сложнее программа, тем больше шансов, что модель задачи в вашей голове, ваша программа и реальность не совсем согласованы между собой. Пока вы не достигните достаточного погружения в задачу вы такие ошибки не найдёте и не исправите. Порой на это уходит много времени. Но это характерно для сложных задач.

  4. Ошибки на стыке вашего приложения и сервисов ОС, приводящие к неожиданным крахам приложения. Такого вообще возникать не должно, но как мы понимаем, и ОС и офис содержат ошибки, да и вы (что более вероятно) можете пользоваться системными вызовами не правильно. Подобные ошибки — сущий кошмар, особенно когда они проявляются лишь на некоторых конфигурациях, при определенных условиях, их трудно поймать и надёжно воспроизвести.

Задачи механизмов обработки ошибок

  1. Обеспечить стабильную работу программы. Возникновение ошибки, появление которой вы не предусмотрели, приведёт в большинстве случаев к аварийному завершению всей программы или её части. При определенном уровне подобных ситуаций это ведёт к тому, что программой пользоваться становится невозможно.

  2. Информирование. Мало обработать ошибку и предотвратить завершение программы. Надо ещё и адекватно проинформировать пользователя о причинах нестандартного поведения программы. Частно причиной ошибок в программе являются некорректные действия пользователя, поэтому важно сообщать ему о них.

  3. Защита данных от повреждения. Программа обязана защищать от непреднамеренных повреждений результаты своей или пользовательской работы. Деструктивные действия должны быть снабжены соответствующими предупредительными диалоговыми окнами. Часто ошибка, не обработанная должным образом может повредить нужные данные.

Файл примера

Скачать

Код без обработки ошибок

Вот простой пример с потолка. Если вызвать Example_00, то она прекрасно отработает без ошибок и вернёт это:

В функцию GetCalories передаётся строка с блюдом, а она должна вернуть его калорийность, сверившись с таблицей в A1:B7.

Давайте поищем слабые места в этом коде. Первое, что должно прийти в голову — если мы ищем, то, что произойдёт, если мы не найдём? А произойдёт, конечно же, ошибка. Её инициирует метод Match.


Ещё одно слабое место этой подпрограммы: функция возвращает вещественный тип Double, и даже, если поиск оказался удачным, то в Cells(intRow, 2) может случайно находиться текстовая строка, а потому, когда вы числовому типу попытаетесь присвоить строковый тип, также произойдёт ошибка. И, если вы второй ошибки сможете избежать за счёт дополнительного оператора if с проверкой через IsNumber(), то избежать первой ошибки таким способом нельзя. Что же делать? А вот тут на сцену выходят операторы обработки ошибок.

Есть 2 подхода к обработке ошибок: автономный подход и выносной. Эти термины я придумал только что, чтобы проще было их обсуждать.

Автономный подход

Смысл автономного подхода в том, чтобы не выносить сор из избы. Если в подпрограмме возникла ошибка, то мы должны предположить, на каком месте она возникнет и поджидать её там с дубиной. С ошибкой, в этом случае, разбираются обычно в операторе, идущем сразу после потенциально опасного места. Давайте смотреть, как это может выглядеть:

Итак, что тут сделано:

  1. Сразу после объявления функции GetCalories_v1 идёт оператор on error resume next, который в случае возникновения в каком-либо месте ошибки, предписывает VBA просто передавать управление на следующий оператор, идущий после ошибочного.

  2. Мы объявили переменные. Необъявленные переменные получают тип Variant и значение по умолчанию Empty. Объявленные переменные числовых типов инициируются нулём, строковые — пустой строкой, то есть я наперёд знаю, что они содержат, а это хорошо для обработки ошибок.

  3. На вызове метода WorksheetFunction.Match у нас возникает ошибка, так как искомого значения в таблице нет. А это, между прочим, был оператор присваивания ( = ). Прежде, чем левой части оператора присваивания (intRow) что-то будет присвоено, необходимо вычислить правую часть оператора присваивания (WorksheetFunction.Match…), а поскольку в процессе этого вычисления возникает ошибка, то переменная intRow остаётся такой, какой была! А, как я уже сказал, VBA автоматически её инициализирует нулём до начала исполнения подпрограммы. Получается, что, если в этом операторе возникнет ошибка, то в intRow будет ноль. Если ошибки во время поиска не возникнет, то ноля там не будет ни при каких раскладах, так как строки на листе нумеруются с единицы.

  4. И вот этот ноль мы и контролируем, добавляя оператор If. Если intRow больше нуля, то WorksheetFunction.Match отработала штатно, а если нет — то работу подпрограммы надо прерывать, но об этом чуть позже.

  5. Далее мы помним, что Cells(intRow, 2) может теоретически вернуть строковое значение, которое вызовет ошибку Type missmatch при присвоении переменной типа Double (GetCalories_v1), поэтому мы вставляем дополнительную проверку промежуточной переменной varTemp тому, что она числовая. И если это так, то присваиваем GetCalories_v1 значение из varTemp.

  6. В случае возникновения любой ошибки внутри GetCalories_v1 она просто вернёт ноль. Почему ноль? Потому что переменная GetCalories_v1 тоже инициализируется нулём и об этом не надо заботиться, а в случае ошибки она останется в неприкосновенности.

  7. Соответственно родительский код (в нашем случае его роль играет процедура Example_01) должен проверить, а не вернёт ли GetCalories_v1 ноль, и быть готовым к этой ситуации.

  8. А вот теперь тонкий момент, который не все понимают. Почему я использовал промежуточные переменные intRow и varTemp? Вроде бы есть очевидный ответ — чтобы не вычислять значение выражений с Match и Cells 2 раза. Отчасти это, конечно, так. Но это, в данном случае, не главная причина. Главная причина в том, что такой код

    вызовет неправильное поведение программы. Если у нас Match вызовет исключение, то VBA передаст управление на СЛЕДУЮЩИЙ оператор, а следующий оператор в данном случае это то, что идёт после Then — присваивание переменной varTemp значения. Таким образом наша проверка на наличие ошибки сработает с точностью до наоборот, передав управление в ту часть кода, которая должна быть защищена от ситуации, когда Match не нашла строку в таблице. Вот почему важно в операторе If не иметь ничего такого, что могло бы вызвать ошибку.

  9. Как видите, в этом подходе мне зачастую даже нет необходимости проверять объект Err, чтобы понять, что произошла ошибка, так как я ориентируюсь на то, что промежуточные переменные остаются неинициализированными, что является показателем наличия ошибки.

Выносной подход

Данный метод основан на том, что, когда возникает ошибка, то VBA передаёт управление на специальный участок кода — обработчик ошибок, который обычно размещают в конце подпрограммы. Это может выглядеть так:

Обратите внимание, что:

  1. Оператор on error теперь в случае ошибки предписывает передавать управление на метку ErrorHandler, которая объявлена в конце кода процедуры GetCalories_v2

  2. В коде мы никак не заботимся о каких-либо проверках. Возникла ошибка? Иди на метку — там разберутся.

  3. Если ошибки не случилось, то, чтобы программа не стала исполнять строчки, предназначенные для обработки ошибок, перед меткой ErrorHandler обычно ставят оператор Exit Sub или Exit Function (в зависимости от типа подпрограммы).

  4. Принципиальный момент — наличие оператора On Error Resume Next сразу после метки ErrorHandler. Дело в том, что после того, как вы перешли на метку ErrorHandler, очень опасно иметь действующим оператор On Error GoTo ErrorHandler, так как, если у вас в обработчике ошибки случится любая ошибка, то управление будет передано опять на метку и, как нетрудно понять, образуется бесконечный цикл. Поэтому сразу после метки мы возможность возникновения цикла ликвидируем оператором On Error Resume Next.

Что лучше?

Какой метод лучше применять зависит от ваших предпочтений и конкретных ситуаций. Грамотную обработку ошибок можно сделать и так и эдак. Вот несколько соображений по преимуществам и недостакам данных подходов:

Автономный подход

Преимущества Недостатки
Есть возможность точно идентифицировать каждую конкретную проблему (если вы её предусмотрели), возникающую во время исполнения, что позволит вам дать самые точные инстркции пользователю для предотвращения появления исключения в будущем. Достаточно трудоёмок, так как подразумевает наличие большого количества проверок в коде. Каждое потенциально опасное действие должно быть снабжено соответствующим оператором If, в котором контролируется значение переменной или код ошибки.
Надо хорошо представлять себе ситуации, где могут возникнуть ошибки, в противном случае ряд ошибок вы просто не заметите на этапе отладки.
Необходимо больше кода, а также требуется опыт и фантазия.
Необходимо больше промежуточных переменных

Выносной подход

Преимущества Недостатки
Ни одна ошибка не проскочит незамеченной. Не смотря на то, что вы перехватите все ошибки, отреагировать на них правильно затруднительно, так как вы, по большому счёту, не знаете, на каком операторе произошла ошибка и почему.
Удобнее организовывать централизованный сбор логов по ошибкам в приложении. Однозначно, фаворит для больших проектов.

Кратко пробежимся по операторам, функциям и объектам VBA, которые предназначены для обработки ошибок времени исполнения программы.

Операторы

On Error { GoTo label | Resume Next | GoTo 0 }

Оператор on error управляет тем, на какой участок вашего кода будет передано управление в случае возникновения ошибки. Данный оператор можно вставить в любое место вашей программы или подпрограммы. Есть 3 варианта:

  1. On error goto label — после того, как этот оператор выполнен, ошибка, возникшая на других операторах программы приведёт к переходу на метку label.

  2. On error resume next — после такого оператора, VBA будет игнорировать возникшую ошибку и передавать управление на следующий оператор, стоящий за тем, в котором возникла ошибка.

  3. On error goto 0 — это режим по-умолчанию. В случае возникновения ошибки данный режим приведёт к появлению на экране стандартного обработчик ошибок VBA с кнопками End и Debug.

Resume { label | Next | [0] }

Данный оператор возобновляет выполнение программы. Применяется в выносном методе обработки ошибок.

  1. resume label— возобновление с метки label

  2. resume next — возобновление со следующего оператора

  3. resume или resume 0 — возобновление с оператора, вызвавшего ошибку. Это имеет смысл, если вы устранили ошибку в своём обработчике. На мой взгляд, на практике такое применяется крайне редко.

Goto label

Переход на метку. Может пригодиться, однако, использование меток в коде для чего-то большего, чем обработка ошибок, считается страшным моветоном.

Exit { Do | For | Function | Sub }

Досрочный выход из циклов (Do или For) и досрочный выход из подпрограмм (функции или процедуры). Могут пригодиться при обработке ошибок, но вообще это операторы и без того чрезвычайно полезны.

Объект Err

  1. Err — глобальный объект (его не надо объявлять, а можно сразу пользоваться), который содержит информацию о последней ошибке, случившейся в вашей программе. Проверяя Err сразу после возникновения исключения или после ситуации, которая могла привести к исключению, вы можете понять, что имело место на самом деле.

  2. Свойство Err.Number — содержит числовой код ошибки, по которому их различают в программе. Поскольку Number — свойство по умолчанию, то вы можете его опускать, то есть Err и Err.Number — это эквиваленты. Значение ноль говорит о том, что ошибки не произошло.

  3. Err.Description — содержит англоязычное краткое описание ошибки

  4. Err.Source — возвращает имя модуля, в котором возникла ошибка

  5. Err.Clear — сбрасывает последнюю ошибку. Err сбрасывается также при выполнении оператором Resume, Exit (любого типа кроме Do и For) и On Error.

  6. Err.Raise — искусственно вызывает исключение указанного в переданном параметре типа. Можно использовать для тестирования вашей подсистемы обработки ошибок.

P.S.

Лично я привык в своих программах использовать автономный подход и, возможно, поэтому я не совсем осознаю все преимущества выносного подхода. Буду рад прочесть в комментариях ваше мнение на этот счёт. Тема обработки ошибок данной статьёй, конечно, быть исчерпана не может, но она послужит вам хорошей стартовой точкой в этом важном деле.

Читайте также:

  • Работа с объектом Range

  • Работа с объектом Range (часть 2)

  • Sheet happens

  • Поиск границ текущей области

  • Массивы в VBA

  • Структуры данных и их эффективность

  • Автоматическое скрытие/показ столбцов и строк

Понравилась статья? Поделить с друзьями:
  • Vba error 5854
  • Vba error 430
  • Vba custom error
  • Vba compile error variable not defined
  • Vba compile error in hidden module