Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Не совсем понимаю как копировать\ вставить Range? (Excel)

21K
02 ноября 2006 года
vegarulez
2 / / 01.11.2006
Excel
Есть лист в нём есть шапка.
Есть другой лист в нём есть данные.
Так вот задача состоит в том чтобы данные из 2-го листа вставить в 1-ый после шапки с заданным для них форматированием колонок.
Я для этого сделал вот как:

Sub dbf_import()

Dim cnt, n, num, dnum As Integer
'Очистка
Worksheets("dbf").Range("a:a:af:af").Clear
Worksheets("dbf").Activate
With ActiveSheet.QueryTables.Add(Connection:=Array( _
"OLEDB;Provider=Microsoft.Jet.OLEDB.4.0;Password="""";User ID=Admin;Data Source=C:\Gb\;Mode=Share Deny Write;Extended Properties="""";Jet O" _
, _
"LEDB:System database="""";Jet OLEDB:Registry Path="""";Jet OLEDB:Database Password="""";Jet OLEDB:Engine Type=18;Jet OLEDB:Database Lo" _
, _
"cking Mode=0;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password="""";Jet OLE" _
, _
"DB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don't Copy Locale on Compact=False;Jet OLEDB:Compact " _
, "Without Replica Repair=False;Jet OLEDB:SFP=False"), Destination:=Range("A1" _
))
.CommandType = xlCmdTable
.CommandText = Array("123")
.Name = "123"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = True
.SourceDataFile = "C:\Gb\123.dbf"
.Refresh BackgroundQuery:=False
End With


cnt = Worksheets("Паспорт участка").Cells(1, 1).Value
n = 1
num = 26
dnum = 2
Worksheets("Паспорт участка").Activate
With ActiveSheet
Do While Not n = cnt

.Rows(num).Copy

' Вставляю строку в следующую строку
.Rows(num).Insert


Worksheets("Паспорт участка").Cells(num, 2) = Worksheets("dbf").Cells(dnum, 1)
Worksheets("Паспорт участка").Cells(num, 3) = Worksheets("dbf").Cells(dnum, 2)
Worksheets("Паспорт участка").Cells(num, 6) = Worksheets("dbf").Cells(dnum, 3)
Worksheets("Паспорт участка").Cells(num, 11) = Worksheets("dbf").Cells(dnum, 4)
Worksheets("Паспорт участка").Cells(num, 19) = Worksheets("dbf").Cells(dnum, 5)
''Worksheets("Паспорт участка").Cells(num, 21) = Worksheets("dbf").Cells(dnum, 6)
Worksheets("Паспорт участка").Cells(num, 24) = Worksheets("dbf").Cells(dnum, 7)


n = n + 1
num = num + 1
dnum = dnum + 1
Loop
Application.CutCopyMode = False
End With

End Sub


Но я вставляю построчно в цикле. Из-за этого при работе допустим с массивом в 200 записей вставка происходит около 8 секунд.
Несложно посчитать что допустим при 15000 записей на другом листе вставка будет происходить около 10 минут.

Так вот, поэтому хочу построковую вставку в цикле заменить вставкой range`a
для этого я пробовал вместо построковой вставки делать вот так:

Worksheets("dbf").Range("$A:$AF").Copy _
Destination:=Worksheets("Паспорт участка").Range("$A:$AF")

Он всё вставляет но естественно затирает шапку, так как вставляет весь массив $A:$AF в лист "Паспорт участка".

Чтобы не вставлять весь массив я делал так, без затирания шапки

Worksheets("dbf").Range("A1:AF200").Copy _
Destination:=Worksheets("Паспорт участка").Range("A26")

И впринципе меня это устраивает.
Но тогда возникает другой вопрос...

Я не знаю точную высоту(кол-во записей в массиве) копируемого массива в примере выше он равен 200. А вообще его длинна различна. У меня есть переменная cnt
(в самом верхнем коде) в которой хранится высота массива (кол-во записей в массиве). Так вот у меня вопрос как правильно эту переменную поставить вместо цифры 200 в коде

Worksheets("dbf").Range("A1:AF200").Copy _
Destination:=Worksheets("Паспорт участка").Range("A26")

Чтобы бралось значение переменной а соотвественно и массив нужной высоты.

Зараннее благодарен за помощь.
309
02 ноября 2006 года
el scorpio
1.1K / / 19.09.2006
 
Код:
Dim RangeStr as String
RangeStr = "A1:AF200" + cnt
Worksheets("dbf").Range(RangeStr).Copy
275
02 ноября 2006 года
pashulka
985 / / 19.09.2004
[QUOTE=el scorpio]
 
Код:
Dim RangeStr as String
RangeStr = "A1:AF200" + cnt
Worksheets("dbf").Range(RangeStr).Copy
[/QUOTE]

А я думаю, что правильнее будет так :

 
Код:
Worksheets("dbf").Range("A1:AF" & cnt).Copy _
Destination:=Worksheets("Паспорт участка").Range("A26")


но можно использовать и такой вариант :

 
Код:
Worksheets("dbf").Range("A1:AF1").Resize(cnt).Copy _
Destination:=Worksheets("Паспорт участка").Range("A26")
405
02 ноября 2006 года
Dmitrii
554 / / 16.12.2004
[QUOTE=vegarulez]Так вот у меня вопрос как правильно эту переменную поставить вместо цифры 200 в коде

Worksheets("dbf").Range("A1:AF200").Copy _
Destination:=Worksheets("Паспорт участка").Range("A26")

Чтобы бралось значение переменной а соотвественно и массив нужной высоты.[/QUOTE]
Например, так: [color=blue]Range("A1:AF" + CStr(cnt))[/color]
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог