Совместимость vba excel 2016 и 2010
= Мир MS Excel/Статьи об Excel
Приёмы работы с книгами, листами, диапазонами, ячейками [6] |
Приёмы работы с формулами [13] |
Настройки Excel [3] |
Инструменты Excel [4] |
Интеграция Excel с другими приложениями [4] |
Форматирование [1] |
Выпадающие списки [2] |
Примечания [1] |
Сводные таблицы [1] |
Гиперссылки [1] |
Excel и интернет [1] |
Excel для Windows и Excel для Mac OS [2] |
Тема совместимости макросов для Win Excel и Mac Excel не нова. В этой статье попробуем разобраться, какие правила следует соблюдать, чтобы добиться возможности работать с файлами Excel как под Windows, так и под MacOS.
Правило первое: откажитесь от кириллицы, в идеале - везде (в тексте кода, названиях модулей, в формах и т.д.). Если это никак невозможно, то откажитесь хотя бы от русских заглавных букв. Дело в том, что у Windows и MacOS различаются кодировки, поэтому заглавные русские буквы коверкаются при открытии файла в разных ОС.
Так выглядит кодовая таблица русских букв на Windows | А так выглядит кодовая таблица русских букв на MacOS |
---|---|
Нетрудно догадаться, что если файл создан в Win Excel, а потом открыт в Mac Excel (или наоборот), заглавные русские буквы в макросах, на формах, в именах модулей будут выглядеть кракозябрами
А вот так выглядит форма с русскими заглавными буквами, которую всего лишь раз открыли на Mac Excel
Правило второе , вытекающее из первого: присвойте листам кодовые имена, записанные латиницей. Кодовое имя листа - это имя модуля листа.
Изменить его можно в свойствах:
К слову, кодовое имя листа очень удобно использовать в макросе для обращения к листу.
То же самое следует сделать и с модулем книги.
Правило третье , вытекающее из первого: если Вы собираетесь макросом копировать, перемещать, переименовывать файлы, путь к файлу тоже должен содержать только латинские буквы.
Правило четвёртое: в модулях листов и модуле книги размещайте только макросы событий соответственно листа и книги, остальные макросы должны находиться в стандартных модулях
Отдельно надо сказать про формы. В Mac Excel 2011 был инструмент для создания и редактирования форм, в Mac Excel 2016 этого инструмента попросту нет. То есть файлы с уже созданными формами открываются и работают, но редактировать форму мы не сможем. На формы также распространяется правило НЕиспользования кириллицы.
Что касается самого кода, то тут следует помнить, что Mac Excel не умеет работать с некоторыми объектами, например, со словарями (Dictionary), с регулярными выражениями (RegExp) и др.
Кроме того, многие приёмы по-разному реализуются для Win Excel и Mac Excel. Например, совершенно по-разному реализована возможность открытия файла через диалог.
Более того, различия могут быть также между версиями Mac Excel. Например, если в макросе предполагается использовать путь к файлу, то в Mac Excel до 2011 включительно системным разделителем является двоеточие
Macintosh HD:Users:elena:Desktop:test.xlsm
А в Mac Excel 2016 системным разделителем будет слэш
/Users/elena/Desktop/test.xlsm
Таким образом, если мы хотим, чтобы наш файл с макросами работал и под Windows, и под MacOS, да ещё и в разных версиях Mac Excel, можно использовать такую конструкцию
Узнайте о совместимости 32- и 64-разрядных версий Office.
Доступны 32-разрядные и 64-разрядные версии приложений Office.
64-разрядные версии Office позволяют перемещать более крупные объемы данных и обеспечивают дополнительные возможности (например, при работе с большими числами в Microsoft Excel 2010). При создании 32-разрядного кода вы можете использовать 64-разрядную версию Office, не внося какие-либо изменения. Если же вы создаете 64-разрядный код, в коде должны использоваться определенные ключевые слова и константы условной компиляции для обратной совместимости кода с более ранней версией Office и выполнения правильного кода при смешении 32- и 64-разрядного кода.
Visual Basic для приложений 7.0 (VBA 7) выпущен в виде 64-разрядных версий для Office и работает как с 32-, так и с 64-разрядными приложениями. Изменения, приведенные в этой статье, применимы только к 64-разрядным версиям Office. 32-разрядные версии Microsoft Office позволяют использовать решения, встроенные в предыдущие версии Office, без дальнейших изменений.
По умолчанию при установке 64-разрядной версии Office невозможно установить 32-разрядную версию вместе с ней. Во время установки выберите непосредственно 64-разрядную версию Microsoft Office.
Для работы с 64-разрядной версией в VBA 7 необходимо обновить существующие операторы Windows API (операторы Declare). Кроме того, необходимо обновить адресные указатели и отобразить дескрипторы окон в пользовательских типах, которые используются этими операторами. Эти вопросы, а также проблемы совместимости между 32-разрядной и 64-разрядной версиями и предлагаемые решения обсуждаются более подробно далее.
Сравнение 32- и 64-разрядных систем
Приложения, созданные с использованием 64-разрядных версий Office, могут ссылаться на адресные пространства большего объема, чем приложения, созданные в 32-разрядных версиях. Это значит, что вы можете использовать для данных больший объем физической памяти, чем раньше, и в результате снизить потребление ресурсов на перемещение данных в физическую память и из нее.
Помимо ссылок на определенные места (известных как указатели) в физической памяти, вы также можете использовать адреса для обращения к идентификаторам окна отображения (известным как дескрипторы). Размер (в байтах) указателя или дескриптора зависит от того, какая система используется (32- или 64-разрядная).
Чтобы запустить существующие решения вместе с 64-разрядными версиями Office, учитывайте следующее:
Собственные 64-разрядные процессы в Office не могут загружать 32-разрядные двоичные файлы. Это происходит при использовании существующих элементов Microsoft ActiveX и надстроек.
Ранее в VBA не было типа данных указателя, поэтому для хранения указателей и дескрипторов приходилось использовать 32-разрядные переменные. Теперь при использовании операторов Declare эти переменные усекают 64-разрядные значения, возвращаемые при вызовах API.
База кода VBA 7
VBA 7 заменяет базу кода VBA в Office 2007 и более ранних версиях. VBA 7 доступен в 32- и 64-разрядных версиях Office. Он предоставляет две константы условной компиляции:
VBA7 помогает обеспечить обратную совместимость вашего кода, проверяя, какую версию VBA использует ваше приложение — VBA 7 или более раннюю.
Win64 проверяет разрядность кода (32- или 64-разрядный код).
За некоторыми исключениями макросы, которые работают в документе в 32-разрядной версии приложения, также будут работать в 64-разрядной версии.
Совместимость элементов ActiveX и надстроек COM
Существующие 32-разрядные элементы ActiveX несовместимы с 64-разрядными версиями Office. Для элементов ActiveX и объектов COM:
- Если есть исходный код, создайте 64-разрядную версию самостоятельно.
- Если исходного кода нет, обратитесь к поставщику за обновленной версией.
Собственные 64-разрядные процессы в Office не могут загружать 32-разрядные двоичные файлы. Сюда входят общие элементы управления MSComCtl (TabStrip, Toolbar, StatusBar, ProgressBar, TreeView, ListViews, ImageList, Slider, ImageComboBox) и элементы управления MSComCt2 (Animation, UpDown, MonthView, DateTimePicker, FlatScrollBar). Эти элементы управления были установлены 32-разрядными версиями Office, выпущенными до Office 2010. При переносе кода в 64-разрядные версии Office вам потребуется найти альтернативные варианты для существующих решений VBA, использующих эти элементы управления.
Совместимость API
Сочетая VBA и библиотеки типов, вы получаете множество функций для создания приложений Office. Однако иногда бывает необходимо взаимодействовать с операционной системой компьютера и другими компонентами напрямую (например, при управлении памятью или процессами, при работе с элементами пользовательского интерфейса, такими как окна и элементы управления, или при внесении изменений в реестр Windows). В этих ситуациях лучше всего использовать одну из внешних функций, встроенных в DLL-файлы. Это можно сделать в VBA, вызвав API с помощью операторов Declare.
Операторы Declare похожи на один из приведенных ниже примеров в зависимости от того, вызывается ли подпрограмма (без возвращаемого значения) или функция (с возвращаемым значением).
Функция SubName или FunctionName заменяется фактическим именем процедуры в файле DLL и представляет собой имя, которое используется при вызове этой процедуры из кода VBA. Для имени процедуры можно также указать аргумент AliasName. Имя DLL-файла, содержащего вызываемую процедуру, следует за ключевым словом Lib. И, наконец, список аргументов содержит параметры и типы данных, которые должны быть переданы в процедуру.
Следующий оператор Declare открывает подраздел реестра Windows и заменяет его значение.
Запись Windows.h (дескриптор окна) для функции RegOpenKeyA выглядит следующим образом:
В Visual C и Microsoft Visual C++ предыдущий пример правильно компилируется как для 32-разрядных, так и для 64-разрядных версий. Это объясняется тем, что HKEY определен как указатель, размер которого показывает размер памяти платформы, на которой компилируется код.
В предыдущих версиях VBA не было определенного типа данных указателя, поэтому использовался тип Long. А поскольку тип данных Long всегда является 32-разрядным, код прерывается при работе в системе с 64-разрядной памятью, так как 32-разрядные данные могут быть усечены или перезаписаны поверх других адресов памяти. Любая из этих ситуаций может привести к непредсказуемому поведению или сбою системы.
Для решения этой проблемы VBA содержит истинный тип данных указателя: LongPtr. Новый тип данных позволяет написать исходный оператор Declare правильно:
Этот тип данных и новый атрибут PtrSafe позволяют использовать этот оператор Declare как в 32-разрядных, так и в 64-разрядных системах. Атрибут PtrSafe указывает компилятору VBA, что оператор Declare предусмотрен для 64-разрядной версии Office. При использовании оператора Declare в 64-разрядной системе без этого атрибута возникнет ошибка компиляции. Атрибут PtrSafe необязателен в 32-разрядной версии Office. Это позволяет существующим операторам Declare работать так, как и обычно.
В приведенной ниже таблице описаны новые квалификатор и тип данных, а также другой тип данных, два оператора преобразования и три функции.
В приведенном ниже примере показано, как использовать некоторые из этих элементов в операторе Declare.
Обратите внимание, что операторы Declare без атрибута PtrSafe не совместимы с 64-разрядной версией Office.
Существует две константы условной компиляции: VBA7 и Win64. Чтобы предотвратить использование 64-разрядного кода в более ранней версии Office и тем самым обеспечить обратную совместимость с предыдущими версиями Microsoft Office, используйте константу VBA7 (наиболее распространенный случай). Для кода с отличающимися друг от друга 32- и 64-разрядными версиями (например, для вызова математического API, который применяет тип данных LongLong в 64-разрядной версии и тип данных Long в 32-разрядной версии) используйте константу Win64. В следующем коде показан пример использования этих двух констант.
Подводя итог, если вы пишете 64-разрядный код и планируете использовать его в предыдущих версиях Office, рекомендуется использовать константу условной компиляции VBA7. Но если вы пишете в Office 32-разрядный код, он будет работать так же, как и в предыдущих версиях Office (без использования константы компиляции). Чтобы гарантировать использование 32-разрядных операторов для 32-разрядных версий и 64-разрядных операторов для 64-разрядных версий, лучше всего применять константу условной компиляции Win64.
Использование атрибутов условной компиляции
В следующем примере показан требующий обновления код на языке VBA, написанный для 32-разрядных версий. В устаревшем коде обратите внимание на типы данных, которые обновлены для использования LongPtr, так как ссылаются на дескрипторы или указатели.
Средством проверки совместимости обнаружены проблемы совместимости формул с более ранними версиями Microsoft Excel.
Начиная с Excel 2007 г., по умолчанию проверка совместимости проверяет наличие проблем в предыдущих версиях Excel. Если вас интересует только конкретная версия, снимите флажки для остальных версий.
Проблемы, отображаемые в списке Существенная потеря функциональности, необходимо устранить перед сохранением файла, чтобы избежать безвозвратной потери данных или неправильной работы функций.
Проблемы, отображаемые в списке Несущественная потеря точности, необязательно устранять перед сохранением книги: данные и функциональные возможности не теряются, но книга, открываемая в более ранней версии Excel, может выглядеть или работать несколько иначе.
Совет: Если имеется много проблем, требующих изучения, выберите команду Копировать на новый лист. Для работы над каждой проблемой используйте новый лист отчета о совместимости.
В этой статье
Проблемы, которые приводят к существенной потере функциональности
Некоторые формулы содержат массивы с числом элементов, превышающим поддерживаемое выбранным форматом файла. Массивы, которые содержат более 256 столбцов или 65536 строк, не будут сохранены и могут привести к разным результатам.
Что это означает. В Excel 2010 и более поздних годах можно использовать формулы массива, содержащие элементы для более чем 256 столбцов и 65 536 строк. В Excel 2007 г. это превышает ограничение для элементов массива и может возвращать другие результаты.
Что необходимо сделать. В средстве проверки совместимости нажмите кнопку Найти, чтобы найти ячейки, содержащие формулы с массивами, в которых число элементов превышает число, поддерживаемое в более ранних версиях Excel, и внесите необходимые изменения.
Что это означает. В Excel 2007 и более поздних годах формула может содержать до 64 уровней вложенности, а в Excel 97–2003 — всего 7.
Что это означает. В Excel 2007 и более поздних годах формула может содержать до 255 аргументов, но в Excel 97–2003 число аргументов в формуле не может быть больше 30.
Что это означает. В Excel 2007 г. и более поздних гг. число операндов, которые можно использовать в формулах, составляет 1024, а в Excel 97–2003 — всего 40.
Что это означает. В Excel 2007 и более поздних User-Defined функция User-Defined(UDF), создаемая с помощью Visual Basic для приложений (VBA), может содержать до 60 аргументов, но в Excel 97–2003 число аргументов в UDF ограничено VBA только 29.
В некоторых случаях к формуле добавляется префикс _xlfn, например: =_xlfn.ЕСЛИОШИБКА (1;2).
Для всех переименованных функций доступны функции совместимости. Для предотвращения ошибок можно использовать эти функции.
Новые функции можно заменить соответствующими функциями, доступными в более ранних версиях Excel. Кроме того, можно удалить формулы с новыми функциями, заменив их результатами формул.
Некоторые формулы содержат ссылки на таблицы, которые не поддерживаются выбранным форматом файла. Эти ссылки будут преобразованы в ссылки на ячейки.
Что это означает. В Excel 2007 и более поздних годах можно использовать структурированные ссылки, чтобы работать с данными таблицы проще и понятнее при использовании формул, ссылаясь на части таблиц или целые таблицы. В Excel 97–2003 эта возможность не поддерживается, и структурированные ссылки преобразуются в ссылки на ячейки.
Что необходимо сделать. В средстве проверки совместимости нажмите кнопку Найти, чтобы найти ячейки, содержащие формулы со структурированными ссылками на таблицы, и замените их соответствующими ссылками на ячейки.
Одна или несколько ячеек книги содержат правила проверки данных, использующие ссылки на более чем 8192 несмежных диапазона ячеек. Такие правила проверки данных не будут сохранены.
Что это означает. В Excel 2010 г. и более поздних гг. правила проверки данных могут ссылаться на более чем 8192 невимех ячеек. В Excel 97–2007 этот тип правила проверки данных не поддерживается и будет не доступен.
Что необходимо сделать. В средстве проверки совместимости нажмите кнопку Найти, чтобы найти ячейки, содержащие правила проверки данных, которые содержат ссылки на более чем 8192 несмежных диапазона ячеек, и внесите необходимые изменения.
Одна или несколько ячеек книги содержат правила проверки данных, использующие ссылки на значения, находящиеся на других листах. Такие правила проверки данных не будут поддерживаться в более ранних версиях Excel.
Что это означает. В Excel 2010 г. и более поздних можно использовать правила проверки данных, которые ссылаются на значения на других таблицах. В Excel 97–2007 этот тип проверки данных не поддерживается и не отображается на этом сайте.
Однако все правила проверки данных остаются доступными в книге и применяются при повторном ее повторном Excel 2010 г. или более поздней, если они не были изменены в Excel 97–2007.
Что необходимо сделать. В средстве проверки совместимости нажмите кнопку Найти, чтобы найти ячейки, содержащие правила проверки данных, в которых есть ссылки на значения на других листах, и внесите необходимые изменения на вкладке Параметры диалогового окна Проверка данных (вкладка Данные, группа Работа с данными).
Книга содержит диапазон консолидации данных, ссылающийся на ячейки вне допустимого числа строк и столбцов для выбранного формата файла. Ссылки формул на данные в этой области будут изменены и могут отображаться некорректно в более ранней версии Excel.
Что это означает. В Excel 2007 и более поздних годах диапазоны консолидации данных могут содержать формулы, которые ссылаются на данные за пределами диапазона строк и столбцов выбранного формата файла. В Excel 97–2003 г. размер всего 256 столбцов на 65 536 строк. Формулы, ссылающиеся на данные в ячейках за пределами этого диапазона строк и столбцов, корректируются и могут отображаться неправильно.
Что необходимо сделать. В средстве проверки совместимости нажмите кнопку Найти, чтобы найти диапазоны консолидации данных, содержащие формулы, которые ссылаются на данные за пределами ограничения на число строк и столбцов Excel 97–2003, и внесите необходимые изменения.
Книга содержит настраиваемые описания пользовательских функций VBA. Все настраиваемые описания будут удалены.
Что это означает. В Excel 2010 г. и более поздних Visual Basic для приложений для создания функций User-Defined (UDFs) с настраиваемой описанием. Настраиваемые описания не поддерживаются в Excel 97–2007 и будут удалены.
Что необходимо сделать. Выполнять какие-либо действия не требуется, поскольку все настраиваемые описания будут удалены.
Проблемы, которые приводят к небольшой потере точности
Одно или несколько определенных в данной книге имен содержат формулы, длина которых превышает максимальный размер, допустимый для выбранного формата файла (255 символов). Эти формулы будут сохранены, но будут усечены при редактировании в более ранних версиях Excel.
Что это означает. Если именованные диапазоны в формулах превышают предел в 255 знаков, поддерживаемый в Excel 97–2003, формула работает правильно, но усекается в диалоговом окне Имя и недоступна для редактирования.
Что необходимо сделать. В средстве проверки совместимости нажмите кнопку Найти, чтобы найти ячейки, содержащие именованные диапазоны в формулах, и внесите необходимые изменения, чтобы пользователи могли редактировать эти формулы в Excel 97–2003.
Книга содержит формулы, которые ссылаются на другие закрытые книги. Если связанные книги закрыты, то при пересчете в более ранних версиях Excel значения этих формул будут ограничены 255 знаками.
Что это означает. Если формулы в одной книге связаны с другими книгами, которые закрыты, при пересчете в Excel 97–2003 эти формулы могут отобразить не более 255 знаков. Результаты формулы могут быть усечены.
Что необходимо сделать. Найдите ячейки, содержащие формулы, которые ссылаются на другие закрытые книги, проверьте эти ссылки и внесите необходимые изменения, чтобы избежать усечения результатов формулы в Excel 97–2003.
Формула для проверки данных содержит более 255 символов.
Что это означает. Если формула проверки данных превышает заданный в Excel 97–2003 предел в 255 знаков, формула будет работать правильно, но будет усечена и недоступна для редактирования.
Что необходимо сделать. В средстве проверки совместимости нажмите кнопку Найти, чтобы найти ячейки, содержащие формулы проверки данных, и сократите число знаков в формулах, чтобы пользователи могли редактировать их в Excel 97–2003.
Такой вопрос: может ли макрос при выполнении выдавать ошибку из-за того, что он был написан на 2013ом офисе, а запускается в 2010ом?
И вообще, на одном компьютере всё идеально, а на другом ошибку выводит.
Такой вопрос: может ли макрос при выполнении выдавать ошибку из-за того, что он был написан на 2013ом офисе, а запускается в 2010ом?
И вообще, на одном компьютере всё идеально, а на другом ошибку выводит. iilfat
И вообще, на одном компьютере всё идеально, а на другом ошибку выводит. Автор - iilfat
Дата добавления - 28.07.2015 в 17:59
iilfat, здравствуйте.
может ли макрос при выполнении выдавать ошибку из-за того, что он был написан на 2013ом офисе, а запускается в 2010ом?
Да, такое возможно. Например, если Вы работаете с макро-рекодером и проводите действия с рядами на графиках - в 2013-й версии запись пройдёт через объект FullSeriesCollection, а в более ранних - через SeriesCollection. Конкретных случаев может быть масса. Если Вы хотели бы, чтобы рассмотрели Ваш - нужно:
iilfat, здравствуйте.
может ли макрос при выполнении выдавать ошибку из-за того, что он был написан на 2013ом офисе, а запускается в 2010ом?
Да, такое возможно. Например, если Вы работаете с макро-рекодером и проводите действия с рядами на графиках - в 2013-й версии запись пройдёт через объект FullSeriesCollection, а в более ранних - через SeriesCollection. Конкретных случаев может быть масса. Если Вы хотели бы, чтобы рассмотрели Ваш - нужно:
может ли макрос при выполнении выдавать ошибку из-за того, что он был написан на 2013ом офисе, а запускается в 2010ом?
Да, такое возможно. Например, если Вы работаете с макро-рекодером и проводите действия с рядами на графиках - в 2013-й версии запись пройдёт через объект FullSeriesCollection, а в более ранних - через SeriesCollection. Конкретных случаев может быть масса. Если Вы хотели бы, чтобы рассмотрели Ваш - нужно:
Rioran, к сожалению, сейчас я только на Excel 2013. Текст ошибки смогу показать только завтра. Но ошибка точно в этой области кода:
[vba]
ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
"SAP2!C1:C21", Version:=xlPivotTableVersion15).CreatePivotTable _
TableDestination:="Sample!R1C1", TableName:="СводнаяТаблица1", _
DefaultVersion:=xlPivotTableVersion15
Rioran, к сожалению, сейчас я только на Excel 2013. Текст ошибки смогу показать только завтра. Но ошибка точно в этой области кода:
[vba]
ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
"SAP2!C1:C21", Version:=xlPivotTableVersion15).CreatePivotTable _
TableDestination:="Sample!R1C1", TableName:="СводнаяТаблица1", _
DefaultVersion:=xlPivotTableVersion15
ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
"SAP2!C1:C21", Version:=xlPivotTableVersion15).CreatePivotTable _
TableDestination:="Sample!R1C1", TableName:="СводнаяТаблица1", _
DefaultVersion:=xlPivotTableVersion15
[/vba]
В общих чертах: код создаёт сводную таблицу. Автор - iilfat
Дата добавления - 28.07.2015 в 20:28
Я ведь правильно понимаю, что тут логика следующая? =>
То, что сделано на 2013 может не работать на 2010, а то, что сделано на 2010 точно будет работать на 2013?
Я ведь правильно понимаю, что тут логика следующая? =>
То, что сделано на 2013 может не работать на 2010, а то, что сделано на 2010 точно будет работать на 2013? iilfat
Для разных версия экселя подключаются разные библиотеки: для 2010-го 14-й версии, для 2013 - 15-й.
Вот так должно работать и там и там:
[vba]
Dim xl As Object
Dim Excel_version As String
Set xl = CreateObject("Excel.Application")
Excel_version = xl.Application.Version
If Excel_version = "15.0" Then
ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
"SAP2!C1:C21", Version:=xlPivotTableVersion15).CreatePivotTable _
TableDestination:="Sample!R1C1", TableName:="СводнаяТаблица1", _
DefaultVersion:=xlPivotTableVersion15
ElseIf Excel_version = "14.0" Then
ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
"SAP2!C1:C21", Version:=xlPivotTableVersion14).CreatePivotTable _
TableDestination:="Sample!R1C1", TableName:="СводнаяТаблица1", _
DefaultVersion:=xlPivotTableVersion14
End If
Set xl = Nothing
Для разных версия экселя подключаются разные библиотеки: для 2010-го 14-й версии, для 2013 - 15-й.
Вот так должно работать и там и там:
[vba]
Dim xl As Object
Dim Excel_version As String
Set xl = CreateObject("Excel.Application")
Excel_version = xl.Application.Version
If Excel_version = "15.0" Then
ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
"SAP2!C1:C21", Version:=xlPivotTableVersion15).CreatePivotTable _
TableDestination:="Sample!R1C1", TableName:="СводнаяТаблица1", _
DefaultVersion:=xlPivotTableVersion15
ElseIf Excel_version = "14.0" Then
ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
"SAP2!C1:C21", Version:=xlPivotTableVersion14).CreatePivotTable _
TableDestination:="Sample!R1C1", TableName:="СводнаяТаблица1", _
DefaultVersion:=xlPivotTableVersion14
End If
Set xl = Nothing
Dim xl As Object
Dim Excel_version As String
Set xl = CreateObject("Excel.Application")
Excel_version = xl.Application.Version
If Excel_version = "15.0" Then
ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
"SAP2!C1:C21", Version:=xlPivotTableVersion15).CreatePivotTable _
TableDestination:="Sample!R1C1", TableName:="СводнаяТаблица1", _
DefaultVersion:=xlPivotTableVersion15
ElseIf Excel_version = "14.0" Then
ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
"SAP2!C1:C21", Version:=xlPivotTableVersion14).CreatePivotTable _
TableDestination:="Sample!R1C1", TableName:="СводнаяТаблица1", _
DefaultVersion:=xlPivotTableVersion14
End If
Set xl = Nothing
Здравствуйте!В чем проблема несовместимости макроса 2003 и 20016 версии?
На флэшке и на диске есть одинаковый рабочий файл в папке. В зависимости от того с каким файлом сейчас идет работа, при закрытии его макрос должен проверить наличие флэшки и сохранить этот файл либо на флэшку (если был открыт файл на диске), либо на диск.
Этот макрос отлично работает в 2003 версии, а 2016 выдает ошибку и подсвечивает-left
'Stop
Dim x As String, y As String, z As String, flash As String, a As String
x = "F:\РАСЧЕТ ТЕПЛОВОЙ ЭНЕРГИИ.xls" 'Путь и имя файла
y = "G:\РАСЧЕТ ТЕПЛОВОЙ ЭНЕРГИИ.xls"
z = "H:\РАСЧЕТ ТЕПЛОВОЙ ЭНЕРГИИ.xls"
a = Left(ActiveWorkbook.Path, 3) 'Буква диска рабочего открытого файла
If Dir(x) <> "" Then flash = Left(x, 3) 'Если файл на флэшке найден то переменной присваивается буква диска
If Dir(y) <> "" Then flash = Left(y, 3)
If Dir(z) <> "" Then flash = Left(z, 3)
'Если флэшка есть
If flash <> "" Then
'Если открыт файл с флэшки
If a = flash Then
If MsgBox("ШЕФ! ВЫ ХОТИТЕ СОХРАНИТЬ ЭТОТ ФАЙЛ НА ДИСК?", vbYesNo) = vbYes Then
ActiveWorkbook.SaveCopyAs "C:\РАСЧЕТ ТЕПЛОВОЙ ЭНЕРГИИ\РАСЧЕТ ТЕПЛОВОЙ ЭНЕРГИИ1.xls"
End If
End If
'Если открыт файл на диске
If a = "C:\" Then
If MsgBox("ШЕФ! ВЫ ХОТИТЕ СОХРАНИТЬ ЭТОТ ФАЙЛ НА ФЛЭШКУ?", vbYesNo) = vbYes Then
ActiveWorkbook.SaveCopyAs flash & "РАСЧЕТ ТЕПЛОВОЙ ЭНЕРГИИ\РАСЧЕТ ТЕПЛОВОЙ ЭНЕРГИИ1.xls"
End If
End If
End If
Здравствуйте!В чем проблема несовместимости макроса 2003 и 20016 версии?
На флэшке и на диске есть одинаковый рабочий файл в папке. В зависимости от того с каким файлом сейчас идет работа, при закрытии его макрос должен проверить наличие флэшки и сохранить этот файл либо на флэшку (если был открыт файл на диске), либо на диск.
Этот макрос отлично работает в 2003 версии, а 2016 выдает ошибку и подсвечивает-left
'Stop
Dim x As String, y As String, z As String, flash As String, a As String
x = "F:\РАСЧЕТ ТЕПЛОВОЙ ЭНЕРГИИ.xls" 'Путь и имя файла
y = "G:\РАСЧЕТ ТЕПЛОВОЙ ЭНЕРГИИ.xls"
z = "H:\РАСЧЕТ ТЕПЛОВОЙ ЭНЕРГИИ.xls"
a = Left(ActiveWorkbook.Path, 3) 'Буква диска рабочего открытого файла
If Dir(x) <> "" Then flash = Left(x, 3) 'Если файл на флэшке найден то переменной присваивается буква диска
If Dir(y) <> "" Then flash = Left(y, 3)
If Dir(z) <> "" Then flash = Left(z, 3)
'Если флэшка есть
If flash <> "" Then
'Если открыт файл с флэшки
If a = flash Then
If MsgBox("ШЕФ! ВЫ ХОТИТЕ СОХРАНИТЬ ЭТОТ ФАЙЛ НА ДИСК?", vbYesNo) = vbYes Then
ActiveWorkbook.SaveCopyAs "C:\РАСЧЕТ ТЕПЛОВОЙ ЭНЕРГИИ\РАСЧЕТ ТЕПЛОВОЙ ЭНЕРГИИ1.xls"
End If
End If
'Если открыт файл на диске
If a = "C:\" Then
If MsgBox("ШЕФ! ВЫ ХОТИТЕ СОХРАНИТЬ ЭТОТ ФАЙЛ НА ФЛЭШКУ?", vbYesNo) = vbYes Then
ActiveWorkbook.SaveCopyAs flash & "РАСЧЕТ ТЕПЛОВОЙ ЭНЕРГИИ\РАСЧЕТ ТЕПЛОВОЙ ЭНЕРГИИ1.xls"
End If
End If
End If
'Stop
Dim x As String, y As String, z As String, flash As String, a As String
x = "F:\РАСЧЕТ ТЕПЛОВОЙ ЭНЕРГИИ.xls" 'Путь и имя файла
y = "G:\РАСЧЕТ ТЕПЛОВОЙ ЭНЕРГИИ.xls"
z = "H:\РАСЧЕТ ТЕПЛОВОЙ ЭНЕРГИИ.xls"
a = Left(ActiveWorkbook.Path, 3) 'Буква диска рабочего открытого файла
If Dir(x) <> "" Then flash = Left(x, 3) 'Если файл на флэшке найден то переменной присваивается буква диска
If Dir(y) <> "" Then flash = Left(y, 3)
If Dir(z) <> "" Then flash = Left(z, 3)
'Если флэшка есть
If flash <> "" Then
'Если открыт файл с флэшки
If a = flash Then
If MsgBox("ШЕФ! ВЫ ХОТИТЕ СОХРАНИТЬ ЭТОТ ФАЙЛ НА ДИСК?", vbYesNo) = vbYes Then
ActiveWorkbook.SaveCopyAs "C:\РАСЧЕТ ТЕПЛОВОЙ ЭНЕРГИИ\РАСЧЕТ ТЕПЛОВОЙ ЭНЕРГИИ1.xls"
End If
End If
'Если открыт файл на диске
If a = "C:\" Then
If MsgBox("ШЕФ! ВЫ ХОТИТЕ СОХРАНИТЬ ЭТОТ ФАЙЛ НА ФЛЭШКУ?", vbYesNo) = vbYes Then
ActiveWorkbook.SaveCopyAs flash & "РАСЧЕТ ТЕПЛОВОЙ ЭНЕРГИИ\РАСЧЕТ ТЕПЛОВОЙ ЭНЕРГИИ1.xls"
End If
End If
End If
[/vba]
Файл не прикладываю, т.к. ,думаю, что в нем нет необходимости. Спасибо! Автор - pechkin
Дата добавления - 04.08.2019 в 09:29
Читайте также: