Страницы: 1
RSS
Как задать массив с помощью выделения в конкретном случае, Не получается взять данные со страницы через Selection
 
Не первый день бьюсь над типовой задачей. Есть доли разных товарных позиций за несколько месяцев, в сумме они дают, естественно, 100%. Если округлять все проценты (например, до десятых процента, но неважно), в сумме нередко выходит не 100% - где 98%, где 101%. Если рисовать круговую диаграмму, Excel в таких случаях поступает просто: если в сумме выходит 101%, система в сегменте с наименьшей (отрицательной) ошибкой округления скидывает процент. Итд, пока не станет 100%.
Нужно то же самое сделать для массива - по отдельным столбцам. Для одного столбца сделал рабочее решение, для таблицы - не получается. VBA не дает определять размер массива через параметры Имя_Массива.Rows.Count и Имя_Массива.Columns.Count
Оно, конечно, и сейчас работает. Но очень хочется задавать массив через Set Имя_Массива = Selection.
Помогите, пожалуйста!
 
Цитата
RomanDor написал:
VBA не дает ...           Имя_Массива.Rows.Count и Имя_Массива.Columns.Count
Попробуйте     UBound(Имя_Массива,1) и UBound(Имя_Массива,2).
Авось даст :)
 
Цитата
RomanDor написал: Set Имя_Массива = Selection
Это не массив, а объект типа, будем считать, "Range".
Ubound работает с массивами.
 
Цитата
МатросНаЗебре написал: Попробуйте     UBound(Имя_Массива,1) и UBound(Имя_Массива,2).
Пробовал - не дает  :(
Я кучу всего перепробовал. В итоге написал рабочий вариант. Но он получился кривой - а потому не радует  8)
Цитата
МатросНаЗебре написал: Ubound работает с массивами.
А что там надо допилить, чтобы все заработало с выделением? Понятно, что массив для меня - не самоцель. Просто нужно сделать так, чтобы в выделении значения округлялись с заданной точностью и в сумме по столбцам давали 100%.
 
Привет форумчане  :)
Давненько я здесь не был  :(

Не совсем понял суть просьбы, но все же смогу на простом примере показать как выполнить задачу
Цитата
RomanDor написал:
Просто нужно сделать так, чтобы в выделении значения округлялись с заданной точностью
Алгоритм округления и контроля 100% допишите самостоятельно. я выложу пример работы с Range и массивом.
Код
Sub Primer()
Dim arr(), rng As Range, Vl As Object
Dim iRound As Integer, i As Long, n As Long
Dim iTemp

With ThisWorkbook
    iRound = Application.InputBox("Введите количество значений после запятой:", , , , , , , 1)
    If iRound = 0 Then
      iTemp = MsgBox(prompt:="Количество значений после запятой равно 0." & Chr(13) & "Продолжить выполнение ?", Buttons:=324)
      If iTemp = 7 Then Exit Sub
    End If

    On Error Resume Next
    Set rng = Application.InputBox("Укажите диапазон с которым необходимо работать." _
            & Chr(13) & "Обязательный параметр.", "Выбор диапазона (можно мышкой)", , , , , , 8)
    ''' Выход при нажатии кнопки отмена
    If rng Is Nothing Then
        MsgBox "Отменено пользователем." _
        & Chr(13) & "Завершение работы.", vbInformation, "Стоп !": Exit Sub
    End If
    On Error GoTo 0
    
    
    ''' 1 пример работы с Range (вычисления проводятся по каждой ячейке в цикле _
                                с возвратом значения в ячейку)
    '''' способ выполнения более медленный чем массивы но имеет ряд преимуществ
    'For Each Vl In rng
    '  If IsNumeric(Vl) Then                                 ''' проверка числового значения
    '      iTemp = Vl.Value: Vl.Value = Round(iTemp, iRound) ''' выполняем округление до заданного знака
    '  End If
    'Next
      
      
    ''' 2 пример работы с массивом (вычисления проводятся в цикле со всеми значениями _
                                   с возвратом всех значений сразу в диапазон выделенных ячеек)
    '''  вычисления в десятки раз быстрей чем рендж особенно при больших обьемах данных
    arr = rng.Value2
    For i = 1 To UBound(arr, 1)
      For n = 1 To UBound(arr, 2)
        iTemp = arr(i, n): arr(i, n) = Round(iTemp, iRound) ''' выполняем округление до заданного знака
      Next n
    Next i
    ''' выгружаем ответ из массива в выделенный диаппазон
    rng.Cells(1, 1).Resize(UBound(arr, 1), UBound(arr, 2)) = arr
  
End With
End Sub
Удачи. :D
 
не знаю что вы делаете, вот так ве работает:
Код
Set x = Selection
MsgBox x.Rows.Count & " " & x.Columns.Count
Живи и дай жить..
 
Цитата
TSN написал: я выложу пример работы с Range и массивом
Спасибо! Сейчас попробую.
Цитата
Слэн написал: не знаю что вы делаете, вот так ве работает:
Почему-то в этом конкретном примере не работало, когда я пытался передать эти параметры как верхнюю границу для циклов, VBA меня в этом конкретном случае посылал лесом. Не помню точную формулировку, могу поднять и запустить свой старый файл.
 
Цитата
TSN написал:
смогу на простом примере показать как выполнить задачу
Спасибо огромное, все получилось!
Я и в самом деле плаваю в VBA, путаю массивы и наборы ячеек. Я, в общем, не кодирую - просто есть несколько повторяющихся типовых задач, которые мне нужно делать множество раз на дню. Две из них автоматизировал через VBA сходу, на одной застрял. Вы помогли. Еще раз - спасибо!
Страницы: 1
Наверх