Невозможно удалить лист

Я пытаюсь открыть книгу и удалить из нее лист, но код запускается без ошибок, а лист все еще там … Я могу изменить его, поскольку я изменил формулы на значения на другом листе. Прежде всего — да, я знаю, что переменная «i» настроена на одну итерацию. Почему-то теперь, когда я открываю книгу, она говорит, что она заблокирована мной — что я даже не знаю, как это сделать .

Итак … как его разблокировать? Когда я перехожу в меню «Файл» -> «Информация» -> «Разрешения», появляется сообщение «Кто угодно может копировать, изменять и изменять любую часть этой книги …. Я также могу удалить лист вручную. ..

Вот код:

  Sub Change () Dim wb As Excel.WorkbookSet wb = ThisWorkbookDim ws As Excel.WorksheetSet ws = wb  .Sheets ("Результаты поиска по файлу") Dim rng As RangeSet rng = ws.UsedRangeDim cPaths As IntegercPaths = rng.ColumnDim i As Integeri = rng.RowDim oExcel As Excel.ApplicationSet oExcel = New Excel.ApplicationDim oWorkWorkdim as WorkbookDim  sh1 как Excel.WorksheetDo Пока i  

Есть идеи?


  Sub Change () Dim wb As E  xcel.WorkbookSet wb = ActiveWorkbook 'ThisWorkbookDim ws As Excel.WorksheetSet ws = wb.Sheets ("FileSearch Results") Уменьшить значение rng As RangeSet rng = ws.UsedRangeDim cPaths As IntegercPaths = rng.Column'Dim i As Integeri = rng.Column'Dim i As Integeri  Как Excel.Application *** CHANGED *** 'Установить oExcel = New Excel.Application *** CHANGED ***' Dim oWB As Workbook *** CHANGED *** Dim komm As Excel.WorksheetDim sh1 As Excel.WorksheetDo While  i  

Теперь откроется книга и удаляет лист на переднем плане, а не вызывает новый экземпляр Excel и удаляет лист в фоновом режиме. Вот почему файл остается заблокированным, поскольку новый экземпляр, который не закрыт кодом, все еще удерживает его..


0

Для всех, кто сталкивается с этим в в будущем (как и я), настоящая проблема заключается в путанице в области видимости при вызове Application.DisplayAlerts .

komm — это лист в oWB , который существует в новом экземпляре excel oExcel .

Application — это совершенно другой экземпляр и поэтому не имеет никакого эффекта.

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

Простое исправление — использовать oExcel вместо Application :

  Установите komm = oWB.Worksheets ("Комментарий") oExcel.  DisplayAlerts = Falsekomm.DeleteoExcel.DisplayAlerts = True  

Улучшите этот ответ
ответил 09 июля ’18 в 18:07
добавить комментарий |

Для тех, кто столкнется с этим в будущем (например, я), настоящая проблема заключается в смешивании в области видимости при вызове Application.DisplayAlerts .

komm — это лист в oWB , который существует в новом экземпляре из Excel oExcel .

Application — это совершенно другой экземпляр и поэтому не имеет никакого эффекта.

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

Простое исправление — использовать oExcel вместо Application :

  Установите komm = oWB.Worksheets ("Комментарий") oExcel.  DisplayAlerts = Falsekomm.DeleteoExcel.DisplayAlerts = True  


Excel, как удалять листы, не нарушая ссылок на формулы

Мне нужно удалить листы из книги без нарушения ссылок на формулы; есть ли способ сделать это с помощью кода или настроек?


4

Мой бесплатный Mappit! addin, доступный по адресу http://www.experts-exchange.com/A_2613.html, имеет в качестве одного из своих выходных данных карту, которая показывает взаимосвязи рабочих листов

Вы можете использовать это, чтобы определить, откуда может возникнуть удаление листа

