#vba #excel
#vba #excel
Вопрос:
У меня есть открытая книга, в которой есть множество макросов, один из этих макросов заключается в копировании данных из этой книги и вставке их в другую книгу на сервере. Пока я могу открыть серверную книгу и перейти к правой вкладке и ячейке, но я не могу вставить данные… Мой код приведен ниже:
Sub aggregate()
Dim m As String
Dim t As Integer
'opened workbook
Sheets("Month Count").Select
range("A2").Select
Do
m = ActiveCell.Value
t = ActiveCell.Offset(0, 1).Value
Set xl = CreateObject("Excel.Application")
Set xlwbook = xl.Workbooks.Open("\LOCATIONOFOTHERWORKBOOKONSERVER")
xl.Visible = True
xlwbook.Worksheets("A").range("A2").Select
xlwbook.ActiveCell.Value = m **this is where my code breaks.**
xlwbook.ActiveCell.Offset(1, 0).Value = t
'HOW TO SAVE FILE AND CLOSE FILE?
Windows("GOBACKTOFIRSTWORKBOOK").Activate
ActiveCell.Offset(1, 0).Select
Loop Until ActiveCell.Value = "THE END"
End Sub
Комментарии:
1. Вы понимаете, что второй символ строки, где вы говорите, что ваш код прерывается, — это 1 (число), а не L (буква)?
2. спасибо, да, это так в вопросе, но не в моем коде. Это все еще не работает…
3. Прерывается ли это в первый раз в цикле или это срабатывает один раз, а затем прерывается во второй раз (потому что вы не закрываете книгу на сервере)? Кроме того, почему вы создаете новую
Excel.Application
, когда вы могли бы открыть серверную книгу в том же объекте приложения, что и первая книга?4. он не завершает первый цикл, он не может пройти мимо x1wbook. рабочие листы («Количество месяцев»).activecell.value = mon. Что касается того, почему я создаю новый excel.application, это потому, что строка x1.visible = true прерывается без этого первого creatobject.. я не очень разбираюсь в vba … достаточно, чтобы справиться…
Ответ №1:
Что-то вроде приведенного ниже, которое найдет диапазон от A2 до ячейки, содержащей «КОНЕЦ» в столбце A листа под названием «Количество месяцев» в ActiveWorbook, затем откройте вторую книгу (я использовал C:testother.xlsm"
, перейдите на лист «A», а затем поместите
- A2 из первой книги в A2 второй книги,
- B2 из первой книги в A3 во второй книге,
- Формат А3 из первой книги в формат А4 во второй книге,
- B3 из первой книги в A5 во второй книге и т. Д
Обратите внимание, что в вашем коде вы в настоящее время открываете новый экземпляр Excel, вы должны работать с обеими книгами в одном экземпляре, чтобы они могли «общаться»
Sub aggregate()
Dim Wb1 As Workbook
Dim Wb2 As Workbook
Dim ws1 As Worksheet
Dim ws2 As Worksheet
Dim rng1 As Range
Dim rng2 As Range
Dim lngRow As Long
Dim lngCalc As Long
With Application
.ScreenUpdating = False
.EnableEvents = False
lngCalc = .Calculation
End With
Set Wb1 = ActiveWorkbook
Set ws1 = Wb1.Sheets("Month Count")
Set rng1 = ws1.Columns("A").Find("THE END", , xlValues, xlWhole)
If rng1 Is Nothing Then
MsgBox "Did not find marker cell"
GoTo QuickExit
End If
Set rng1 = ws1.Range(ws1.[a2], ws1.Cells(rng1.Row, "A"))
Set Wb2 = Workbooks.Open("C:testother.xlsm")
Set ws2 = Wb2.Sheets("A")
For Each rng2 In rng1
ws2.[a2].Offset(lngRow, 0) = rng2
ws2.[a2].Offset(lngRow 1, 0) = rng2.Offset(0, 1)
lngRow = lngRow 2
Next
Wb2.Save
Wb2.Close
Wb1.Activate
QuickExit:
With Application
.ScreenUpdating = True
.EnableEvents = True
.Calculation = lngCalc
End With
End Sub
Комментарии:
1. вау, спасибо, чувак, твой работал с самого начала, просто подключил его, и он сделал свое дело! Мне нужно немного изменить это, и я не совсем понимаю, что именно происходит, но я изучу это. еще раз спасибо!
2. Спасибо за быстрое завершение. 🙂 Если ваш набор данных большой, то перезапись массива вариантов значительно сократит время реорганизации данных, пример здесь
Ответ №2:
- нет смысла «активировать» ваши книги.
- вам не нужно создавать экземпляр второго Excel, если ваш макрос уже запущен в Excel.
- это было бы намного быстрее сделать одним выстрелом
- Я подозреваю, что ваша ошибка связана с тем, что
xlwbook
не была активирована при использованииxlwbook.ActiveCell
.
Ниже мое предложение для вашего копирования / вставки, один за другим (или я должен сказать 2 на 2).
Sub aggregate2()
Dim rngSource As Range
Dim rngDest As Range
Dim xlwbook As Workbook
Set rngSource = Sheets("Month Count").Range("A2:B2")
Set xlwbook = Workbooks.Open("\LOCATIONOFOTHERWORKBOOKONSERVER")
Set rngDest = xlwbook.Range("A2:B2")
Do
rngDest.Value = rngSource.Value
Set rngSource = rngSource.Offset(1, 0)
Set rngDest = rngDest.Offset(1, 0)
Loop Until rngDest.Cells(1, 1) = "THE END"
xlwbook.close
End Sub
Комментарии:
1. спасибо за это, я поиграю с этим. я новичок в vba … как мне включить параметр явно? Я не думаю, что это можно сделать за один раз, потому что мне нужно сделать это для нескольких листов из разных источников и суммировать итоги..
2. явный вариант: вы записываете его в самом верху своего модуля. Вы также можете установить параметр VBE, чтобы автоматически вставлять их при создании нового модуля (это в Tools, Options, Require Объявление переменной)