Dll for excel application

title manager ms.date ms.audience ms.topic keywords ms.assetid ms.localizationpriority

Access DLLs in Excel

soliver

03/09/2015

Developer

overview

accessing dlls [excel 2007],DLLs [Excel 2007], accessing in Excel

e2bfd6ea-efa3-45c1-a5b8-2ccb8650c6ab

high

Access DLLs in Excel

Applies to: Excel 2013 | Office 2013 | Visual Studio

You can access a DLL function or command in Microsoft Excel in several ways:

  • Through a Microsoft Visual Basic for Applications (VBA) code module in which the function or command has been made available using a Declare statement.

  • Through an XLM macro sheet by using the CALL or REGISTER functions.

  • Directly from the worksheet or from a customized item in the user interface (UI).

This documentation does not cover XLM functions. It is recommended that you use either of the other two approaches.

To be accessed directly from the worksheet or from a customized item in the UI, the function or command must first be registered with Excel. For information about registering commands and functions, see Accessing XLL Code in Excel.

Calling DLL functions and commands from VBA

You can access DLL functions and commands in VBA by using the Declare statement. This statement has one syntax for commands and one for functions.

  • Syntax 1 — commands

    [Public | Private] Declare Sub name Lib "libname" [Alias "aliasname"] [([arglist])]
  • Syntax 2 — functions

    [Public | Private] Declare Function name Lib "libname" [Alias "aliasname"] [([arglist])] [As type]

The optional Public and Private keywords specify the scope of the imported function: the entire Visual Basic project or just the Visual Basic module, respectively. The name is the name that you want to use in the VBA code. If this differs from the name in the DLL, you must use the Alias «aliasname» specifier, and you should give the name of the function as exported by the DLL. If you want to access a DLL function by reference to a DLL ordinal number, you must provide an alias name, which is the ordinal prefixed by #.

Commands should return void. Functions should return types that VBA can recognize ByVal. This means that some types are more easily returned by modifying arguments in place: strings, arrays, user-defined types, and objects.

[!NOTE]
VBA cannot check that the argument list and return stated in the Visual Basic module are the same as coded in the DLL. You should check this yourself very carefully, because a mistake could cause Excel to crash.

When the function or command’s arguments are not passed by reference or pointer, they must be preceded by the ByVal keyword in the arglist declaration. When a C/C++ function takes pointer arguments, or a C++ function takes reference arguments, they should be passed ByRef. The keyword ByRef can be omitted from argument lists because it is the default in VBA.

Argument types in C/C++ and VBA

You should note the following when you compare the declarations of argument types in C/C++ and VBA.

  • A VBA String is passed as a pointer to a byte-string BSTR structure when passed ByVal, and as a pointer to a pointer when passed ByRef.

  • A VBA Variant that contains a string is passed as a pointer to a Unicode wide-character string BSTR structure when passed ByVal, and as a pointer to a pointer when passed ByRef.

  • The VBA Integer is a 16-bit type equivalent to a signed short in C/C++.

  • The VBA Long is a 32-bit type equivalent to a signed int in C/C++.

  • Both VBA and C/C++ allow the definition of user-defined data types, using the Type and struct statements respectively.

  • Both VBA and C/C++ support the Variant data type, defined for C/C++ in the Windows OLE/COM header files as VARIANT.

  • VBA arrays are OLE SafeArrays, defined for C/C++ in the Windows OLE/COM header files as SAFEARRAY.

  • The VBA Currency data type is passed as a structure of type CY, defined in the Windows header file wtypes.h, when passed ByVal, and as a pointer to this when passed ByRef.

In VBA, data elements in user-defined data types are packed to 4-byte boundaries, whereas in Visual Studio, by default, they are packed to 8-byte boundaries. Therefore you must enclose the C/C++ structure definition in a #pragma pack(4) … #pragma pack() block to avoid elements being misaligned.

The following is an example of equivalent user type definitions.

Type VB_User_Type
    i As Integer
    d As Double
    s As String
End Type
#pragma pack(4)
struct C_user_type
{
    short iVal;
    double dVal;
    BSTR bstr; // VBA String type is a byte string
}
#pragma pack() // restore default

VBA supports a greater range of values in some cases than Excel supports. The VBA double is IEEE compliant, supporting subnormal numbers that are currently rounded down to zero on the worksheet. The VBA Date type can represent dates as early as 1-Jan-0100 using negative serialized dates. Excel only allows serialized dates greater than or equal to zero. The VBA Currency type—a scaled 64-bit integer—can achieve accuracy not supported in 8-byte doubles, and so is not matched in the worksheet.

Excel only passes Variants of the following types to a VBA user-defined function.

VBA data type C/C++ Variant type bit flags Description
Double VT_R8
Boolean VT_BOOL
Date VT_DATE
String VT_BSTR OLE Bstr byte string
Range VT_DISPATCH Range and cell references
Variant containing an array VT_ARRAY VT_VARIANT Literal arrays
Ccy VT_CY 64-bit integer scaled to permit 4 decimal places of accuracy.
Variant containing an error VT_ERROR
VT_EMPTY Empty cells or omitted arguments

You can check the type of a passed-in Variant in VBA using the VarType, except that the function returns the type of the range’s values when called with references. To determine if a Variant is a Range reference object, you can use the IsObject function.

You can create Variants that contain arrays of variants in VBA from a Range by assigning its Value property to a Variant. Any cells in the source range that are formatted using the standard currency format for the regional settings in force at the time are converted to array elements of type Currency. Any cells formatted as dates are converted to array elements of type Date. Cells containing strings are converted to wide-character BSTR Variants. Cells containing errors are converted to Variants of type VT_ERROR. Cells containing Boolean True or False are converted to Variants of type VT_BOOL.

[!NOTE]
The Variant stores True as -1 and False as 0. Numbers not formatted as dates or currency amounts are converted to Variants of type VT_R8.

Variant and string arguments

Excel works internally with wide-character Unicode strings. When a VBA user-defined function is declared as taking a String argument, Excel converts the supplied string to a byte-string in a locale-specific way. If you want your function to be passed a Unicode string, your VBA user-defined function should accept a Variant instead of a String argument. Your DLL function can then accept that Variant BSTR wide-character string from VBA.

To return Unicode strings to VBA from a DLL, you should modify a Variant string argument in place. For this to work, you must declare the DLL function as taking a pointer to the Variant and in your C/C++ code, and declare the argument in the VBA code as ByRef varg As Variant. The old string memory should be released, and the new string value created by using the OLE Bstr string functions only in the DLL.

To return a byte string to VBA from a DLL, you should modify a byte-string BSTR argument in place. For this to work, you must declare the DLL function as taking a pointer to a pointer to the BSTR and in your C/C++ code, and declare the argument in the VBA code as ‘ ByRef varg As String‘.

You should only handle strings that are passed in these ways from VBA using the OLE BSTR string functions to avoid memory-related problems. For example, you must call SysFreeString to free the memory before overwriting the passed in string, and SysAllocStringByteLen or SysAllocStringLen to allocate space for a new string.

You can create Excel worksheet errors as Variants in VBA by using the CVerr function with arguments as shown in the following table. Worksheet errors can also be returned to VBA from a DLL using Variants of type VT_ERROR, and with the following values in the ulVal field.

Error Variant ulVal value CVerr argument
#NULL! 2148141008 2000
#DIV/0! 2148141015 2007
#VALUE! 2148141023 2015
#REF! 2148141031 2023
#NAME? 2148141037 2029
#NUM! 2148141044 2036
#N/A 2148141050 2042

Note that the Variant ulVal value given is equivalent to the CVerr argument value plus x800A0000 hexadecimal.

Calling DLL functions directly from the worksheet

You cannot access Win32 DLL functions from the worksheet without, for example, using VBA or XLM as interfaces, or without letting Excel know about the function, its arguments, and its return type in advance. The process of doing this is called registration.

The ways in which the functions of a DLL can be accessed in the worksheet are as follows:

  • Declare the function in VBA as described previously and access it via a VBA user-defined function.

  • Call the DLL function using CALL on an XLM macro sheet, and access it via an XLM user-defined function.

  • Use an XLM or VBA command to call the XLM REGISTER function, which provides the information that Excel needs to recognize the function when it is entered into a worksheet cell.

  • Turn the DLL into an XLL and register the function using the C API xlfRegister function when the XLL is activated.

The fourth approach is self-contained: the code that registers the functions and the function code are both contained in the same code project. Making changes to the add-in does not involve making changes to an XLM sheet or to a VBA code module. To do this in a well-managed way while still staying within the capabilities of the C API, you must turn your DLL into an XLL and load the resulting add-in by using the Add-in Manager. This enables Excel to call a function that your DLL exposes when the add-in is loaded or activated, from which you can register all of the functions your XLL contains, and carry out any other DLL initialization.

