Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
1 / 1 / 0
Регистрация: 02.04.2015
Сообщений: 84
1

Скрипт захватывает 2 столбца , нужно больше

02.06.2015, 05:53. Показов 1013. Ответов 8
Метки нет (Все метки)

Здравствуйте.

Не могу понять как расширить диапазон , этот скрипт захватывает получается 2 столбца.
В 1 столбце он ищет уникальные значения ,а 2 столбец суммирует все значения с одниковыми именами в первом столбце. Мне нужно создать 3 столбец и более , аналогично второму.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Private Sub CommandButton1_Click()
 
 
 
    Range("A5:B99").ClearContents
    Dim sh As Worksheet
    Dim a(), i&
 
    With CreateObject("Scripting.Dictionary"): .comparemode = 1
 
        For Each sh In Worksheets
            If sh.Name <> "main" Then
                If sh.Name < "Итог" Then
                    a = sh.[a4].CurrentRegion.Value
                    For i = 2 To UBound(a)
                        .Item(a(i, 1)) = .Item(a(i, 1)) + a(i, 2)
                                                                    
                                            Next
                    End If
                End If
            
        Next
      
              If Worksheets.Count < 5 Then MsgBox ("Нету чё щитать") Else Sheets("Итог").[a5].Resize(.Count, 3) = Application.Transpose(Array(.keys, .items))
            
    End With
 
    
    End Sub
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Вложения
Тип файла: xls пример.xls (92.5 Кб, 1 просмотров)
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.06.2015, 05:53
Ответы с готовыми решениями:

Сформировать B, элементы которого Bj равны 1, если хотя бы один элемент j-го столбца матрицы A больше суммы элементов этого столбца...
Помогите написать задачу. &quot;Сформировать одномерный массив B, элементы которого Bj равны 1, если...

Скрипт.Нужно из файла csv в AD. и автоматом этот скрипт добавляет 50 пользователей из execl
Import-Module ActiveDirectory $Users = Import-CSV -Delimiter &quot;;&quot; -Path &quot;C:\test\lol.csv&quot; $allou =...

Нужно ввести текст, если он больше 80 символов нужно чтоб он переходил на новую строку
Написал клиент сервер, с командами add-запись в файл, remove-удаление из файла ,display-вывод на...

Нужно вывести max элемент из первого столбца матрицы и соответствующий ему элемент из второго столбца
Максимальный элемент я нашел. Но вот как вывести соответствующий ему элемент из второго столбца...

8
Ушел с CyberForum совсем!
872 / 181 / 25
Регистрация: 04.05.2011
Сообщений: 1,020
Записей в блоге: 110
02.06.2015, 06:10 2
Range("A5:B99").ClearContents
дык 2 столюца
столбца и есть
0
1 / 1 / 0
Регистрация: 02.04.2015
Сообщений: 84
02.06.2015, 06:31  [ТС] 3
Surrogate, чёт я тебя не понял) вроде перечитываю свою сообщение , вроде все нормально объяснил) мне нужно больше 2 столбцов
0
Эксперт NIX
1873 / 613 / 147
Регистрация: 14.01.2013
Сообщений: 2,838
02.06.2015, 07:20 4
A5:B99 - A и B это два соседних столбца. Если надо три, то соответственно A5:C99. Не так уж и сложно это понять.

Добавлено через 6 минут
А вот здесь:

Visual Basic
1
.Item(a(i, 1)) = .Item(a(i, 1)) + a(i, 2)
идёт ссылка на столбцы. 1 и 2 соответственно. i - строка. Что требуется вписать в третий столбец? Или второй?

Добавлено через 39 минут
Пример скачал и понял, в чём проблема. Не пользовался словарями, но, судя по описанию формата, в словарях используется принцип "Ключ, значение". Т.е. у одного элемента одно значение. Здесь надо либо пару словарей, либо динамический массив. Если код записать так:

Кликните здесь для просмотра всего текста
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Private Sub CommandButton1_Click()
    
