Страницы: 1
RSS
Возможно ли определить размерность массива в VBA?
 
Здравствуйте всем.  
Что-то заинтересовал меня такой вопрос:  
массив Arr(4,6,3,9, .. и так n значений)  
Возможно ли определить это самое n?    
То, что n не более 60 я знаю.  
Чисто ради любопытства.
 
Так надо было?  
 
Sub test()  
   a = Array(4, 6, 3, 9, 8)  
   n = UBound(a) - LBound(a) + 1  
   MsgBox n  
End Sub
 
{quote}{login=Михаил С.}{date=11.05.2011 09:54}{thema=Возможно ли определить размерность массива в VBA?}{post}Здравствуйте всем.  
Что-то заинтересовал меня такой вопрос:  
массив Arr(4,6,3,9, .. и так n значений)  
Возможно ли определить это самое n?    
То, что n не более 60 я знаю.  
Чисто ради любопытства.{/post}{/quote}  
 
Sub test()  
Dim Arr(4, 6, 3, 9)  
For i = 1 To 60  
on error resume next  
tmp= UBound(Arr, i)  
if err.number<>0 then exit for :msgbox i  
Next  
End Sub
Спасибо
 
Нет, это мы определим "длину" каждой размерности. А я хотел узнать, сколько всего этих размерностей.    
зы. неясно наверно выражаюсь, после праздников...  
Arr(1 to 5, 4 to 7, 2 to 9, 5 to 7)  
Как узнать, что массив четырехмерный.
 
Пока сочинял для EducatedFool, появилось решение от R Dmitry.  
Спасибо, в принципе так устроит.
 
Sub test()  
Dim Arr(4, 6, 3, 9)  
For i = 1 To 60  
On Error Resume Next  
tmp = UBound(Arr, i)  
If Err.Number > 0 Then MsgBox i - 1: Exit For:  
Next  
End Sub  
 
 
Михаил так правильней , а то дописал код в форум не проверив :)
Спасибо
 
Не, Дим, попробовал ради интереса - ничего не выдает. :(  
Ну попробую на этой основе что нибудь придумать...
 
Да, второй вариант то что надо. Спасибо!
 
{quote}{login=Михаил С.}{date=11.05.2011 10:16}{thema=}{post}Не, Дим, попробовал ради интереса - ничего не выдает. :(  
Ну попробую на этой основе что нибудь придумать...{/post}{/quote}  
 
Михаил, я исправил ошибку, у меня работает. Просто писал прямо в форум.
Спасибо
 
Правда чуть изменить пришлось  
Dim Arr(4, 6, 3, 9, 8), i, tmp  
:)
 
{quote}{login=Михаил С.}{date=11.05.2011 10:16}{thema=}{post}Не, Дим, попробовал ради интереса - ничего не выдает. :(  
Ну попробую на этой основе что нибудь придумать...{/post}{/quote}  
Ну вот, ещё одного формулиста потеряли :-)  
 
Планета становиться VB-образной :-)
 
И это логично :)  
Зачем пытаться выжать из "Запорожца" 150 км/ч, если можно пересесть на "Мерседес".
 
Не обижать "Запорожец"! :)  
Вопрос армянскому радио:  
- Может ли "Запорожец" развить скорость 200 км/ч?  
- Может. Если сбросить его с горы Арарат.
 
ЗапорожецЪ - моя любимая машина. Я себе в 1985 новый сделал, 965 модели ("горбатый").  
По проходимости, особенно если в нем пять здоровых мужиков едут - любой джип и рядом не стоял. :)
 
{quote}{login=Михаил С.}{date=12.05.2011 12:13}{thema=}{post}  
По проходимости, особенно если в нем пять здоровых мужиков едут - любой джип и рядом не стоял. :){/post}{/quote}  
Подтверждаю! :)
 
вот вам мерседец :)  
 
Declare Function VarPtrArray Lib "msvbvm60.dll" Alias "VarPtr" (Var() As Any) As Long  
Declare Sub GetMem4 Lib "msvbvm60.dll" (ByVal SrcPointer As Long, ByVal DstPointer As Long)  
 
Sub t()  
Dim ar(1, 2, 3, 4, 5, 6, 7)  
Dim p&, dm As Integer  
GetMem4 VarPtrArray(ar()), VarPtr(p)  
GetMem4 p, VarPtr(dm)  
 