Calling DLL commands directly from Excel

Win32 DLL commands are not accessible directly from Excel dialog boxes and menus without there being an interface, such as VBA, or without the commands being registered in advance.

The ways in which you can access the commands of a DLL are as follows:

  • Declare the command in VBA as described previously and access it via a VBA macro.

  • Call the DLL command using CALL on an XLM macro sheet, and access it via an XLM macro.

  • Use an XLM or VBA command to call the XLM REGISTER function, which provides the information Excel needs to recognize the command when it is entered into a dialog box that expects the name of a macro command.

  • Turn the DLL into an XLL and register the command using the C API xlfRegister function.

As discussed earlier in the context of DLL functions, the fourth approach is the most self-contained, keeping the registration code close to the command code. To do this, you must turn your DLL into an XLL and load the resulting add-in using the Add-in Manager. Registering commands in this way also lets you attach the command to an element of the user interface, such as a custom menu, or to set up an event trap that calls the command on a given keystroke or other event.

All XLL commands that are registered with Excel are assumed by Excel to be of the following form.

int WINAPI my_xll_cmd(void)
{
// Function code...
    return 1;
}

[!NOTE]
Excel ignores the return value unless it is called from an XLM macro sheet, in which case the return value is converted to TRUE or FALSE. You should therefore return 1 if your command executed successfully, and 0 if it failed or was canceled by the user.

DLL memory and multiple DLL instances

When an application loads a DLL, the DLL’s executable code is loaded into the global heap so that it can be run, and space is allocated on the global heap for its data structures. Windows uses memory mapping to make these areas of memory appear as if they are in the application’s process so that the application can access them.

If a second application then loads the DLL, Windows does not make another copy of the DLL executable code, as that memory is read-only. Windows maps the DLL executable code memory to the processes of both applications. It does, however, allocate a second space for a private copy of the DLL’s data structures and maps this copy to the second process only. This ensures that neither application can interfere with the DLL data of the other.

This means that DLL developers do not have to be concerned about static and global variables and data structures being accessed by more than one application, or more than one instance of the same application. Every instance of every application gets its own copy of the DLL’s data.

DLL developers do need to be concerned about the same instance of an application calling their DLL many times from different threads, because this can result in contention for that instance’s data. For more information, see Memory Management in Excel.

See also

  • Developing DLLs
  • Calling into Excel from the DLL or XLL

Содержание

  • 1 Что такое EXCEL.DLL?
  • 2 Что из себя представляют файлы DLL?
  • 3 Почему у меня наблюдаются ошибки в файлах типа DLL?
  • 4 В каких случаях появляются ошибки в файлах типа DLL?
    • 4.1 Шаг 1: Зарегистрировать EXCEL.DLL вручную при помощи сервера регистрации Microsoft
    • 4.2 Шаг 2: Исправить ошибочные записи реестра для EXCEL.DLL
    • 4.3 Шаг 3: Удалить или восстановить файл EXCEL.DLL из Корзины Windows
    • 4.4 Шаг 4: Проведите полное сканирование вашего компьютера на вредоносное ПО
    • 4.5 Шаг 5: Обновите драйверы устройств на вашем компьютере
    • 4.6 Шаг 6: Используйте Восстановление системы Windows, чтобы «Отменить» последние изменения в системе
    • 4.7 Шаг 7: Удалите и установите заново программу MSDN Disc 2537.3, связанную с EXCEL.DLL
    • 4.8 Шаг 8: Запустите проверку системных файлов Windows («sfc /scannow»)
    • 4.9 Шаг 9: Установите все доступные обновления Windows
    • 4.10 Шаг 10: Произведите чистую установку Windows

Загрузка
WinThruster 2018 — Сканировать ваш компьютер на наличие ошибок реестра в EXCEL.DLL

Совместима с Windows 2000, XP, Vista, 7, 8 и 10

Установить необязательные продукты — WinThruster (Solvusoft) | Лицензия | Политика защиты личных сведений | Условия | Удаление

Обзор EXCEL.DLL

Что такое EXCEL.DLL?

EXCEL.DLL представляет собой разновидность файла DLL, связанного с MSDN Disc 2537.3, который разработан Microsoft для ОС Windows. Последняя известная версия EXCEL.DLL: 1.0.0.0, разработана для Windows. Данный файл DLL имеет рейтинг популярности 1 звезд и рейтинг безопасности «UNKNOWN».

Что из себя представляют файлы DLL?

Файлы DLL («динамически подключаемая библиотека»), такие как EXCEL.DLL – это небольшие программы, схожие с файлами EXE («исполняемыми»), которые позволяют множеству программ использовать одни и те же функции (например, печать).

Например, когда вы запускаете Windows и редактируете документ в Microsoft Word. Необходимо загружать файл DLL, контролирующий печать, только если его функции востребованы — например, когда вы решили свой документ. Когда вы выбираете «Печать», Microsoft Word вызывает файл принтера DLL, и он загружается в память (RAM). Если вы хотите документ в другой программе, например в Adobe Acrobat, будет использоваться тот же самый файл принтера DLL.

Почему у меня наблюдаются ошибки в файлах типа DLL?

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

Проще говоря, если Windows не может корректно загрузить файл EXCEL.DLL, вы получите сообщение об ошибке. Для получения дополнительной информации см. «Причины ошибок EXCEL.DLL» ниже.

В каких случаях появляются ошибки в файлах типа DLL?

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

Распространенные сообщения об ошибках в EXCEL.DLL

Наиболее распространенные ошибки EXCEL.DLL, которые могут возникнуть на компьютере под управлением Windows, перечислены ниже:

  • «EXCEL.DLL не найден.»
  • «Файл EXCEL.DLL отсутствует.»
  • «EXCEL.DLL нарушение прав доступа.»
  • «Файл EXCEL.DLL не удалось зарегистрировать.»
  • «Файл C:WindowsSystem32EXCEL.DLL не найден.»
  • «Не удалось запустить MSDN Disc 2537.3. Отсутствует необходимый компонент: EXCEL.DLL. Пожалуйста, установите MSDN Disc 2537.3 заново.»
  • «Не удалось запустить данное приложение, так как не найден файл EXCEL.DLL. Повторная установка приложения может решить эту проблему.»

Такие сообщения об ошибках DLL могут появляться в процессе установки программы, когда запущена программа, связанная с EXCEL.DLL (например, MSDN Disc 2537.3), при запуске или завершении работы Windows, или даже при установке операционной системы Windows. Отслеживание момента появления ошибки EXCEL.DLL является важной информацией при устранении проблемы.

Большинство ошибок EXCEL.DLL связано с отсутствием или повреждениями файлов EXCEL.DLL. Тот факт, что EXCEL.DLL – внешний файл, открывает возможность для всяческих нежелательных последствий.

Непредвиденные завершения работы вашего компьютера или заражение вирусом может повредить EXCEL.DLL, что приведет к ошибкам DLL. Когда файл EXCEL.DLL повреждается, он не может быть нормально загружен и выведет сообщение об ошибке.

В других случаях ошибки файла EXCEL.DLL могут быть связаны с проблемами в реестре Windows. Нерабочие ссылки DLL файлов могут помешать зарегистрировать файл DLL должным образом и вызвать ошибку EXCEL.DLL. Эти нерабочие ключи реестра могут появиться в результате отсутствия файла DLL, перемещения файла DLL или ввиду наличия остаточной ссылки DLL файла в реестре Windows после неудачной установки или удаления программы.

Более конкретно, данные ошибки EXCEL.DLL могут быть вызваны следующими причинами:

Предупреждение: Мы не рекомендуем скачивать EXCEL.DLL с сайтов типа «DLL». Такие сайты распространяют файлы DLL, которые не одобрены официальным разработчиком файла EXCEL.DLL и часто могут поставляться в комплекте с инфицированными вирусом или другими вредоносными файлами. Если вам требуется копия файла EXCEL.DLL, настоятельно рекомендуется получить ее непосредственно у Microsoft.

Ниже описана последовательность действий по устранению ошибок, призванная решить проблемы EXCEL.DLL. Данная последовательность приведена в порядке от простого к сложному и от менее затратного по времени к более затратному, поэтому мы настоятельно рекомендуем следовать данной инструкции по порядку, чтобы избежать ненужных затрат времени и усилий.

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

Шаг 1: Зарегистрировать EXCEL.DLL вручную при помощи сервера регистрации Microsoft

При установке программного обеспечения, которое использует зависимости EXCEL.DLL, это программное обеспечение должно автоматически зарегистрировать этот файл. В некоторых случаях файл DLL может быть не зарегистрирован соответствующим образом, что в результате приведет к ошибке «EXCEL.DLL не зарегистрирован». К счастью, вы всегда можете воспользоваться встроенной утилитой под названием «Сервер регистрации Microsoft» (regsvr32.exe), чтобы заново зарегистрировать файл EXCEL.DLL.