Улучшите этот ответ
отредактировал 12 июня ’20 в 13:48
Сообщество ♦
1
ответил 19 окт. 2011 в 22:45
  • 1
    Из-за природы SO у вас будет меньше голосов против, если вы разместите свой модуль в другом месте;) — mplungjan 20 октября 2011 г., 20:00
  • 1
    Привет, Мишель, у меня до сих пор не было такого опыта, это больше касается компетенции решения, а не происхождения. Плюс я всегда обнаруживал, что темы excel (на любом форуме), как правило, остаются над сайтом против дискуссий на сайте. — brettdj 20 окт., 21:53
  • Отлично. Однако по какой-то причине он был отклонен. Я проголосовал за это снова. — mplungjan 21 окт., 2011 в 17:43
  • Ну вот, должно быть, я пропустил предыдущий голос против, о котором вы говорили. Спасибо за это — brettdj 21 окт. 2011, в 11:13
  • Ссылка не работает 🙁 — Коди Пирсолл, 14 мая 2014 г., 13:29
| показать 1 дополнительный комментарий

Моя бесплатная надстройка Mappit! доступна по адресу http://www.experts -exchange.com/A_2613.html имеет в качестве одного из своих выходных данных карту, которая показывает отношения листов

Вы можете использовать это, чтобы определить, где могут возникнуть потенциальные проблемы при удалении листа


2

Я знаю, что опаздываю на вечеринку, но я нашел полезный и простой обходной путь. Допустим, вы пытаетесь выполнить ВПР на листе, который постоянно заменяется (Sheet2). Это ваша формула:

  = VLOOKUP (A1, Sheet2! $ A: $ B, 2, FALSE)  

Как только вы удалите She et2, ссылка сломается. Но если вы продолжаете заменять Sheet2 листами с одинаковыми именами, сделайте следующее:

В случайной ячейке, скажем, AA1, напишите:

   Sheet2! $ A: $ B  

Не используйте знак равенства. Вы хотите, чтобы это был чистый текст.

Затем измените ВПР на:

  = VLOOKUP (A1, INDIRECT ($ AA $ 1), 2,  FALSE)  

Стирание ссылок не влияет на чистый текст, поэтому это должно оставить ваш код в безопасности..

Улучшите этот ответ
отредактировано 23 марта ’17 в 14:40
ответил 23 марта ’17 в 13:54
добавить комментарий |

Я знаю, что опаздываю на вечеринку, но я нашел полезный и простой обходной путь. Допустим, вы пытаетесь выполнить ВПР на листе, который постоянно заменяется (Sheet2). Это ваша формула:

  = VLOOKUP (A1, Sheet2! $ A: $ B, 2, FALSE)  

во время удаления Sheet2 ссылка сломается. Но если вы продолжаете заменять Sheet2 листами с одинаковыми именами, сделайте следующее:

В случайной ячейке, скажем, AA1, напишите:

   Sheet2! $ A: $ B  

Не используйте знак равенства. Вы хотите, чтобы это был чистый текст.

Затем измените ВПР на:

  = VLOOKUP (A1, INDIRECT ($ AA $ 1), 2,  FALSE)  

Стирание ссылок не влияет на чистый текст, так что это должно оставить ваш код в безопасности.


1

Скопируйте все формулы. Вставьте формулы в другую область (скажем, на лист, чтобы сохранить их, а затем скрыть). На листе с резервными копиями формулы найдите «=», замените на «|» (или любой другой редко используемый персонаж). Всякий раз, когда вам нужны формулы, вам нужно только вставить их туда, где они должны быть, а затем найти «|» и заменить на «=» (не включать «кавычки»).

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

Улучшить этот ответ
ответил 08 окт.
добавить комментарий |

Скопируйте все формулы. Вставьте как формулы в другую область (например, на лист, чтобы сохранить их, а затем скрыть). На листе с резервными копиями формулы найдите «=», замените на «|» (или любой другой редко используемый персонаж). Всякий раз, когда вам нужны формулы, вам нужно только вставить их туда, где они должны быть, а затем найти «|» и заменить на «=» (не включать «кавычки»).

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


0

Если вы жестко кодируете конкретный лист, это было бы невозможно. Вы имеете в виду, что хотите, чтобы зависимость была перенесена на другой лист?

Улучшите этот ответ
19 октября 2011 в 18:21
добавить комментарий |

Если вы жестко кодируете конкретный лист, это было бы невозможно. Вы имеете в виду, что хотите переместить зависимость на другой лист?


0

