2013-09-22 2 views
0

Я использую вариантный тип данных в своем маленьком приложении VBA, чтобы использовать как строковые, так и целочисленные данные под той же функцией. Тем не менее, только мои вычисления Integer, похоже, работают, а связанные с строкой части просто дают #value! ошибка.Варианты зависимостей типов данных

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

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

Я делюсь своим приложением здесь для справки, поскольку я не могу скопировать кусок кода из-за большого количества зависимостей. (Лист: Прогноз) VBA_App

+0

Вам не нужно делать ничего особенного (то же самое, что при определении их как целого или строкового).Логически, вы не можете рассматривать вариант с содержимым String как Integer и наоборот; это скорее всего то, что провоцирует вашу ошибку. Вся таблица как справочная информация, безусловно, полезна, но она довольно большая; можете ли вы уточнить точные переменные/условия, в которых вы получаете ошибки? – varocarbas

+0

@varocarbas Проблема с переменной «fcOption» в разделе «Прогноз/модуль прогноза». – Shan

+0

Непонятно, что делает эта функция и почему ее вычисления должны быть неправильными. Если вы выполняете связанные с номером действия только с номерами и строковыми с помощью строк, у вас не должно быть никаких проблем; но из этого кода не ясно, какие входы получает fcOption в каждом сценарии. Если вам нужна дополнительная (и точная) помощь, вам нужно будет указать конкретные условия (например, когда я вызываю эту функцию с помощью bettype = "" и fcOption = "", я получаю "", и я хотел бы получить ""). – varocarbas

ответ

2

Если я правильно понял, вы передаете числовое значение для работы в двух форматах - целое и строковое. Конечно, вы можете использовать вариант и перед использованием этого значения, проверить его:

IsNumeric(yourVariant) gives you True or False: 
IsNumeric("222") - True 
IsNumeric(222) - True 
IsNumeric("222abc") - False 

После этого убедитесь, что вы можете преобразовать ваш вариант Integer (http://msdn.microsoft.com/en-us/library/s2dy91zy.aspx): CInt (yourVariant)

if IsNumeric(yourVariant) then 
    someIntVariable = CInt(yourVariant) 
else 
    MsgBox "bla bla bla" 
EndIf 

Я посмотрел какой-то ваш код, вы можете использовать Select Case Statement (http://msdn.microsoft.com/en-us/library/cy37t14y.aspx) или сохранить If-Else-If. Обсуждение в комментариях поможет вам выбрать.

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


Например я пытаюсь проанализировать шаг за шагом кода выполняется функция fcComm из ячейки E68, листа прогноза. достижения функции setFcResult мы имеем следующий:

Function setFcResult(bettype As String, fcOption) 
' bettype = "FT.OU" 
' fcOption = "HF.HL" 
setFcResult = True 

bettype = UCase(bettype) 
fcOption = UCase(fcOption) 

If bettype = "FT.OU" Then 
    If fcOption >= 0 Then ' you compare "HF.HL" with 0. It returns true. You can verify this by yourself. 
     hfs = 5 
     afs = fcOption - 5 ' here you perform "HF.HL" - 5. It returns error and function terminates. 
    Else 
     setFcResult = False 
    End If 
ElseIf bettype = "HT.OU" Then 
... 

Таблица Odds выглядит следующим образом:

enter image description here

Bet Тип поиска:

bettype = Application.WorksheetFunction.VLookup(oddsId, odds.DataBodyRange, 3, False) 
  • oddsId - 13
  • odds.DataBodyRange $ A $ 3: $ BT $ 47
  • bettype = 13

Вы поиск по oddsId, VLookup поиски oddsId в первом столбце odds.DataBodyRange - это колонка А, но в колонке А вы имеют TransId.

enter image description here

Так у вас есть неправильный bettype для переменной fcOption.

+0

Почему именно (бесконечный) вариант выбора лучше, чем (бесконечный) набор условий? Имейте в виду, что в SO (и, в идеале, в жизни тоже), когда вы претендуете на что-то, вы должны дать какую-то причину, поддерживающую его («это лучше» не звучит как веская причина, в основном, когда некоторые люди, подумайте, что это не так). – varocarbas

+1

http://www.blackwasp.co.uk/SpeedTestIfElseSwitch.aspx – stepler

+1

1. выберите случай быстрее. 2. Выберите случай, чтобы понять, что происходит в случае больших цепей. – stepler

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