Как заново зарегистрировать EXCEL.DLL из привилегированной командной строки (Windows XP, Vista, 7, 8 и 10):

  1. Нажмите на кнопку Начать.
  2. Введите «command» в строке поиска… ПОКА НЕ НАЖИМАЙТЕ ENTER!
  3. Удерживая клавиши CTRL-Shift на клавиатуре, нажмите ENTER.
  4. Будет выведено диалоговое окно для доступа.
  5. Нажмите Да.
  6. Введите следующую команду: regsvr32 /u EXCEL.DLL.
  7. Нажмите ENTER. Для файла будет ОТМЕНЕНА РЕГИСТРАЦИЯ.
  8. Введите следующую команду: regsvr32 /i EXCEL.DLL.
  9. Нажмите ENTER. Файл будет ЗАРЕГИСТРИРОВАН ЗАНОВО.
  10. Закройте окно командной строки.
  11. Перезапустить программу, связанную с ошибкой EXCEL.DLL.

Шаг 2: Исправить ошибочные записи реестра для EXCEL.DLL

Иногда ошибки EXCEL.DLL и другие системные ошибки DLL могут быть связаны с проблемами в реестре Windows. Несколько программ может использовать файл EXCEL.DLL, но когда эти программы удалены или изменены, иногда остаются «осиротевшие» (ошибочные) записи реестра DLL.

В принципе, это означает, что в то время как фактическая путь к файлу мог быть изменен, его неправильное бывшее расположение до сих пор записано в реестре Windows. Когда Windows пытается найти файл по этой некорректной ссылке (на расположение файлов на вашем компьютере), может возникнуть ошибка EXCEL.DLL. Кроме того, заражение вредоносным ПО могло повредить записи реестра, связанные с MSDN Disc 2537.3. Таким образом, эти поврежденные записи реестра DLL необходимо исправить, чтобы устранить проблему в корне.

Редактирование реестра Windows вручную с целью удаления содержащих ошибки ключей EXCEL.DLL не рекомендуется, если вы не являетесь специалистом по обслуживанию ПК. Ошибки, допущенные при редактировании реестра, могут привести к неработоспособности вашего ПК и нанести непоправимый ущерб вашей операционной системе. На самом деле, даже одна запятая, поставленная не в том месте, может воспрепятствовать загрузке компьютера!

В связи с подобным риском мы настоятельно рекомендуем использовать надежные инструменты очистки реестра, такие как WinThruster (разработанный Microsoft Gold Certified Partner), чтобы просканировать и исправить любые проблемы, связанные с EXCEL.DLL. Используя очистку реестра, вы сможете автоматизировать процесс поиска поврежденных записей реестра, ссылок на отсутствующие файлы (например, вызывающих ошибку EXCEL.DLL) и нерабочих ссылок внутри реестра. Перед каждым сканированием автоматически создается резервная копия, позволяющая отменить любые изменения одним кликом и защищающая вас от возможного повреждения компьютера. Самое приятное, что устранение ошибок реестра может резко повысить скорость и производительность системы.

Предупреждение: Если вы не являетесь опытным пользователем ПК, мы НЕ рекомендуем редактирование реестра Windows вручную. Некорректное использование Редактора реестра может привести к серьезным проблемам и потребовать переустановки Windows. Мы не гарантируем, что неполадки, являющиеся результатом неправильного использования Редактора реестра, могут быть устранены. Вы пользуетесь Редактором реестра на свой страх и риск.

Перед тем, как вручную восстанавливать реестр Windows, необходимо создать резервную копию, экспортировав часть реестра, связанную с EXCEL.DLL (например, MSDN Disc 2537.3):

  1. Нажмите на кнопку Начать.
  2. Введите «command» в строке поиска… ПОКА НЕ НАЖИМАЙТЕ ENTER!
  3. Удерживая клавиши CTRL-Shift на клавиатуре, нажмите ENTER.
  4. Будет выведено диалоговое окно для доступа.
  5. Нажмите Да.
  6. Черный ящик открывается мигающим курсором.
  7. Введите «regedit» и нажмите ENTER.
  8. В Редакторе реестра выберите ключ, связанный с EXCEL.DLL (например, MSDN Disc 2537.3), для которого требуется создать резервную копию.
  9. В меню Файл выберите Экспорт.
  10. В списке Сохранить в выберите папку, в которую вы хотите сохранить резервную копию ключа MSDN Disc 2537.3.
  11. В поле Имя файла введите название файла резервной копии, например «MSDN Disc 2537.3 резервная копия».
  12. Убедитесь, что в поле Диапазон экспорта выбрано значение Выбранная ветвь.
  13. Нажмите Сохранить.
  14. Файл будет сохранен с расширением .reg.
  15. Теперь у вас есть резервная копия записи реестра, связанной с EXCEL.DLL.

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

Мы не несем никакой ответственности за результаты действий, совершенных по инструкции, приведенной ниже — вы выполняете эти задачи на свой ​​страх и риск.

Windows XP
http://www.theeldergeek.com/windows_xp_registry.htm

Windows 7
http://www.theeldergeek.com/windows_7/registry_edits_for_win7.htm

Windows Vista
http://support.microsoft.com/kb/2688326 — LetMeFixItMyselfAlways

Шаг 3: Удалить или восстановить файл EXCEL.DLL из Корзины Windows

  1. Просто дважды щелкните по значку Корзина.
  2. В верхнем правом углу найдите EXCEL.DLL.
  3. Если файл EXCEL.DLL присутствует в результатах поиска, выберите его и переместите в следующую папку:
    1. Windows 95/98/Me = C:WindowsSystem32
    2. Windows NT/2000 = C:WindowsSystem32
    3. Windows XP, Vista, 7, 8, 10 = C:WindowsSystem32
    4. 64-bit Windows = C:WindowsSystem32
  4. После перемещения файла EXCEL.DLL перезагрузите компьютер.

Tip: If you are positive that you deleted the EXCEL.DLL file AND emptied the Recycle Bin, then you will need to use a file recovery program to restore the EXCEL.DLL file. Click here to download a highly recommended file recovery program.

Шаг 4: Проведите полное сканирование вашего компьютера на вредоносное ПО

Есть вероятность, что ошибка EXCEL.DLL может быть связана с заражением вашего компьютера вредоносным ПО. Эти вредоносные злоумышленники могут повредить или даже удалить файлы, связанные с DLL. Кроме того, существует возможность, что ошибка EXCEL.DLL связана с компонентом самой вредоносной программы.

Совет: Если у вас еще не установлены средства для защиты от вредоносного ПО, мы настоятельно рекомендуем использовать Emsisoft Anti-Malware (скачать). В отличие от других защитных программ, данная программа предлагает гарантию удаления вредоносного ПО.

Шаг 5: Обновите драйверы устройств на вашем компьютере

Ошибки EXCEL.DLL могут быть связаны с повреждением или устареванием драйверов устройств. Драйверы с легкостью могут работать сегодня и перестать работать завтра по целому ряду причин. Хорошая новость состоит в том, что чаще всего вы можете обновить драйверы устройства, чтобы устранить проблему с DLL.

В связи с временными затратами и общей сложностью обновления драйверов мы настоятельно рекомендуем использовать утилиту обновления драйверов, например DriverDoc (разработана Microsoft Gold Partner), для автоматизации этого процесса.

Пожалуйста, учтите: Ваш файл EXCEL.DLL может и не быть связан с проблемами в драйверах устройств, но всегда полезно убедиться, что на вашем компьютере установлены новейшие версии драйверов оборудования, чтобы максимизировать производительность вашего ПК.

Шаг 6: Используйте Восстановление системы Windows, чтобы «Отменить» последние изменения в системе

Восстановление системы Windows позволяет вашему компьютеру «отправиться в прошлое», чтобы исправить проблемы EXCEL.DLL. Восстановление системы может вернуть системные файлы и программы на вашем компьютере к тому времени, когда все работало нормально. Это потенциально может помочь вам избежать головной боли от устранения ошибок, связанных с DLL.

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

Чтобы использовать Восстановление системы (Windows XP, Vista, 7, 8 и 10):

  1. Нажмите на кнопку Начать.
  2. В строке поиска введите «Восстановление системы» и нажмите ENTER.
  3. В окне результатов нажмите Восстановление системы.
  4. Введите пароль администратора (при появлении запроса).
  5. Следуйте инструкциям Мастера для выбора точки восстановления.
  6. Восстановить ваш компьютер.

Шаг 7: Удалите и установите заново программу MSDN Disc 2537.3, связанную с EXCEL.DLL

Инструкции для Windows 7 и Windows Vista:

  1. Откройте «Программы и компоненты», нажав на кнопку Пуск.
  2. Нажмите Панель управления в меню справа.
  3. Нажмите Программы.
  4. Нажмите Программы и компоненты.
  5. Найдите MSDN Disc 2537.3 в столбце Имя.
  6. Нажмите на запись MSDN Disc 2537.3.
  7. Нажмите на кнопку Удалить в верхней ленте меню.
  8. Следуйте инструкциям на экране для завершения удаления MSDN Disc 2537.3.

Инструкции для Windows XP:

  1. Откройте «Программы и компоненты», нажав на кнопку Пуск.
  2. Нажмите Панель управления.
  3. Нажмите Установка и удаление программ.
  4. Найдите MSDN Disc 2537.3 в списке Установленные программы.
  5. Нажмите на запись MSDN Disc 2537.3.
  6. Нажмите на кнопку Удалить справа.
  7. Следуйте инструкциям на экране для завершения удаления MSDN Disc 2537.3.

Инструкции для Windows 8:

  1. Установите указатель мыши в левой нижней части экрана для показа изображения меню Пуск.
  2. Щелкните правой кнопкой мыши для вызова Контекстного меню Пуск.
  3. Нажмите Программы и компоненты.
  4. Найдите MSDN Disc 2537.3 в столбце Имя.
  5. Нажмите на запись MSDN Disc 2537.3.
  6. Нажмите Удалить/изменить в верхней ленте меню.
  7. Следуйте инструкциям на экране для завершения удаления MSDN Disc 2537.3.

После того, как вы успешно удалили программу, связанную с EXCEL.DLL (например, MSDN Disc 2537.3), заново установите данную программу, следуя инструкции Microsoft.

Совет: Если вы абсолютно уверены, что ошибка DLL связана с определенной программой Microsoft, удаление и повторная установка программы, связанной с EXCEL.DLL с большой вероятностью решит вашу проблему.

Шаг 8: Запустите проверку системных файлов Windows («sfc /scannow»)

Проверка системных файлов — важная утилита, включенная в состав Windows. Она позволяет сканировать файлы на наличие повреждений и восстанавливать системные файлы Windows, такие как EXCEL.DLL. Если утилита проверки системных файлов обнаружила проблему в EXCEL.DLL или другом важном системном файле, она предпримет попытку заменить проблемные файлы автоматически, используя Кэш DLL (%WinDir%System32Dllcache). Если файл EXCEL.DLL отсутствует в Кэше DLL, или Кэш DLL поврежден, утилита предложит вставить установочный диск Windows для восстановления оригинальных файлов.

Чтобы запустить проверку системных файлов (Windows XP, Vista, 7, 8 и 10):

  1. Нажмите на кнопку Начать.
  2. Введите «command» в строке поиска… ПОКА НЕ НАЖИМАЙТЕ ENTER!
  3. Удерживая клавиши CTRL-Shift на клавиатуре, нажмите ENTER.
  4. Будет выведено диалоговое окно для доступа.
  5. Нажмите Да.
  6. Черный ящик открывается мигающим курсором.
  7. Введите «sfc /scannow» и нажмите ENTER.
  8. Проверка системных файлов начнет сканирование на наличие проблем EXCEL.DLL и других системных файлов (проявите терпение — проверка может занять длительное время).
  9. Следуйте командам на экране.

Шаг 9: Установите все доступные обновления Windows

Microsoft постоянно обновляет и улучшает системные файлы Windows, связанные с EXCEL.DLL. Иногда для решения проблемы DLL нужно просто напросто обновить Windows при помощи последнего пакета обновлений или другого патча, которые Microsoft выпускает на постоянной основе.

Чтобы проверить наличие обновлений Windows (Windows XP, Vista, 7, 8 и 10):

  1. Нажмите на кнопку Начать.
  2. Введите «update» в строке поиска и нажмите ENTER.
  3. Будет открыто диалоговое окно Обновление Windows.
  4. Если имеются доступные обновления, нажмите на кнопку Установить обновления.

Шаг 10: Произведите чистую установку Windows

Предупреждение: Мы должны подчеркнуть, что переустановка Windows займет очень много времени и является слишком сложной задачей, чтобы решить проблемы EXCEL.DLL. Во избежание потери данных вы должны быть уверены, что вы создали резервные копии всех важных документов, изображений, программ установки программного обеспечения и других персональных данных перед началом процесса. Если вы сейчас е создаете резервные копии данных, вам стоит немедленно заняться этим (скачать рекомендованное решение для резервного копирования), чтобы защитить себя от безвозвратной потери данных.

Пожалуйста, учтите: Если проблема EXCEL.DLL не устранена после чистой установки Windows, это означает, что проблема DLL ОБЯЗАТЕЛЬНО связана с аппаратным обеспечением. В таком случае, вам, вероятно, придется заменить соответствующее оборудование, вызывающее ошибку EXCEL.DLL.

Сообщения об ошибках EXCEL.DLL могут появляться в любых из нижеперечисленных операционных систем Microsoft Windows:

Обращайтесь к нам в любое время в социальных сетях для получения дополнительной помощи:

Об авторе: Джей Гитер (Jay Geater) является президентом и генеральным директором корпорации Solvusoft — глобальной компании, занимающейся программным обеспечением и уделяющей основное внимание новаторским сервисным программам. Он всю жизнь страстно увлекался компьютерами и любит все, связанное с компьютерами, программным обеспечением и новыми технологиями.

Вы загружаете пробное программное обеспечение. Подписка на один год стоимостью $39,95 необходима для разблокировки всех функций приложения. Подписка обновляется автоматически по завершению (Узнать больше). Нажав на кнопку «Начать загрузку» и установив «Софт»», я подтверждаю, что прочитал(а) и согласен(на) с Пользовательским соглашением и Политикой конфиденциальности Solvusoft.

Problem/Question/Abstract:

How do I make delphi functions available to Excel users?

I have seen many articles telling how to control Excel from within Delphi. However, it is also appealing to give Excel users (which tend to be far less programming oriented guys) the power of tools built with Dephi, its flexibility and velocity.

Answer:

The idea is very simple and is based upon the variable types that are common to Excel’s VBA and to Delphi. Those include 32 bit integer, double precision floating point and, mainly, Excel ranges.

I found that Excel sometimes interprets incorrectly simple types when passed by reference and thus I limmited their usage to value parameters.

On the other hand, ranges can only be passed by reference and can be read from but not written to. This means that, within Delphi, you must use the reserved word CONST instead of VAR.

First, I defined within a simple unit a set of functions that convert simple Variant types to simple types and viceversa. Those are IntToVar,Double and VarTodouble (the real unit also includes a StrToVar function but not a VarToStr since this one is already included in the System unit), and are used within the procedures that do the real work (RangeToMatrix, RangeToVector,VectorToMatrix and VectortoRange).

All these functions (along with some others that you might find useful) are put together in a unit called «_Variants» whose source code is copied here (with some slight modifications).

In the real unit you will find that there fucntions that provide conversion between Excel ranges and SDL delphi component suite which I have found to be quite useful (refer to www.lohninger.com).

I shall restrict the examples, however to standard types.

Lets take first a simple function:

This function, called gamma_alfa, takes as input the mean and the variance of a population and returns the alfa parameter of a gamma distribution.

In Excel’s VBA it is declared as

Declare Function gamma_alfa Lib «c:archivosdel_filesf_auxiliares_delphi» Alias «gamma_alfa_XL» (ByVal media As Double, ByVal varianza As Double) As Double

note the lib statement that refers to name that the DLL actually has.

note also the ByVal modifiers used for declaring the variables as well as the «as double» statements.
These mean that both the input and the output will be simple types of type double.

In Delphi, the function is declared as

function gamma_alfa(media, varianza : double) : Double;stdcall;

Note the stdcall at the end of the declaration. This is to ensure that Delphi will use the Microsoft calling convention

Also note the inconsistency between the delphi function’s name and the «alias» statement in VBA.

This is set in the export clause of the DLL:

Для правильной работы проверьте путь до M2DLL.DLL в Declare VBA Excel!

Так получилось, что пришлось мне срочно заняться одной задачей на Excel. Проблема была в том, что нужно было выбирать информацию из большого текстового файла по определенным критериям и вставлять её в Excel. Сразу пришла мысль использовать VBA и при помощи него написать функцию, которая будет выдавать мне строку с информацией.

А почему бы не написать DLL, подумал я, ведь раньше я уже пытался писать DLL для VBA на C++. DLL это быстро, это интересно и позволяет отвлечься от каждодневной рутины. Но, так как я давно уже всё делаю на D, то и DLL решил писать на D. В качестве путеводителя по дебрям VBA я использовал замечательную книгу Брюса Мак-Кинни «Крепкий орешек 4 visual basic» 1996 года выпуска. Книга исключительно интересная и занимательная и ни сколько не потеряла своей актуальности.

