2015-07-15 3 views
0

Я написал модуль Excel для преобразования координат широты/долготы в UTM. Основная процедура - это sub, которая определяет аргументы и вызывает функцию, которая в свою очередь вызывает функцию DLL. Идея заключается в том, что функция открывает окно аргументов функции для пользователя, чтобы предоставить данные (функция определена в другом подклассе Application.MacroOptions).Excel VBA: Может ли подзаголовок UDF с непризнанными аргументами?

Sub GeoToTM() 

'Declare variables 
Dim TM() As Variant 
Dim Lat As Double 
Dim Lon As Double 
Dim TMProj As Integer 
Dim Ellipsoid As Integer 

'Call Excel function 

TM = GeoConv(Lat, Lon, TMProj, Ellipsoid) 

End Sub 

'VBA function wrapper 
Function GeoConv(Lat, Lon, TMProj, Ellipsoid) As Variant 

Dim East As Double 
Dim North As Double 
Dim locTM(1 To 2) As Variant 

'Call C++ function 
GeodeticToTM Lat, Lon, TMProj, Ellipsoid, East, North 

locTM(1) = East: locTM(2) = North 
GeoConv = locTM 

End Function 

Функция на своих собственных преформ, как рекламируется, но когда я запускаю весь модуль функции осуществляется доступ, но окно аргумент функции не появляется; аргументы никогда не заполняются, поэтому функция возвращает нули.

Как я могу заставить это работать? Здесь аргумент «Опция»?

Спасибо,

Chris

+0

Если я понимаю, что вы просите о, [вы не можете] (http://stackoverflow.com/q/5282128/11683). – GSerg

ответ

0

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

Sub GeoToTM() 

    'Declare variables 
    Dim s As String 
    Dim TM() As Variant 
    Dim Lat As Double 
    Dim Lon As Double 
    Dim TMProj As Integer 
    Dim Ellipsoid As Integer 

    'Call Excel function 

    'with Lat and Lon as values then 
    TM = GeoConv(TMProj, Ellipsoid, Lat, Lon) 

    'with Lat and Lon unassigned 
    TM = GeoConv(TMProj, Ellipsoid) 

End Sub 

'VBA function wrapper 
Function GeoConv(TMProj As Integer, Ellipsoid As Integer, _ 
      Optional Lat As Double = -1, Optional Lon As Double = -1) As Variant 

    Dim East As Double 
    Dim North As Double 
    Dim locTM(1 To 2) As Variant 

    If Lat < 0 Then _ 
     Lat = CDbl(InputBox("Latitude: ", "Supply Latitude", "0.000")) 
    If Lon < 0 Then _ 
     Lon = CDbl(InputBox("Latitude: ", "Supply Longtitude", "0.000")) 

    'Call C++ function 
    GeodeticToTM Lat, Lon, TMProj, Ellipsoid, East, North 

    locTM(1) = East: locTM(2) = North 
    GeoConv = locTM 

End Function 
+0

Хм, должно быть что-то еще не так с вызовом функции и/или аргументом. Даже если поставить «Необязательно» по всем параметрам со значениями (для ВСЕХ аргументов, а не только для Lat и Lon), я все равно получаю нули в качестве возвращаемой функции. Я уверен, что окно аргумента функции появляется с прямым вызовом функции, но не с вызовом из sub является ключом ... –

0

Ну, вот как я получил его на работу:

Перегруппировки кода, я ...

  • объявил "входной" переменные в главных подразделах,
  • выбранных диапазон ячеек,
  • положил формулу Excel в диапазоне с помощью Selection.FormulaArray,
  • назвал уже заполненную забаву ction wizard с Application.Dialogs (xlDialogFunctionWizard) .Показать,
  • , который затем называется функцией Excel.

Таким образом, .Show позволяет пользователю заполнять аргументы, которые затем передаются функции Excel/DLL.

Sub GeoToTM() 

'Declare variables 
Dim TM() As Double 
Dim Lat As Double 
Dim Lon As Double 
Dim TMProj As Integer 
Dim Ellipsoid As Integer 

Dim resultRng As Range 
Dim Arg As Boolean 

'Initialize Cells 
ActiveCell.Offset(-1, 0).Value = "Easting" 
ActiveCell.Offset(-1, 1).Value = "Northing" 

'Call Excel function 
Set resultRng = Range(ActiveCell, ActiveCell.Offset(0, 1)) 
resultRng.Select 
Selection.FormulaArray = "= GeoConv()" 
Arg = Application.Dialogs(xlDialogFunctionWizard).Show 
If Arg = False Then Exit Sub 

TM = GeoConv(Lat, Lon, TMProj, Ellipsoid) 

End Sub 

Мне на самом деле пришлось удалить «Вариант» из аргументов функции, чтобы это сработало, но это было сделано!

Chris

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