msgbox "вы объявили "& p "измерений"  
End Sub
Живи и дай жить..
 
а точнее( а главное безопаснее):  
 
Option Explicit  
Option Base 0  
Declare Function VarPtrArray Lib "msvbvm60.dll" Alias "VarPtr" (Var() As Any) As Long  
Declare Sub GetMem4 Lib "msvbvm60.dll" (ByVal SrcPointer As Long, ByVal DstPointer As Long)  
 
Sub t()  
Dim ar(1, 2, 3, 4, 5, 6, 7)  
Dim p&, dm(1) As Integer  
GetMem4 VarPtrArray(ar()), VarPtr(p)  
GetMem4 p, VarPtr(dm(0))  
MsgBox "вы объявили " & dm(0) & " измерений"  
End Sub
Живи и дай жить..
 
{quote}{login=слэн}{date=12.05.2011 03:47}{thema=}{post}а точнее( а главное безопаснее):  
 
Option Explicit  
Option Base 0  
Declare Function VarPtrArray Lib "msvbvm60.dll" Alias "VarPtr" (Var() As Any) As Long  
Declare Sub GetMem4 Lib "msvbvm60.dll" (ByVal SrcPointer As Long, ByVal DstPointer As Long)  
 
Sub t()  
Dim ar(1, 2, 3, 4, 5, 6, 7)  
Dim p&, dm(1) As Integer  
GetMem4 VarPtrArray(ar()), VarPtr(p)  
GetMem4 p, VarPtr(dm(0))  
MsgBox "вы объявили " & dm(0) & " измерений"  
End Sub{/post}{/quote}  
 
А вот как определить размерность 2-мерного массива ?  
DIM Mas(1 TO 7, 1 TO 10)' ?
 
{quote}{login=}{date=09.09.2011 06:40}{thema=Re: }{post}  
А вот как определить размерность 2-мерного массива ?  
DIM Mas(1 TO 7, 1 TO 10)' ?{/post}{/quote}  
А чего тут определять-то?  
И так все понятно 2 мерный, верхний индекс 1 = 7, верхний индекс 2 = 10  
В чем вопрос-то?
 
{quote}{login=Михаил С.}{date=11.05.2011 09:54}{thema=Возможно ли определить размерность массива в VBA?}{post}Здравствуйте всем.  
Что-то заинтересовал меня такой вопрос:  
массив Arr(4,6,3,9, .. и так n значений)  
Возможно ли определить это самое n?    
То, что n не более 60 я знаю.  
Чисто ради любопытства.{/post}{/quote}  
Ответ:  
Function RazmerArray(A() As Integer) As Integer  
Dim k As Integer  
   On Error GoTo KOH  
   For k = 1 To 60  
       If UBound(A, k) > -1 Then RazmerArray = k  
   Next k  
KOH:  
End Function
 
Ни разу не пришлось заморачиваться над определением мерности массива так сказать. Вот потребовалось. Полез искать волшебное слово, которое вернет мне количество измерений. А не тут то было.  
Спасибо участникам за предложенные варианты. Но от On Error у меня глаз нервенно дергается, а стиль Мерседеса без явной необходимости применять не хочется, хоть и дружу с Api.  
Пожалуй я обойду проблемку стороной.
 
вообще-то верхняя граница может быть любой...( в том числе и отрицательной)  
я б сделал так:  
 
Function RazmerArray(A) As Long  
Dim k As Long  
On Error GoTo KOH  
k = 1  
While UBound(A, k) >= LBound(A, k)  
 k = k + 1  
Wend  
KOH:  
RazmerArray = k - 1  
End Function  
   
Sub t()  
   Dim A '(1 To 1, 1 To 1)  
   Debug.Print RazmerArray(A)  
End Sub  
 
а в мерседеце просто непосредственно берется значение размерности из соответствующей структуры - без всяких циклов..
Живи и дай жить..
 
Private Function nDx%(Arr)   'возвращает количество измерений массива Arr  
  Dim i%, X  
  On Error GoTo eXX   ' увеличиваем i пока не получим ошибку попытки получить UBound по данному измерению  
  Do: i = i + 1: X = UBound(Arr, i): Loop  
eXX:    nDx = i - 1  
End Function
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
Страницы: 1
Читают тему
Наверх