Однако вернемся в D. Обращаю внимание, что все все примеры, которые представлены ниже, проверены только на Windows 32, Excel 2003 и dmd для Windows. Первым делом пишу строку сборки DLL, где исходный файл m2dll.d, а сама DLL будет называться m2dll.dll. Так же в сборке участвует файл dll.d входящий в поставку dmd и asc1251.d из QtE5.

dmd –ofm2dll.dll m2dll dll asc1251 -L/IMPLIB -release -shared

Небольшое введение. Существует несколько типов вызовов функций отличаются тем как передаются параметры их порядок в стеке и типами возвращаемых значений. Они все стандартизированы и в компиляторах имеются специальные дериктивы указывающие, как должен компилятор оформить функцию. Это следующие типы: pascal, stdcall, winapi и т.д. Более подробно читайте в интернете.
Итак, что у нас. У нас есть D у которого упращенно тип вызова «extern (D)». Есть Excel VBA в котором упрощенно тип вызова «extern (Windows)». DLL – это набор функций (в терминах C и C++) которые могут быть загружены во время работы приложения. Таким образом, у нас фактически будет набор функций, который мы будем вызывать из VBA. В самом VBA надо описать имя и параметры для вызываемой внешней функции.

Declare Function getAdrStringVBA Lib «r:m2dll.dll» Alias «_getAdr@4» (ByVal buf As String) As Long

Что здесь основное. Это Lib “r:m2dll.dll” – имя DLL и где она расположена, Function getAdrStringVBA – это как данная функция будет называться в VBA, Alias “_getAdr@4” – это как эта функция называется в DLL ну и напоследок список параметров и возвращаемых значений. Для D эта же функция будет выглядеть так:

export extern (Windows) int getAdr(char* buffer) { … }

Компилятору сказано «export» — быдет видна в DLL «extern (Windows)» это тип вызова, winApi и дальше параметры. Все понятно, кроме имени внутри DLL “_getAdr@4”. Это имя экспортированной функции. Есть много литературы описывающей как задавать эти имена (например в файле DEF и т.д.) но мне лень это все описывать и намного проще в TotalCommander посмотреть список экспортированных функций по кнопке F3 на полученной DLL.

Теперь о параметрах. Дело в том, что типы параметров в VBA и D (32 разр) совпадают лишь частично!

Int D == Long VBA
Long D == нет соответствия в 32 разр VBA

Таким образом, где нам нужно в D иметь int – значит в VBA это будет long. Когда VBA в функции имеет описание о передачи строки, значит передается адрес этой строки, вернее структуры содержащей в том числе и строку.

Мне было интересно проверить расположение данных в структурах VBA, типа как их обрабатывать в D. Для этого я пользовался интерпретатором VBA (окно Immediate в VBA Excel).
Первая задача – это научится смотреть дамп памяти структуры из VBA например строки. Как получить адрес строки в VBA, если самом VBA нет понятия указатель, вернее оно присутствует неявно. Первая наша функция в DLL будет возвращать адрес строки VBA. Их описание приведено выше. В VBA возвращается число (long) которое и есть адрес. Вторая наша функция dumpForVBA(), получая long из VBA, формирует строку С формата и записывает её в буфер, который сформирован VBA внутри функции dumpPointer():

Dim buf As String
buf = String(1000, 0)

Для испытаний, на уровне модуля VBA я определил две переменных:

Public str As String
Public adrStr As Long

Кстати, обращаю внимание, что все переменные в VBA должны быть объявлены явно, если этого не делать, то по умолчанию переменные получают тип Variant с которым D не умеет работать. Я опускаю передачу целых чисел в DLL и их возврат. Тут все просто, все передается и возвращается по значению. Это и понятно, работаем через аппаратный стек. Намного интереснее строки. Для исследования, я использую процедуру t1() в которой записан код VBA. Просмотр результата в окне Immediate. Если поставить текстовый курсор внутри процедуры t1() на любом операторе и нажать F5 – то будет выполнена эта процедура. Это избавляет от лишней писанины.

  Sub t1()      '1 - исследуем строку VBA      str = "ABC"      adrStr = getAdrStringVBA(str) 'Взяли адрес      'Распечатали содержимое по адресу      Debug.Print adrStr, " --> " & dumpPointer(adrStr, 0)  End Sub  

Результат выполнения:

82468836      —> 65 — 66 — 67 — 0 — 0 — 0 — 0 — 0 — 108 — 0 — 0 — 0 – Действительно видна наша строка.  Если верить «Крепкому орешку», то длина строки расположена в 32 разрядном слове левее нашей строки. Проверим. Для этого вычтем 4 (сместимся на 4 ячейки) и посмотрим дамп.

82468832      —> 3 — 0 — 0 — 0 — 65 — 66 — 67 — 0 — 0 — 0 — 0 — 0 – Отлично видно, что длина строки равна 3.

После нескольких попыток, выяснилось, что даже в рамках одной процедуры VBA перемещает строки. Вроде по этому адресу должна быть строка, а там её уже нет! Чудеса. Для избавления от этого эффекта пришлось изменить процедуры вызова.

  Sub t1()      Dim s1 As String, s2 As String      str = "ABCD"      adrStr = getAdrStringVBA(str)      s1 = dumpPointer(adrStr, 0)      s2 = dumpPointer(adrStr - 4, 0)      Debug.Print adrStr, " --> " & s1      Debug.Print adrStr - 4, " --> " & s2  End Sub  

Пришлось ввести две лишних переменных, чтобы предотвратить выделение памяти, которое приводит к перемещению строки в памяти VBA. Теперь результат стабильный.

82338988      —> 65 — 66 — 67 — 68 — 0 — 0 — 0 — 0 — 108 — 0 — 0 — 0 —
82338984      —> 4 — 0 — 0 — 0 — 65 — 66 — 67 — 68 — 0 — 0 — 0 — 0 —

Хорошо. Но надо проверить факт, как это утверждается в документации, того, что VBA всегда ставит 0 (ноль) в конце строки. Как бы это проверить…

Интересная вскрылась ситуация. Оказывается VBA все время меняет расположение строк в памяти. Фактически каждое новое присваивание чего-то строке меняет её адрес в памяти. Причем, старая строка просто занимается новым содержимым, при том уже в формате Unicode.

  Dim ms1 As String      ms1 = String(4, 65)      adrStr = getAdrStringVBA(ms1) 'Взяли адрес      s1 = dumpPointer(adrStr, 0)      s2 = dumpPointer(adrStr - 4, 0)      Debug.Print adrStr, " --> " & s1      Debug.Print adrStr - 4, " --> " & s2      ms1 = "BB"      Dim adrStr2 As Long      adrStr2 = getAdrStringVBA(ms1) 'Взяли адрес      Debug.Print adrStr2      s1 = dumpPointer(adrStr, 0)      s2 = dumpPointer(adrStr - 4, 0)      Debug.Print adrStr, " --> " & s1      Debug.Print adrStr - 4, " --> " & s2  EndSub  

Вывод:

72519660      —> 65 — 65 — 65 — 65 — 0 — 0 — 53 — 0 — 49 — 0 — 57 — 0 —72519656      —> 4 — 0 — 0 — 0 — 65 — 65 — 65 — 65 — 0 — 0 — 53 — 0 —7251986072519660      —> 66 — 0 — 66 — 0 — 0 — 0 — 32 — 0 — 0 — 0 — 57 — 0 —72519656      —> 4 — 0 — 0 — 0 — 66 — 0 — 66 — 0 — 0 — 0 — 32 — 0 —

Вначале создаётся строка из 4 букв A и это видно по адресу 72519660, потом я пытаюсь присвоить более короткую строку в надежде, что VBA экономя обращения к памяти, запишет её в тот же адрес. Однако ничего подобного не происходит. Создается совершенно новая переменная (её адрес 72519860), а в старый адрес записывается новая строка в формате Unicode.

Почитав документацию вижу следующую фразу: «VBA при обращении к внешним функциям DLL создаёт полную копию исходной строки, при этом конвертируя её из исходного формата Unicode в ASCII представление с конечным нулем для обработки функциями WinApi». Вот оно оказывается как. Теперь понятно почему оператор ms1 = «BB» вызвал создание новой копии. Это была подготовка к вызову внешней функции. Провожу ещё один эксперимент, пытаюсь понять, неужели VBA на каждое присваивание заново делает выделение памяти. Ниже кусочек кода:

  ms1 = String(10, 65)  ms1 = "BB"  adrStr = getAdrStringVBA(ms1)  s1 = dumpPointer(adrStr, 0)  s2 = dumpPointer(adrStr - 4, 0)  Debug.Print adrStr, " --> " & s1  Debug.Print adrStr - 4, " --> " & s2  

Вывод:

72520940      —> 66 — 66 — 0 — 0 — 65 — 0 — 65 — 0 — 65 — 0 — 65 — 0 —72520936      —> 2 — 0 — 0 — 0 — 66 — 66 — 0 — 0 — 65 — 0 — 65 — 0 —

Вот и ответ. Забиваем строку 10 буквами A (код 65) и тут же присваиваем новое значение “BB” – которое явно короче и может использовать старый буфер. И точно – в ответе видно, что был использован предыдущий буфер, который был забит 10 буквами A в Unicod (65;0), но в него положили уже сконвертированное значение, подготовленное для передачи во внешнюю функцию.

Со строками разобрались. Вывод для работы со строками в DLL: обязательно нужна промежуточная функция на VBA, которая создаст локальный буфер большого размера, в который мы из DLL и будем записывать результирующие строки для возврата в VBA. Далее нужно извлечь из этого буфера нужное количество символов, которое мы вернем как возвращаемое значение. Пример такого подхода Public Function dumpPointer(pointer As Long, sw As Long) As String. Хорошо, а как быть со строками которые нужно отдать в DLL. А тут все просто, VBA сам выделяет буфер и ещё конвертирует из Unicode, да ещё и количество записывает, что для нас очень кстати, так как позволяет передавать и 0 в строке (фактически двоичные данные). Таким образом можно и передать и вернуть двоичные данные. Добраться до внутреннего представления строк VBA в Unicode возможно, но есть ли в этом надобность.

Рассмотрим массивы и их передачу в DLL. Начнем с массива целых чисел. Что бы получить адрес массива, мы воспользуемся той же функцией в DLL, что и для получения адреса строк. Единственно, что немного обманем VBA, написав новую декларацию.

Declare Function getAdrArrayVBA Lib «r:m2dll.dll» Alias «_getAdr@4» (ByRef buf As Long) As Long

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

  Dim m(2) As Long  m(0) = 1: m(1) = 3  adrStr = getAdrArrayVBA(m(0))  s1 = dumpPointer(adrStr, 0)  s2 = dumpPointer(adrStr - 4, 0)  Debug.Print adrStr, " --> " & s1  Debug.Print adrStr - 4, " --> " & s2  

Вывод:
72514896      —> 1 — 0 — 0 — 0 — 3 — 0 — 0 — 0 — 0 — 0 — 0 — 0 —
72514892      —> 0 — 0 — 0 — 140 — 1 — 0 — 0 — 0 — 3 — 0 — 0 — 0 —

Мы забираем адрес первого элемента массива и в дампе фактически видим сам массив в разрезе четырех байт. Отсюда вывод о том, как работать с массивами. Создаём массив большого размера, в DLL его модифицируем, передавая новую длину, и уже в VBA копируем значимую часть для сохранения результата. Аналогичный должно быть и со структурами, но проверять мне было лень…

Теперь, когда более менее ясно как обмениваться данными из VBA в DLL, вернемся непосредственно в D. Фактически разработчики уже все за нас предусмотрели написав нам dll.d!

В ней описываются точки входа и инициализация GC и Phobos. Таким образом, делать практически ничего не нужно. НО! Есть маленькое но. Так как у нас функции extern (Windows) нам не позволено пользоваться в таких процедурах всеми возможностями динамического распределения памяти. Я не могу дать четкого ответа, чем можно пользоваться а чем нет, но есть выход. Определяем обычные функции (по умолчанию они будут вызова D) и спокойно в них делаем работу, а функции extern (Windows) используем только для обмена параметрами с VBA.

Исходный код m2dll.d с комментариями, а также все необходимые файлы прикреплены ниже. А вот базу с данными, которые передавались в Excel, к сожалению, предоставить не могу, ибо в ней конфиденциальная информация.

Файлы: vba_and_d.zip

Ошибки Microsoft.Office.Interop.Excel.dll

Ошибки Microsoft.Office.Interop.Excel.dll возникают по нескольким причинам, например, файл может быть поврежден, удален или не найден на компьютере. Распространенные ошибки библиотек:

  • Ошибка при запуске Microsoft.Office.Interop.Excel.dll: не найден указанный модуль.
  • Файл не предназначен или несовместим с версией Windows.
  • Отсутствует Microsoft.Office.Interop.Excel.dll, попробуйте переустановить программу.
  • Модуль или библиотека не обнаружены на компьютере.
  • Microsoft.Office.Interop.Excel.dll вернул код ошибки.

Чтобы исправить ошибки Microsoft.Office.Interop.Excel.dll, скачайте файл и переустановите его в системной папке Windows. В некоторых случаях файл должен находиться в папке с игрой или программой. Подробная инструкция по установке Microsoft.Office.Interop.Excel.dll и других библиотек находится в разделе «Помощь».

How to fix the Microsoft.office.interop.excel.dll error?

First of all, it is worth understanding why a microsoft.office.interop.excel.dll file is missing and why microsoft.office.interop.excel.dll errors occur. It is widespread for users to encounter situations where software does not work due to flaws in .dll files.


What is a DLL file, and why you receive DLL errors?

DLLs (Dynamic-Link Libraries) are shared libraries in Microsoft Windows, implemented by Microsoft Corporation. DLL files are just as important as files with an EXE extension, and DLL archives are simply impossible to implement without tools with .exe extension.:


When Microsoft.office.interop.excel.dll is the missing error appears?

If you see these messages, you have some problems with Microsoft.office.interop.excel.dll:

  • «The program can’t start because Microsoft.office.interop.excel.dll is missing from your computer».
  • «Microsoft.office.interop.excel.dll Missing».
  • «Microsoft.office.interop.excel.dll Not Found».
  • «Microsoft.office.interop.excel.dll is missing from your computer. Try reinstalling the program to fix this problem.»
  • «This application has failed to start because Microsoft.office.interop.excel.dll was not found. Reinstalling the application may fix this problem.»

But what do we do when there are problems when running a program? In this case, a problem with Microsoft.office.interop.excel.dll. Here are a few ways to deal with this error quickly and permanently.:


Method 1: Download Microsoft.office.interop.excel.dll and install it manually

First of all, you need to download Microsoft.office.interop.excel.dll to PC from our site.

  • Copy the file to the program install directory after where it is missing the DLL file.
  • Or move the DLL file to the directory of your System (C:WindowsSystem32, and for a 64 bit in C:WindowsSysWOW64).
  • Now you need to reboot the computer.

If this method does not help and you see the messages like these — «microsoft.office.interop.excel.dll Missing» or «microsoft.office.interop.excel.dll Not Found,» check to the next step.

Microsoft.office.interop.excel.dll Versions

Version

Bits

Company

Size

12.0.6600.1000

32 bit

Microsoft Corporation

1.22 MB

Version

Bits

Company

Size

12.0.6425.1000

32 bit

Microsoft Corporation

1.22 MB


Method 2: Fix Microsoft.office.interop.excel.dll automatically using the error fixing tool

As practice shows, the error is caused by an unintentionally deleted Microsoft.office.interop.excel.dll file, which forces applications to crash. Malicious programs and infections by them cause Microsoft.office.interop.excel.dll with the rest of the system files to get corrupted.

You can fix Microsoft.office.interop.excel.dll automatically using the error fixing tool! This kind of device is designed to repair corrupted/deleted files in Windows folders. Install it, run it, and the program will automatically fix your Microsoft.office.interop.excel.dll problems.

If this method does not help, check to the next step.


Method
3: Install Or Reinstall The Microsoft Visual C ++ Redistributable Package

Microsoft.office.interop.excel.dll error can also appear because of Microsoft Visual C++ Redistributable Package. You should check for updates and reinstall the software. Use Windows Updates search for this action. When you find the Microsoft Visual C ++ Redistributable Package, you can update it or remove the outdated version and reinstall the program.

  • Press the key with the Windows logo on the keyboard — select Control Panel — look through the categories — click on Uninstall.
  • Check the version of Microsoft Visual C++ Redistributable — uninstall the older version.
  • Repeat uninstallation with the rest of Microsoft Visual C++ Redistributable.
  • You can install Visual C++ redistributable 2015 Redistribution Update 3 from the official Microsoft website.
  • After downloading the installation file, run it and install it on your PC.
  • Reboot the computer after successful installation.

If this method does not help, check to the next step.


Method
4: Reinstall The Program

Once a particular program starts to fail due to a missing .DLL file, reinstall the program so that the problem is safely resolved.

If this method does not help, check to the next step.


Method
5: Scan Your System For Malware And Viruses

