значения массива печатаются не при обычном запуске, а в режиме отладки в VBA

#excel #vba

Вопрос:

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

 Sub d()
Dim tags() As Variant

x = ActiveWorkbook.Worksheets.Count
ReDim tags(x)
For i = 1 To x  
   tags(i) = Sheets(i).Range("r14").Value
Next i
Sheets(x).Activate
For i = 1 To x
   Cells(i, 1).Value = tags(i)
Next i
End Sub
 

Комментарии:

1. удалите Sheets(x).Activate , а затем измените Cells(i, 1).Value = tags(i) на Sheets(x).Cells(i, 1).Value = tags(i) . А теперь, пожалуйста, не могли бы вы попробовать?

2. спасибо за ваш ответ, но когда я пытаюсь, что он не вставляется , он вставляет только пробелы , значение копируется в массив , но цикл вставки не работает, в приведенном выше коде я сохранил точку останова на листах(x).активируйте, и когда я запускаю программу, она не вставляется, но я должен запустить приведенный ниже «цикл для» для одного значения, а затем, если я запускаю его полностью, он вставляет все значения, когда я запускаю его без выполнения этого шага, просто не вставляет значения, я хочу знать, в чем причина и какая ошибка, которую я делаю, может кто-нибудь, пожалуйста, проясните это, спасибо

Ответ №1:

Значения Резервных Ячеек

Более Надежное Решение

 Option Explicit

Sub BackupCellValues()
    
    Const sAddr As String = "R14" ' Source Cell Address
    Const dAddr As String = "A1" ' Destination First Cell Address
    
    Dim wb As Workbook: Set wb = ActiveWorkbook
    ' If the workbook containing these worksheets is also the one containing
    ' this code, using 'ThisWorkbook' instead of 'ActiveWorkbook' is a must.
    
    Dim swsCount As Long: swsCount = wb.Worksheets.Count - 1 ' except the last
    ' You need at least two worksheets to make this work hence:
    If swsCount < 1 Then Exit Sub ' highly unlikely, but why take a chance?
    ' Define a 2D ('...,...') one-based ('1 To...') one-column array ('1 To 1').
    Dim sTags As Variant: ReDim sTags(1 To swsCount, 1 To 1)
    
    ' Write from source to array by looping.
    Dim sws As Worksheet
    Dim n As Long
    For n = 1 To swsCount
        sTags(n, 1) = wb.Worksheets(n).Range(sAddr).Value
    Next n
    ' at this point, 'n = swsCount   1'
    
    ' Write from array to destination in one go (no loop necessary).
    Dim dws As Worksheet: Set dws = wb.Worksheets(n)
    Dim drg As Range: Set drg = dws.Range(dAddr).Resize(swsCount)
    drg.Value = sTags

End Sub
 

Быстрое исправление (не рекомендуется, потому что оно работает до тех пор, пока этого не произойдет)

 'Option Explicit

Sub BackupCellValuesUnreliable()
    
    x = ActiveWorkbook.Worksheets.Count
    ReDim tags(1 To x - 1)
    
    For i = 1 To x - 1
        tags(i) = Worksheets(i).Range("R14").Value
    Next i
    
    For i = 1 To x - 1
        ' Note that you can move the following line to the previous loop.
        Worksheets(x).Cells(i, 1).Value = tags(i)
    Next i

End Sub
 

Комментарии:

1. спасибо за ваш ответ, но я столкнулся с той же проблемой с этим кодом быстрого исправления , я прошел все шаги, но он не вставляется, но когда я удаляю листы(x) и добавляю листы(x).активен перед циклом «для» и запускаю один цикл для 1-го значения , и после того, как я нажму «полный запуск», он вставляет все значения, если не запускать один цикл с помощью пошагового, то он не вставляется, та же проблема, что и мой код, пожалуйста, скажите мне, в чем причина, спасибо за ваш ответ

2. спасибо за код backupcellvalues (), но я не получаю результатов, я не знаю, какую ошибку я совершаю, я сталкивался с этой проблемой много раз, но я буду запускать этот код в режиме отладки, я не знаю, какую ошибку я совершаю, пожалуйста, все помогите мне с этим, спасибо

3. Как я написал в одном из комментариев BackupCellValues : Если книга, содержащая эти рабочие листы, также содержит этот код, использование «Этой рабочей книги «вместо» Активной рабочей книги » является обязательным. Вы пробовали ThisWorkbook или вышеупомянутое (код и рабочие листы) в разных книгах? Кстати, если вы получаете сообщение об ошибке, пожалуйста, сообщите номер ошибки и ее описание. Пожалуйста, уточните, потому что оба кода работают с моей стороны. Если проблема не устранена, попробуйте воссоздать книгу заново, так как она может быть повреждена.

4. спасибо за ваш любезный ответ,я попробовал в другой книге, похожей на эту книгу, оба кода работают нормально, но в книге, с которой я столкнулся с проблемой, мой код и в коде backupcellvaluesUnreliable() я добавил таблицы шагов(x).активируйте, и я выполнил эти шаги отладки, и это работает, проблема в книге, которую я использую, кроме этого кода, идеально, но я хотел знать, в чем проблема в этой книге и почему VBA ведет себя так, как это продолжение:

5. продолжение: , книга, которую я использую, является защищенной книгой , но я не думаю , что это создаст какие-либо проблемы ,потому что я попробовал ее с другой защищенной книгой , она работает нормально ,в чем может быть возможная проблема?, я просто хотел знать, пожалуйста, помогите мне с этим, когда я попробовал код backupcellvalues() в режиме отладки, он даже не может получить значения в массиве, он просто получает пустые значения, я не знаю проблемы в книге, не могли бы вы сказать мне, почему vba ведет себя так, большое спасибо за ваш любезный ответ