Как указано выше, невозможно удалить лист без разрыва ссылки. Однако здесь есть несколько вариантов в зависимости от ваших обстоятельств:

  1. Копировать/вставить специальные: значения, чтобы сохранить результат формулы и удалить лист.
  2. Скройте лист и защитите книгу вместо удаления листа.
  3. Измените ссылки на лист в другой книге.
Улучшите этот ответ
ответил 19 октября 2011 в 18:48
добавить комментарий |

Как указано выше, невозможно удалить лист без разрыва ссылки. Однако здесь есть несколько вариантов в зависимости от ваших обстоятельств:

  1. Копировать/вставить специальные: значения, чтобы сохранить результат формулы и удалить лист.
  2. Скройте лист и защитите книгу вместо удаления листа.
  3. Изменение ссылок на лист в другой книге.

0

это 4 спустя годы, но я хотел оставить свое решение здесь на случай, если оно поможет кому-то с такой же проблемой

Процесс:

  1. Вырезать (CTRL + X) ячейка и ее содержимое, на которое ссылается ваша формула, с 1-го листа (лист, который будет удален, например: Sheet! $ A $ 1)
  2. Вставьте вырезанную ячейку на 2-й лист в новое или то же место (лист, который будет сохранен, например: вставьте его в Sheet2! A1)
  3. Сделайте это для всех ячеек, которые необходимо перенести
  4. Убедитесь, что формулы ссылаются на второй лист ( Sheet2! вместо Sheet1! )
  5. Удалите 1-й лист.
  6. При необходимости переименуйте 2-й лист с тем же именем, что и у 1-го листа.

Надеюсь, это поможет

Улучшите этот ответ
ответил 10 нояб., в 19:29
добавить комментарий |

это прошло 4 года, но я хотел оставить свое решение здесь на случай, если оно поможет любому, у кого такая же проблема

Процесс:

  1. Вырежьте (CTRL + X) ячейку и ее содержимое, на которое ссылается ваша формула, с 1-го листа (листа, который будет удален, например. : Sheet! $ A $ 1)
  2. Вставьте вырезанную ячейку на 2-й лист в новом или том же месте (лист, который будет сохранен, например: Вставьте его в Sheet2! A1)
  3. Сделайте это для всех ячеек, которые необходимо перенести.
  4. Проверьте формулы, чтобы убедиться, что они ссылаются на второй лист ( Sheet2! вместо Sheet1! )
  5. Удалить 1-й лист
  6. При необходимости переименуйте 2-й лист с тем же именем в качестве первого листа, который у вас был

Надеюсь, это поможет


0

Я знаю, что опаздываю с ответом на этот q У меня была такая же проблема, и для ее решения я сделал следующее:

  1. Создал поддельную первую строку, содержащую мою формулу как в листе формул, так и в листе, где я извлекаю data
  2. Сделал эту первую строку скрытой на обоих листах
  3. Теперь, когда пользователь удаляет данные с помощью моего скрипта, формула снова извлекается из скрытой строки, что не может быть сломан, потому что он связан со строкой, которую нельзя удалить. (Обратите внимание, что лучше всего защитить эту строку, чтобы люди не могли случайно ее удалить)
  4. Если вы не работаете с vba, вы можете сделать то же самое вручную: показать, снять защиту и перетащить формулу снова вниз
Улучшите этот ответ
ответил 24 ноября ’16 в 15:04
добавить комментарий |

Я знаю, что опаздываю с ответом на этот вопрос, у меня была та же проблема, и для ее решения я сделал следующее:

  1. Создал поддельную первую строку, содержащую мою формулу как в листе формул, так и в листе, где я извлекаю данные.
  2. Сделал эту первую строку скрытой в обоих листов
  3. Теперь, когда пользователь удаляет данные с помощью моего скрипта, формула снова извлекается из скрытой строки, что не может быть нарушено, потому что она связана со строкой, которая не будет удалена. (Обратите внимание, что лучше всего защитить эту строку, чтобы люди не могли случайно ее удалить)
  4. Если вы не работаете с vba, вы можете сделать то же самое вручную: показать, снять защиту и перетащить формулу снова вниз