System File Checker (SFC) is a utility in Windows that allows users to scan for corruptions in Windows system files and restore them. This guide describes how to run the System File Checker tool (SFC.exe) to scan your system files and to repair missing or corrupted system files (including .DLL files). If a Windows Resource Protection (WRP) file is missing or corrupted, Windows might not behave as expected. For example, some Windows functions might not work, or Windows might crash. The «sfc scannow» option is one of several specific switches available with the sfc command, the Command Prompt command used to run System File Checker. To run it, first open Command Prompt first by typing «command prompt» in Search, right-click on «Command Prompt», and then select «Run as administrator» from the drop-down menu to run Command Prompt with administrator privileges. You must run an elevated Command Prompt to be able to perform a SFC scan.

  • Run a full system scan at the expense of an antivirus program. Do not rely only on Windows Defender. It is better to choose additional antivirus programs in parallel.
  • After a threat is detected, you need to reinstall the program that shows this notification. In most cases, you need to reinstall the program so that the problem immediately disappears.
  • Try to perform a restore at system startup if all the above steps didn’t help.
  • As a last resort, reinstall your Windows operating system.

In the Command Prompt window, type «sfc /scannow» and press Enter on the keyboard to execute this command. System File Checker will start and should take some time to complete the scan (about 15 minutes). Wait for the scanning process to complete and restart the computer to see if you still receive «The program can’t start because Microsoft.office.interop.excel.dll is missing from your computer» error.


Method 6: Use a registry cleaner

Registry Cleaner is a powerful utility that can clean unnecessary files, fix registry problems, find out the causes of slow PC operation and eliminate them. The program is ideal for working on a PC. People with administrator rights can quickly scan and then clean a user’s registry.

  • Download the application to your Windows operating system.
  • Now, install the program and run it. The utility will automatically clean and fix the problem areas of your computer.

If this method does not help, check to the next step.


Frequently Asked Questions (FAQ)

QWhat is the latest version of microsoft.office.interop.excel.dll file?

A12.0.6600.1000 is the latest version of microsoft.office.interop.excel.dll available to download

QWhere do I put microsoft.office.interop.excel.dll files in Windows 10?

Amicrosoft.office.interop.excel.dll should be located in the Windows system folder

QHow can I install missing microsoft.office.interop.excel.dll

AEasiest way is to you use dll error fixing tool

Первым делом:

Скачайте библиотеку — скачать microsoft.office.interop.excel.dll

Затем:

Поместите microsoft.office.interop.excel.dll
в одну из следующих папок:

Если у вас 64-битная версия Windows, то поместите файл в:

«C:WindowsSysWOW64»

Если у вас 32-битная версия Windows, то поместите файл в:

«C:WindowsSystem32»

После этого

Перезагрузите компьютер, чтобы изменения вступили в силу.

Всё равно выдаёт ошибку microsoft.office.interop.excel.dll
не был найден?

Тогда придётся установить этот файл вручную. Для этого:

Зайдите в меню «Пуск».

В строчке поиска введите «cmd». И запустите найденную программу от имени администратора.

В открывшемся окне введите «regsvr32 microsoft.office.interop.excel.dll
«.

После этого снова перезагрузите компьютер. Теперь ошибка должна быть исправлена.

Если что-то не понятно прочитайте более подробную инструкцию — как установить dll файл.

Студворк — интернет-сервис помощи студентам

Пытаясь научиться подключать к VBA хотя бы самую тривиальную функцию на C++.

Для примера написал на C++ простую функцию Kvadrat и попытался сделать DLL. Сначала использовал Dev-C++. Создаю там проект, выбираю иконку «DLL». Появляется два файла. «dll.h» и «dllmain.cpp».

«dll.h» содержит:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#ifndef _DLL_H_
#define _DLL_H_
 
#if BUILDING_DLL
#define DLLIMPORT __declspec(dllexport)
#else
#define DLLIMPORT __declspec(dllimport)
#endif
 
class DLLIMPORT DllClass
{
    public:
        DllClass();
        virtual ~DllClass();
        void HelloWorld();
};
 
#endif

После этого в «dll.h» я дописываю следующее:

C++
1
double kvadtar( double x);

Далее в изначально пустой файл «dllmain.cpp» я дописываю:

C++
1
2
3
4
double kvadtar( double x)
{
    return x*x;
}

Компилирую. Ошибок нет, всё ОК.

Далее в VBA Excel написал следующее (как прочитал в соседних ветках форума, это правильно):

Visual Basic
1
2
3
4
5
6
Declare Function kvadrat Lib "F:CODINGCPPdll03Project1.dll" (x As Double) As Double
Sub TTTTT()
    Dim x As Double
    x = 4
    Debug.Print kvadrat(a)
End Sub

При запуске кода выдаёт ошибку — «File not found F:CODINGCPPdll03Project1.dll«. Хотя файл там есть!

Ладно. Наверное Dev-C++ что-то делает не так.

Скачал с сайта Microsoft Visual Studio 2015. Установил. Создаю в нём проект (Консольное приложение Win32, далее галочка «Библиотека DLL». Все остальные параметры по умолчанию. Проект содержит 5 файлов: stdafx.h, targetver.h, ConsoleApplication1.cpp, dllmain.cpp, stdafx.cpp.
В файл «dllmain.cpp» дописываю свою функцию. Теперь он содержит:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// dllmain.cpp: определяет точку входа для приложения DLL.
#include "stdafx.h"
 
BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}
 
double kvadtar( double x)
{
    return x*x;
}

Компилирую. Ошибок нет. Меняю в своём коде VBA (см. выше) путь к файлу DLL. Запускаю. Снова ошибка:
«Can’t find DLL entry point kvadrat in F:CODINGCPPtestvsConsoleApplication1DebugCon soleApplication1.dll«.

Далее сделал всё так, как написано в ссылке. Однако и теперь ни выдаётся та же ошибка (Can’t find DLL entry point).

Что я делаю не так?

  • Download demo — 23.4 KB
  • Download source — 3.98 KB

Introduction

This article shows an easy way of implementing a user defined function (UDF) in a C++ dynamic link library; the function takes an array as an argument and returns a modified array to Excel. The argument and the returned array can be any or both a Range object or VBA array (a SAFEARRAY).

Background

As a frequent user of Excel, I have found the VBA programming environment very useful for extending the capabilities of Excel built-in functions. However, VBA is an interpreted language, meaning its instructions are run, or interpreted, when the source code is run. When running procedures or functions implying large amounts of calculations, speed can become a limiting factor. Fortunately, VBA has the capability of using compiled code in other languages contained in DLLs or exe files. There is a large amount of documentation for building DLLs which can be called from VBA. I have had, however, great difficulties in finding a complete reference on how to build or use compiled code that makes use of Arrays, from and back to VBA. Arrays in Excel spreadsheets are defined as Ranges, whereas in the VBA environment, they are manipulated as SAFEARRAYs. Here, I provide a very simple function that takes an Array from Excel, checks if it is a Range object or a SAFEARRAY, makes some very simple modifications to its numerical values, and returns the result to Excel as an Array which can be entered as a spreadsheet function or used in the VBA environment.

Using the code

The function CheckExcelArray takes the Array from Excel, be it a Range object or a VBA SAFEARRAY, and returns a VARIANT SAFEARRAY. If the argument for the function is a Range object, its values are passed to a VARIANT SAFEARRAY through the IDispatch interface.

VARIANT _stdcall CheckExcelArray(VARIANT& ExcelArray)
{
    VARIANT dvout;
    switch(ExcelArray.vt)
    {
        case VT_DISPATCH:
                        {
            EXCEPINFO excep;
            DISPPARAMS dispparams;
            unsigned int uiArgErr;
            DISPID dispidValue;
            LPOLESTR XName = L"Value";

            ExcelArray.pdispVal->GetIDsOfNames(IID_NULL, &XName,
                    1, LOCALE_SYSTEM_DEFAULT, &dispidValue);

            dispparams.cArgs = 0;
            dispparams.cNamedArgs = 0;

                        ExcelArray.pdispVal->Invoke(dispidValue, IID_NULL,
               LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYGET, 
               &dispparams, &dvout, &excep, &uiArgErr);

            ExcelArray.pdispVal->Release();

            return dvout;
        }
        break;

        default:
                    return ExcelArray;
            break;
    }
    VariantClear(&dvout);
    VariantClear(&ExcelArray);
}

Once the Array is available for processing, the result of calculations made with its elements can be returned to Excel as a VARIANT SAFEARRAY. The function SumOneToArray performs the simplest calculations, and returns a modified Array to Excel.

