2016-06-30 3 views
0

То, что я хочу сделатьУдаление ссылки из скопированного листа

Я хочу код в моей книге (wbDestination), который открывает еще одну книгу (wbBosOriginal) и копирует весь лист в качестве значений (wbBosOriginal имеет много кода в нем, в модулях и в рабочем листе, о которых идет речь, и я не хочу этого кода, потому что он ссылается на материал в wbB, который не существует в wbDestination). У меня возникли большие проблемы при вставке в качестве значений, поскольку они не будут вставлять скрытые столбцы и строки. Поэтому я решил импортировать весь лист вместо этого.

То, что я пытался и что случилось с ним

Вот блок кода, который я использовал, чтобы скопировать лист в книге назначения, в последней позиции индекса. Проблема в том, что некоторые ссылки все еще существуют для старой книги (формулы, списки проверки, условное форматирование). Я удалил все эти ссылки, но STILL, когда я вставляю лист успешно, сохраняю и снова открываю, у меня есть ошибка, говорящая, что какой-то контент не читается. Я считаю, что есть еще некоторые элементы, связанные со старой книгой.

Set wbBosOriginal = Workbooks.Open(strChosenPath, ReadOnly:=True) 
With wbBosOriginal.Sheets("BOS") 
     .Visible = True 

     'Pastes the ws in last position in wbDestination 
     .Copy after:=wbDestination.Sheets(wbDestination.Worksheets.Count) 

     Set wsNewBos = Worksheets(Worksheets.Count) 

     'Deletes VBA code in the copied sheet 
     ThisWorkbook.VBProject.VBComponents.Item(wsNewBos.CodeName).CodeModule.DeleteLines 1, _ 
      ThisWorkbook.VBProject.VBComponents.Item(wsNewBos.CodeName).CodeModule.CountOfLines 

    End With 

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

Мой вопрос

Помимо условного форматирования, списки проверки, VBA кода и формул, связывающих рабочий лист, который был наклеен на новую книгу, что другие элементы могут вызвать книгу из отверстия в ремонтном режиме каждый раз, когда из-за существующих ссылок на старую книгу?

Если мой вопрос не ясен, прокомментируйте, и я уточню.

ответ

0

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

Просто пройдитесь по каждому из листов в оригинальной книге и используйте метод .UsedRange.Hidden = False. Насколько мне известно, это должно показать каждую ячейку на листе и позволить вам выполнять оригинальные вызовы pastevalues.

+0

Это не по нескольким причинам. Во-первых, UsedRange очень ненадежна и не обнаруживает реальный диапазон использования на моем листе. См. Http://stackoverflow.com/questions/11169445/error-in-finding-last-used-cell-in-vba. Во-вторых, в исходном рабочем листе (я только копирую 1 из листов) есть группировки строк. Когда рабочая книга открывается, группировки могут быть закрыты или не быть закрыты. Даже установка всех строк в hidden = false оставляет их с высотой = 0, а изменение высоты строк в 2000 строк выполняется вечно даже с помощью '.rows (" 1: 2000 "). RowHeight = 18'. Строки с высотой 0, похоже, не копируются. –

+0

Мне удалось отобразить все строки, сначала развернув все группы строк с помощью. .Outline.ShowLevels RowLevels: = 3'. Теперь я могу копировать/вставлять значения без пропусков строк. По какой-то причине, группируя винты с свойством '.Hidden'! Рад это разобраться. Я все еще оставляю вопрос открытым, потому что он все еще действителен. –

+0

@DavidG Рад, что вы нашли решение! – RGA

1

Работа с VBE выглядит немного тяжело. Если ваш код манипулирует несколькими книгами, я бы поместил код в надстройку и не имел его в какой-либо книге. (Технически * .xlam addins - это книги, но когда я говорю «рабочая тетрадь», я имею в виду нормальные * .xls, * .xlsx, * .xlsm и т. Д.)

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

+0

Упомянуто для упоминания названных диапазонов, о которых я и не думал. Я считаю, что это помогает найти ответ. Однако в итоге я использовал другой метод. Другие комментарии за то, что меня удерживало. –

+0

Хорошие старые проблемы с видимостью ячеек! Бесконечно неудобно – JamesFaix

0

Это работает быстро и гладко (это труднее удалить все данные IMO):

Sub tests() 
    Dim AllRange As Range: Set AllRange = ActiveSheet.UsedRange 
    Dim ItemRange As Range 
    Dim myWbDestination As Workbook: Set myWbDestination = ThisWorkbook 
    Dim SheetDestination As String: SheetDestination = ("Sheet2") 
    For Each ItemRange In AllRange 
    With myWbDestination.Sheets(SheetDestination) 
    .Range(ItemRange.Address) = ItemRange.Value 
    End With 
    Next ItemRange 
End Sub 

режим ремонта может быть вызвана многими факторами, Вы должны были бы разместить код вы получаете, чтобы искать объяснение, это было бы похоже на вопрос, почему vba может сломаться. enter image description here

+0

Это просто изменяет формулы на значения. Я уже это делаю. Мой вопрос: «Есть ли другие вещи, кроме формул, списки проверки, условное форматирование и код vba, которые содержат ссылку на оригинальную книгу, скопированную». –

+0

Это должно было облегчить первоначальную проблему. У меня были большие проблемы при вставке в качестве значений, потому что они не будут вставлять столбцы и строки, которые в настоящее время скрыты. Как я уже сказал, есть много факторов, которые могут переломиться в режим восстановления, которые могут быть: 1. [Многие объединенные ячейки и пользователь сортируют диапазон: ошибка исправлена ​​с помощью пакета обновления 1 (SP1) для Excel 2013 2.] (http://www.spreadsheet1.com/how-to-diagnose-excel-file-corruption-and-repair -workbooks.html), некоторые другие [ошибки] (http://geekswithblogs.net/msoffice/archive/2013/05/02/top-5-scenarios-that-cause-corruption-in-ms-excel-file. aspx) – Sgdva

+0

Я на 99% уверен, что это не из-за ошибки. Я закончил копировать и вставлять все в качестве значений, сначала скрывая все ячейки. Это кажется очевидным, но проблема связана с группировкой строк, что предотвращает правильную работу '.Hidden = false'. Вместо этого я использовал '.Outline.ShowLevels RowLevels: = 3', чтобы сначала развернуть все группы. После этого я смог отобразить и вставить в качестве значений. Я все еще оставляю вопрос открытым, так как я хотел бы знать, что может оставить следы ссылки при копировании/вставке. –

Смежные вопросы