Полагаю, вы имеете в виду, не используя On Error Resume Next, что не нравится большинству программистов, а также означает, что во время отладки вы не можете использовать «Break On All Errors», чтобы заставить код остановиться до смерти (Инструменты-> Параметры-> Общие-> Error Trapping-> Break on All Errors).
Для меня одно решение - похоронить любое On Resume Resume Next в скомпилированную DLL, в прежние времена это был VB6.Сегодня вы можете использовать VB.NET, но я предпочитаю использовать C #.
Если Visual Studio доступна для вас, то вот некоторый источник.Он вернет словарь, Dicitionary.Count вернет количество измерений.Элементы также будут содержать LBound и UBound в виде объединенной строки.Я всегда запрашиваю массив не только для его измерений, но также для LBound и UBound этих измерений, поэтому я собираю их вместе и возвращаю весь набор информации в словаре сценариев
Вот источник C #, начнитеБиблиотека классов, называющая ее BuryVBAErrorsCS, установите ComVisible (true), добавьте ссылку на библиотеку COM «Microsoft Scripting Runtime», зарегистрируйтесь для взаимодействия.
using Microsoft.VisualBasic;
using System;
using System.Runtime.InteropServices;
namespace BuryVBAErrorsCS
{
// Requires adding a reference to COM library Microsoft Scripting Runtime
// In AssemblyInfo.cs set ComVisible(true);
// In Build tab check 'Register for Interop'
public interface IDimensionsAndBounds
{
Scripting.Dictionary DimsAndBounds(Object v);
}
[ClassInterface(ClassInterfaceType.None)]
[ComDefaultInterface(typeof(IDimensionsAndBounds))]
public class CDimensionsAndBounds : IDimensionsAndBounds
{
public Scripting.Dictionary DimsAndBounds(Object v)
{
Scripting.Dictionary dicDimsAndBounds;
dicDimsAndBounds = new Scripting.Dictionary();
try
{
for (Int32 lDimensionLoop = 1; lDimensionLoop < 30; lDimensionLoop++)
{
long vLBound = Information.LBound((Array)v, lDimensionLoop);
long vUBound = Information.UBound((Array)v, lDimensionLoop);
string concat = (string)vLBound.ToString() + " " + (string)vUBound.ToString();
dicDimsAndBounds.Add(lDimensionLoop, concat);
}
}
catch (Exception)
{
}
return dicDimsAndBounds;
}
}
}
Для кода клиента VBA для Excel здесь приведен некоторый источник
Sub TestCDimensionsAndBounds()
'* requires Tools->References->BuryVBAErrorsCS.tlb
Dim rng As Excel.Range
Set rng = ThisWorkbook.Worksheets.Item(1).Range("B4:c7")
Dim v As Variant
v = rng.Value2
Dim o As BuryVBAErrorsCS.CDimensionsAndBounds
Set o = New BuryVBAErrorsCS.CDimensionsAndBounds
Dim dic As Scripting.Dictionary
Set dic = o.DimsAndBounds(v)
Debug.Assert dic.Items()(0) = "1 4"
Debug.Assert dic.Items()(1) = "1 2"
Dim s(1 To 2, 2 To 3, 3 To 4, 4 To 5, 5 To 6)
Set dic = o.DimsAndBounds(s)
Debug.Assert dic.Items()(0) = "1 2"
Debug.Assert dic.Items()(1) = "2 3"
Debug.Assert dic.Items()(2) = "3 4"
Debug.Assert dic.Items()(3) = "4 5"
Debug.Assert dic.Items()(4) = "5 6"
Stop
End Sub
NOTE WELL : Этот ответ обрабатывает варианты сетки, извлеченные из таблицы с Range.Value, а также массивы, созданные в коде с использованием Dim s (1) и т. Д.!Некоторые из других ответов не делают этого.