#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 ведет себя так, большое спасибо за ваш любезный ответ