VARIANT _stdcall SumOneToArray(VARIANT sourceArray)
{

    
    if(sourceArray.vt==VT_DISPATCH)
        sourceArray = CheckExcelArray(sourceArray);

    long ncols, nrows, i, j;

    
    ncols=(sourceArray.parray)->rgsabound[0].cElements;
    nrows=(sourceArray.parray)->rgsabound[1].cElements;

    
    VARIANT *dArray = new VARIANT [nrows*ncols];

    for(i=0; i<nrows; i++)
    {
        for(j=0; j<ncols; j++)
        {
            long indi[] = {i+1,j+1};
            
            SafeArrayGetElement(sourceArray.parray, indi, &dArray[(i*ncols)+j]);
        }
    }

    
    VARIANT destArray;
    destArray.vt = VT_ARRAY | VT_VARIANT;

    SAFEARRAYBOUND sab[2];
    sab[0].lLbound = 1; sab[0].cElements = nrows;
    sab[1].lLbound = 1; sab[1].cElements = ncols;
    destArray.parray = SafeArrayCreate(VT_VARIANT, 2, sab);

    for(i=0; i<nrows; i++)
    {
        for(j=0; j<ncols; j++)
        {
            long indi[] = {i+1,j+1};

            
            switch(dArray[(i*ncols)+j].vt)
            {
                case VT_I2:
                    dArray[(i*ncols)+j].iVal=dArray[(i*ncols)+j].iVal + 1;
                    break;

                case VT_R8:
                    dArray[(i*ncols)+j].dblVal=dArray[(i*ncols)+j].dblVal + 1;
                    break;

                                                                                
                    default:
                    break;
            }

                        SafeArrayPutElement(destArray.parray, indi, &dArray[(i*ncols)+j]);
        }
    }

        delete [] dArray;

        return destArray;

    
    VariantClear(&sourceArray);
    VariantClear(&destArray);
}

The declaration of the function in VBA allows its use both from the spreadsheet and in the VBA programming environment. For example, by selecting cells B10:F14 and entering with <CTRL><SHIFT><ENTER> =SumOneToArray(B3:F7), the selected range is filled with an array where all its elements are one unit larger than the array which was passed as argument to the function. The declaration of these functions in VBA is quite direct.

Public Function CheckExcelArray Lib "ExcelArray" (ByRef x As Variant) As Variant
Public Function SumOneToArray Lib "ExcelArray.dll" (ByVal x As Variant) As Variant

The following code shows its use within the VBA programming environment:

Sub UseSumOne()
    Dim Y(5, 1) As Variant
    Dim sum1 As Double, sum2 As Double
    For i = 1 To 5
        Y(i, 1) = i
    Next i
    sum1 = Application.Sum(Y)
    Debug.Print sum1
    sum2 = Application.Sum(SumOneToArray(Y))
    Debug.Print sum2
    Debug.Print sum2 - sum1
    
    
    
    
    

End Sub

To use the demo project file «ExcelArray.xls«, you have to place it in the same folder as «ExcelArray.dll«.

I am a Biologist from Argentina. I make intense use of Excel such that I am interested in extending Excel capabilities with compiled code in C/C++.

Создание проекта

Создаем обычную динамическую библиотеку. Выбираем файл, создать, потом Win32 Dynamik-Link Library. Не забудьте указать имя проекта (DllExcel).

46_1.gif (19602 b)

И три файла нужно создать в проекте. Как мы это делали в «Шаг 1 — Минимальный проект».

dllexcel.cpp
dllexcel.h
dllexcel.def

46_2.gif (2354 b)

Создаем код

//				Step46
// Сайт Первые шаги (firststeps.narod.ru)
// Каев Артем (1999-2001)
// создано 1999 г.
// обновление 10.07.2001
// dllexcel.h
#include "windows.h"
extern "C"
{
void WINAPI MyTest();
}
// Step46
// Сайт Первые шаги (firststeps.narod.ru)
// Каев Артем (1999-2001)
// создано 1999 г.
// обновление 10.07.2001
// dllexcel.cpp
#include "dllexcel.h"
void WINAPI MyTest()
{
MessageBox(0,"Hellos","Dll",MB_OK);
}
; dllexcel.def
EXPORTS
MyTest @1

Описание и макрос Excel

Declare Sub MyTest Lib "dllexcel.dll" ()
Sub Test()
MyTest
End Sub

Вот так работает наша DLL.

46_3.gif (3996 b)

Описание

Первым шагом мы реализовали саму функцию в CPP файле. В общем всё тривиально, за исключением модификатора WINAPI. Существует несколько моделей вызовов функций. Для использования в Windows модель вызовов функций PASCAL. Для соответствия требованиям WIN32 API и добавлен модификатор. Дальше в exceldll.h мы описали данную функцию. Но применили опять модификатор для приведения имен функций к стандарту C. Применение этого стандарта гарантирует поддержку Ваших имен функций другими программами. Если DLL создается именно для вашего приложения, то это не важно, но если Вы собрались поделиться ей с миром, то должны обеспечить совместимость.

И последним шагом заполнили def файл, описав функцию MyTest как функцию экспорта, то есть что она будет извлекаться из DLL. Теперь собирайте проект. Полученную DLL нужно поместить в каталог Windows/System или просто Windows или WinNT, если Windows NT. При вызове функции из DLL необходимо чтобы DLL была найдена. В описанных каталогах операционная система обязательно посмотрит.

Теперь запустите Excel, создайте макрос, опишите функцию и код макроса. Пояснений я сюда писать не буду, т.к. это касается программирования VBA. А если вы этого не умеете, зачем вам этот шаг, хотя на Бейсике программировать может каждый. Запускайте макрос. Если Вы всё сделали правильно, то увидите диалоговое окно созданное функцией DLL.

Это очень хорошая возможность. Применив данную технику Вы можете расширить возможности любой программы, которая имеет макроязык и функции работы с DLL. Перечислю на взлет программы Microsoft Office, Corel Draw (Corel Script), AutoCad (VBA), ArcView (Avenue) и т.д.

Шпаргалка

Функция должна быть описана в стандарте С.

extern "C"
{
........
}

Вызов должен быть в стандарте вызовов Windows

..... WINAPI .........
{
............
}

Файл Microsoft.Office.Interop.Excel.dll считается разновидностью DLL-файла. DLL-файлы, такие как Microsoft.Office.Interop.Excel.dll, по сути являются справочником, хранящим информацию и инструкции для исполняемых файлов (EXE-файлов), например wisptis.exe. Данные файлы были созданы для того, чтобы различные программы (например, Microsoft Office Basic 2007) имели общий доступ к файлу Microsoft.Office.Interop.Excel.dll для более эффективного распределения памяти, что в свою очередь способствует повышению быстродействия компьютера.

К сожалению, то, что делает файлы DLL настолько удобными и эффективными, также делает их крайне уязвимыми к различного рода проблемам. Если что-то происходит с общим файлом DLL, то он либо пропадает, либо каким-то образом повреждается, вследствие чего может возникать сообщение об ошибке выполнения. Термин «выполнение» говорит сам за себя; имеется в виду, что данные ошибки возникают в момент, когда происходит попытка загрузки файла Microsoft.Office.Interop.Excel.dll — либо при запуске приложения Microsoft Office Basic 2007, либо, в некоторых случаях, во время его работы. К числу наиболее распространенных ошибок Microsoft.Office.Interop.Excel.dll относятся:

  • Нарушение прав доступа по адресу — Microsoft.Office.Interop.Excel.dll.
  • Не удается найти Microsoft.Office.Interop.Excel.dll.
  • Не удается найти C:WindowsassemblyGACMicrosoft.Office.Interop.Excel12.0.0.0__71e9bce111e9429cMicrosoft.Office.Interop.Excel.dll.
  • Не удается зарегистрировать Microsoft.Office.Interop.Excel.dll.
  • Не удается запустить Microsoft Office Basic 2007. Отсутствует требуемый компонент: Microsoft.Office.Interop.Excel.dll. Повторите установку Microsoft Office Basic 2007.
  • Не удалось загрузить Microsoft.Office.Interop.Excel.dll.
  • Не удалось запустить приложение, потому что не найден Microsoft.Office.Interop.Excel.dll.
  • Файл Microsoft.Office.Interop.Excel.dll отсутствует или поврежден.
  • Не удалось запустить это приложение, потому что не найден Microsoft.Office.Interop.Excel.dll. Попробуйте переустановить программу, чтобы устранить эту проблему.

Файл Microsoft.Office.Interop.Excel.dll может отсутствовать из-за случайного удаления, быть удаленным другой программой как общий файл (общий с Microsoft Office Basic 2007) или быть удаленным в результате заражения вредоносным программным обеспечением. Кроме того, повреждение файла Microsoft.Office.Interop.Excel.dll может быть вызвано отключением питания при загрузке Microsoft Office Basic 2007, сбоем системы при загрузке Microsoft.Office.Interop.Excel.dll, наличием плохих секторов на запоминающем устройстве (обычно это основной жесткий диск) или, как нередко бывает, заражением вредоносным программным обеспечением. Таким образом, крайне важно, чтобы антивирус постоянно поддерживался в актуальном состоянии и регулярно проводил сканирование системы.

Like this post? Please share to your friends:
  • Dll for excel 2010
  • Dll for excel 2003
  • Dll file not found excel
  • Dll excel visual studio
  • Djvu чем открыть word