Range("A5:B99").ClearContents
Dim sh As Worksheet, a(), i&, dic
 
  Set dic = CreateObject("Scripting.Dictionary")
  With dic
    .comparemode = 1
    For Each sh In Worksheets
      If sh.Name <> "main" Then
        If sh.Name < "Итог" Then
          a = sh.[a4].CurrentRegion.Value
          For i = 2 To UBound(a)
            .Item(a(i, 1)) = .Item(a(i, 1)) + a(i, 2)
          Next
        End If
      End If
    Next
    If Worksheets.Count < 5 Then MsgBox ("Нету чё щитать") Else Sheets("Итог").[a5].Resize(.Count, 3) = Application.Transpose(Array(.keys, .items))
  End With
End Sub


Поставить бряк внутрь цикла и в окне "Watch" добавить dic.Item(a(i, 1)), то можно увидеть проблему воочию.
0
1 / 1 / 0
Регистрация: 02.04.2015
Сообщений: 84
02.06.2015, 07:23  [ТС] 5
A5:B99 - A и B это два соседних столбца. Если надо три, то соответственно A5:C99. Не так уж и сложно это понять.
Да нет уж сложно , особенно когда сам эту строку писал и которая в принципе роли никакой не играет. А просто проводит чистку

идёт ссылка на столбцы. 1 и 2 соответственно. i - строка. Что требуется вписать в третий столбец? Или второй?
Я пробывал , если не верите))) Если вам не составит труда , не могли вы мне показать как вписать правильно 3 столбец , у меня не выходит.
0
Эксперт NIX
1873 / 613 / 147
Регистрация: 14.01.2013
Сообщений: 2,838
02.06.2015, 07:29 6
Цитата Сообщение от avenger24 Посмотреть сообщение
Да нет уж сложно , особенно когда сам эту строку писал и которая в принципе роли никакой не играет. А просто проводит чистку
Да, извиняюсь, ориентировался на ответ предыдущего пользователя и не вник в проблему полностью.

Добавлено через 4 минуты
Цитата Сообщение от Kubuntovod Посмотреть сообщение
Поставить бряк внутрь цикла и в окне "Watch" добавить dic.Item(a(i, 1)), то можно увидеть проблему воочию.
Ещё a(i, 1) туда же, чтоб уж полностью видеть процесс заполнения словаря.
0
Эксперт NIX
1873 / 613 / 147
Регистрация: 14.01.2013
Сообщений: 2,838
02.06.2015, 07:39 7
Лучший ответ Сообщение было отмечено avenger24 как решение

Решение

Без вылизывания кода, только для демонстрации сути вопроса, вот:пример.xls

Обратите внимание, что если во втором листе нет графы "Цена", то будет вылет за пределы диапазона массива "a".
1
1 / 1 / 0
Регистрация: 02.04.2015
Сообщений: 84
02.06.2015, 07:49  [ТС] 8
Kubuntovod, Спасибо за пример. Будем пробовать на примере.
0
6848 / 2786 / 525
Регистрация: 19.10.2012
Сообщений: 8,494
02.06.2015, 08:28 9
Нужно сразу показывать пример в реальной конфигурации - потому что если бы сразу было ясно, что суммировать нужно более одного столбца - то и код был бы на половину другой.
Ну а теперь уже переделывать нет смысла и лениво - на два столбца можно обойтись двумя словарями. Ну а если суммироварь нужно 50 столбцов? Можно конечно 50 словарей ворочать... но оптимальнее один словарь, в item которого в данном случае поместить массив, в котором и суммировать.
Ну а если сразу известен максимально возможный размер результата - то удобнее в словаре хранить индексы связанного массива (созданного под максимум), в котором и собирать суммы. И такие примеры я тут на форуме писал.
Кстати в роли этого массива может выступать и сам исходный массив, когда он один и большой, а не как тут куча мелких.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.06.2015, 08:28

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

Скрипт на удаление файлов больше 100 мб с условием
Здравствуйте задание следующие: Если размер домашнего каталога больше 10 Гб, то удалить в нем все...

Из матрицы порядка n получить новую, где на 2 столбца больше:
Из матрицы порядка n получить новую, где на 2 столбца больше: 1 — максимум соответствующих строк;...

Перемножить два столбца и вывести результат больше 100
разбираюсь с запросами MySQL и возник вопрос: у нас есть таблица с двумя полями кол-во и цена и их...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.