0

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

  Option ExplicitPublic arFormulasToKeep as VariantSub SomeProcessThatRemovesReference () 'Процедура, которая сохраняет формулы в общедоступной переменной Вызов StoreValidationFormulas (TheRangeToStoreFormulas)  'Здесь выполняется ваш код' Лист удаляет, который разрывает ссылку '' '' Возвращает формулы обратно в диапазон Вызов ReturnFormulasBackToRange (TheRangeToStoreFormulas) End Sub 'SomeProcessThatRemovesAsReference ()' ------------------  --------------------------------------------------  -------- Sub StoreValidationFormulas (rngToStoreFormulas As Range) 'Вызовите это перед удалением листа или разорванием ссылки' Общедоступная переменная, которая будет хранить формулы в памяти, пока вам не потребуется снова вставить arFormulasToKeep = ReturnFormulasFromRange (rngToStoreFormulas) End SubPublic  Функция ReturnFormulasFromRange (rRange As Range) As Variant 'Это будет сохранять формулы только в массиве, который является точным размером/порядком как диапазон, который вы имеете  e, вы можете изменить эту функцию, чтобы вернуть все Dim arFXsDim i, j As LongReDim arFXs (1 To rRange.Rows.Count, 1 To rRange.Columns.Count) For i = 1 To rRange.Rows.Count For j = 1 To  rRange.Columns.Count Если rRange.Cells (i, j) .HasFormula = True, то arFXs (i, j) = rRange.Cells (i, j). FormulaR1C1 Else arFXs (i, j) = "" End If Next j Next i'Pass back to function ReturnFormulasFromRange = arFXsEnd FunctionSub ReturnFormulasBackToRange (rngToReturnFormulas as range) '' 'Теперь возвращаем сохраненные формулы обратно в rangeDim i, j As LongFor i = 1  To rngToReturnFormulas.Rows.Count For j = 1 To rngToReturnFormulas.Columns.Count Если arFormulasToKeep (i, j)  "" Затем rngToReturnFormulas.Cells (i, j) .FormulaR1C1 = arFormulas iNext (iNext jNext)  Sub  

Улучшите этот ответ
ответил 20 июня ’18 в 14:10
добавить комментарий |

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

  Option ExplicitPublic arFormulasToKeep as VariantSub SomeProcessThatRemovesReference () 'Процедура, которая сохраняет формулы в общедоступной переменной Вызов StoreValidationFormulas (TheRangeToStoreFormulas)  'Здесь выполняется ваш код' Лист удаляет, который разрывает ссылку '' '' Возвращает формулы обратно в диапазон Вызов ReturnFormulasBackToRange (TheRangeToStoreFormulas) End Sub 'SomeProcessThatRemovesAsReference ()' ------------------  --------------------------------------------------  -------- Sub StoreValidationFormulas (rngToStoreFormulas As Range) 'Вызовите это перед удалением листа или разорванием ссылки' Общедоступная переменная, которая будет хранить формулы в памяти, пока вам не потребуется снова вставить arFormulasToKeep = ReturnFormulasFromRange (rngToStoreFormulas) End SubPublic  Функция ReturnFormulasFromRange (rRange As Range) As Variant 'Это будет сохранять формулы только в массиве, который является точным размером/порядком как диапазон, который вы имеете  e, вы можете изменить эту функцию, чтобы вернуть все Dim arFXsDim i, j As LongReDim arFXs (1 To rRange.Rows.Count, 1 To rRange.Columns.Count) For i = 1 To rRange.Rows.Count For j = 1 To  rRange.Columns.Count Если rRange.Cells (i, j) .HasFormula = True Тогда arFXs (i, j) = rRange.Cells (i, j) .FormulaR1C1 Else arFXs (i, j) = "" End If Next j  Затем я возвращаюсь к функции ReturnFormulasFromRange = arFXsEnd FunctionSub ReturnFormulasBackToRange (rngToReturnFormulas as range) '' 'Теперь возвращаем сохраненные формулы обратно в rangeDim i, j As LongFor i = 1 To rngToReturnFormulas.Rows.Count For j = 1 To rgцуками.  Счетчик, если arFormulasToKeep (i, j)  "" Then rngToReturnFormulas.Cells (i, j) .FormulaR1C1 = arFormulasToKeep (i, j) End If Next jNext iEnd Sub  

Оцените статью
logicle.ru
Добавить комментарий