Несовпадение типов для каждого диапазона - PullRequest
0 голосов
/ 20 января 2020

При попытке скопировать диапазон я получаю несоответствие типов. Этот макрос должен открыть 2 разные рабочие книги, а затем приступает к копированию предварительно определенного набора ячеек, поэтому пустая ячейка в рабочей книге (имя файла1) D19 становится значением уже заполненной ячейки D19 в рабочей книге (имя файла2). Это полный код, над которым я работаю:

Sub OpenWorkbooks()
Application.ScreenUpdating = False

Dim fd As FileDialog
Dim FileName1, FileName2 As String
Dim Rng, ArCell As Range

Set fd = Application.FileDialog(msoFileDialogOpen)
Dim FileChosen As Integer

FileChosen = fd.Show
fd.InitialFileName = "C:\"
fd.InitialView = msoFileDialogViewList
fd.AllowMultiSelect = True

fd.Filters.Clear
fd.Filters.Add "Excel1", "*.xlsx"
fd.Filters.Add "Excel2", "*.xlsm"

fd.FilterIndex = 1
fd.ButtonName = "Select &2Files .xlsm/.xlsx"

If FileChosen <> -1 Then
Else

FileName1 = fd.SelectedItems(1)
Workbooks.Open (FileName1)
FileName2 = fd.SelectedItems(2)
Workbooks.Open (FileName2)

End If

И вот здесь проблемная часть c, отладка выделяет третью строку (добавлено .адрес

    Set Rng = Range("D19,D20,I19,I20,C30,C32,C35,C36,D40,D41,D42,D43,D44,D45")
    For Each ArCell In Rng.Cells
    Workbooks(FileName1).Sheets(1).Range(ArCell.**address**) = Workbooks(FileName2).Sheets(1).Range(ArCell.**address**)
    Next ArCell

Application.ScreenUpdating = True
End Sub

отредактировано: @ PaichengWu Я принял ваше предложение, и оно избавилось от проблемы несоответствия типов, , но подписка вне диапазона все еще сохраняется. Я использовал этот вид определения Range = Range раньше, и я вспоминаю его, обходя необходимость в «активации» так почему же он не работает в этих обстоятельствах

Даже при попытке что-то вроде «Workbooks (FileName1) .Activate» перед операцией отладка все равно указывает «Out of range». я такой плотный, я второй раз в жизни работаю над vba ...

Ответы [ 2 ]

0 голосов
/ 20 января 2020

Dim Rng, ArCell As Range размеры Rng в качестве варианта (не определены вашим синтаксисом) и только ArCell в качестве диапазона. Попробуйте Dim Rng As Range, ArCell As Range

Свойством по умолчанию для диапазона является свойство Value . Поэтому, если вы пишете Workbooks (FileName1) .Sheets (1) .Range (arCell) = 1 , вы присваиваете значение 1 определенному диапазону. Чтобы не запутаться, напишите Workbooks (FileName1) .Sheets (1) .Range (arCell) .Value = 1

Конечно, Workbooks (FileName1) .Sheets ( 1) .Range (arCell) не имеет смысла, поскольку arCell - это диапазон, точное местоположение которого (рабочая книга и рабочий лист) уже определено. Поэтому вся ваша длинная строка сгорает до arCell.Value = 1 . То же самое для присваиваемого значения, за исключением того, что мое сокращение сгорит до arCell.Value = arCell.Value, которое вы не имеете в виду. Возможно, вы захотите поиграть с arCell.Address, но Адрес не является свойством по умолчанию, Значение . Итак, напиши, что ты имеешь в виду, и напиши, что пишешь.

0 голосов
/ 20 января 2020

Попробуйте переписать ниже

Workbooks(FileName1).Sheets(1).Range(ArCell) = Workbooks(FileName2).Sheets(1).Range(ArCell)

как

Workbooks(FileName1).Sheets(1).Range(ArCell.address) = Workbooks(FileName2).Sheets(1).Range(ArCell.address)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...