Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 19.06.2013
Сообщений: 110

Конвертация диапазона в одиночные адреса

26.11.2015, 16:42. Показов 871. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите пожалуйста разобратся со следующей задачей. Например есть формула с диапозон "=SUM(A1:A5)" необходимо её конвертировать в "=SUM(A1,A2,A3,A4,A5)" . Итоговая задача заключается в том, чтобы находить все диапозоны в формуле и менять их на список последовательных адрессов. Заранее спасибо
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.11.2015, 16:42
Ответы с готовыми решениями:

Конвертация IP-адреса
Допустим есть IP 192.168.2.1.его нужно его записать в виде 1680201 так же IP может быть вида 192.1.233.2, будет выглядеть 0123302 ...

Конвертация IP диапазона в список адресов
Собственно задача в заголовке. Суть: есть IP диапазон (1.2.3.4-5.6.7.8 или CIDR (192.168.1.0/8)). Надо получить список (List<string>...

Формирование формулой - адреса диапазона
Добрый вечер. Появилась непростая задача насчет формулы. Есть табличка на листе C3:M17 Она разбита на шесть квалратов. В каждом...

9
15155 / 6428 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
26.11.2015, 17:52
pluprod, а зачем это нужно? Есть риск превысить допустимую длину формулы. А если аргументом окажется целый столбец или строка =SUM(A:A) ?
0
0 / 0 / 0
Регистрация: 19.06.2013
Сообщений: 110
26.11.2015, 19:05  [ТС]
Казанский, такого риска нет, все формулы небольшой длины, я знаю какие данные я буду обрабатывать. только забыл добавить, нужно чтоб обязательно подхватывало сылке на другие листы
Например: =SUM(Sheet1!A1:A5) => =SUM(Sheet1!A1,Sheet1!A2,Sheet1!A3,Sheet 1!A4,Sheet1!A5)
0
 Аватар для pashulka
4139 / 2243 / 940
Регистрация: 01.12.2010
Сообщений: 4,624
26.11.2015, 20:04
Если :
  1. в исходной формуле нет "мусора", типа =СУММ(Sheet1!A1:A5;100)
  2. нет ссылок на разные листы, типа =СУММ(A1:A5;Sheet3!A1:A5)
  3. нет ссылок на ячейки закрытых(в момент выполнения макроса) рабочих книг
  4. количество суммируемых ячеек не больше 30 (Excel 2003 и младше) или 255 (Excel 2007 и старше)
  5. рабочий лист, где мы ищем и меняем формулы, не защищён

то можно протестировать следующий вариант (где предполагается, что все полученные ссылки, должны быть относительными, т.е. A1)

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Private Sub Test3()
    Dim iAddress1$, iAddress2$, iExternal As Boolean
    Dim iCell1 As Range, iCell2 As Range
 
    With ActiveSheet.UsedRange
         Set iCell1 = .Find("=SUM(*:*)", , xlFormulas, xlWhole)
         Do Until iCell1 Is Nothing
            iAddress1 = iCell1.Formula
            iAddress1 = Mid(iAddress1, 6, Len(iAddress1) - 6)
            iExternal = iAddress1 Like "*!*"
            For Each iCell2 In Application.Range(iAddress1)
                iAddress2 = iAddress2 & "," & iCell2.Address(False, False, , iExternal)
            Next
            iCell1.Formula = "=SUM(" & Mid(iAddress2, 2) & ")"
            Set iCell1 = .FindNext(iCell1): iAddress2 = ""
         Loop
    End With
End Sub
1
0 / 0 / 0
Регистрация: 19.06.2013
Сообщений: 110
27.11.2015, 15:09  [ТС]
pashulka, спасибо за труд) но у меня случай, когда в формулы могут быть ссылки на разные листа.
0
 Аватар для pashulka
4139 / 2243 / 940
Регистрация: 01.12.2010
Сообщений: 4,624
27.11.2015, 15:46
Если "проблема" только во втором пункте, то это решаемо. Только лучше, предварительно выложить свой файл (можно без данных, только формулы), а то может у Вас там есть и другие траблы.
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
27.11.2015, 16:28
Можно опереться на это:
Visual Basic
1
2
3
4
5
6
Sub tt()
Dim c As Range
For Each c In [a1].Precedents
Debug.Print c.Parent.Name & "!" & c.Address
Next
End Sub
0
 Аватар для pashulka
4139 / 2243 / 940
Регистрация: 01.12.2010
Сообщений: 4,624
27.11.2015, 16:46
Hugo121, Не всё так просто

Цитата Сообщение от pluprod Посмотреть сообщение
только забыл добавить, нужно чтоб обязательно подхватывало сылке на другие листы
Например: =SUM(Sheet1!A1:A5)
0
6082 / 1327 / 195
Регистрация: 12.12.2012
Сообщений: 1,023
27.11.2015, 17:31
Здравствуйте, pluprod,
Предложу такой вариант:

Кликните здесь для просмотра всего текста
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
Sub ConvertFormulaRangesToCells(ByVal cell As Range, ByVal sheetList As String)
    Dim i As Long, j As Long, n As Long, matches As Object, extern As Boolean
    Dim delims() As String, parts() As String, addresses() As String
    Dim ·range· As Range, ·cell· As Range, ·formula· As String
    If IsEmpty(cell) Then Exit Sub
    ·formula· = cell.FormulaR1C1
    With CreateObject("VBScript.RegExp")
        .Global = True
        .Pattern = "(" & sheetList & ")?" & Replace("~:~", "~", Replace("R~C~", "~", "(?:\d+|\[-?\d+\])?"))
        If .Test(·formula·) Then
            Set matches = .Execute(·formula·)
            delims = Split(.Replace(·formula·, "@#$"), "@#$")
            n = matches.Count
            ReDim parts(2 * n) As String
            parts(2 * n) = delims(n)
            For i = 0 To n - 1
                parts(2 * i) = delims(i)
                Set ·range· = Range(Application.ConvertFormula(matches(i), xlR1C1, Application.ReferenceStyle, , cell))
                j = 0
                extern = ·range·.Parent.Name <> cell.Parent.Name
                ReDim addresses(1 To ·range·.Count) As String
                For Each ·cell· In ·range·
                    j = j + 1
                    addresses(j) = ·cell·.Address(False, False, xlR1C1, extern, cell)
                Next ·cell·
                parts(2 * i + 1) = Join(addresses, ",")
            Next i
            cell.FormulaR1C1 = Join(parts, "")
        End If
    End With
End Sub
 
Sub DoConversion()
    Dim i As Long, n As Long, sheetNames() As String, sheetList As String, cell As Range
    n = Sheets.Count
    ReDim sheetNames(1 To n) As String
    For i = 1 To n
        sheetNames(i) = Sheets(i).Name & "!"
    Next i
    sheetList = Join(sheetNames, "|")
    For Each cell In Application.InputBox("Выберите диапазон, формулы которого надо изменить", Title:="Изменение формул", Type:=8)
        ConvertFormulaRangesToCells cell, sheetList
    Next
End Sub

Преимущества по сравнению с более ранней редакцией (от pashulka):
  1. Допускается использование в формулах аргументов, не являющихся диапазонами, например: =СУММ(Sheet1!A1:A5;100)
  2. Допускаются ссылки на различные листы, в том числе в рамках одной формулы или функции.
  3. Можно использовать любое количество функций в рамках одной формулы. Сами функции могут быть различными (например, не только СУММ (SUM), но и ПРОИЗВЕД (PRODUCT), и другие...)
  4. Предлагается выбрать диапазон, в котором будут изменены формулы. Это ускоряет процесс замены и предотвращает изменение формул, которые менять не нужно.
С уважением,
Аксима
1
 Аватар для pashulka
4139 / 2243 / 940
Регистрация: 01.12.2010
Сообщений: 4,624
27.11.2015, 18:14
"Мусор", являющийся отдельным аргументом и ссылки на разные листы, учесть легко

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
30
31
32
33
Private Sub Test2()
    Dim iFormula$, iCell As Range
    
    With ActiveWorkbook.ActiveSheet.UsedRange
         Set iCell = .Find("=SUM(*:*)", , xlFormulas, xlWhole)
         Do Until iCell Is Nothing
            iFormula = iCell.Formula
            iFormula = Mid(iFormula, 6, Len(iFormula) - 6)
            iCell.Formula = newFormula(iFormula)
            Set iCell = .FindNext(iCell) '.FindNext
         Loop
    End With
End Sub
 
Private Function newFormula$(oldFormula$)
    Dim iCell As Range, iAddress$
    Dim iRefExt As Boolean, iArg As Variant
    
    For Each iArg In Split(oldFormula, ",")
        If TypeOf Evaluate(iArg) Is Range Then
           iRefExt = iArg Like "*!*"
           For Each iCell In Application.Range(iArg) 'Evaluate(iArg)
               iAddress = iAddress & "," & iCell.Address(False, False, , iRefExt)
           Next
           iAddress = Mid(iAddress, 2)
           newFormula = newFormula & "," & iAddress: iAddress = ""
        Else
           newFormula = newFormula & "," & iArg
        End If
    Next
    
    newFormula = "=SUM(" & Mid(newFormula, 2) & ")"
End Function
А вот с извращением, типа формулы массива {=СУММ(-A1:A3)} или более привычной =-СУММ(A1:A3) конкретно эти изменения, разумеется, не прокатят.

Аксима, взял формулу =СУММ(ДВССЫЛ("A1:A3")) и пункт 3 исчез
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.11.2015, 18:14
Помогаю со студенческими работами здесь

Последовательный выбор адреса ячейки из диапазона
Здравствуйте. Вот такой вопрос у меня. По листу в хаотическом порядке ползают цифры - если щелкать по кнопке. В столбце AF -...

Определение адреса ячейки для задания диапазона
Здравствуйте ! Есть Таблица Excel, состоящая из трех столбцов с данными. Количество строк таблицы варьируется. Требуется создать...

Одиночные RPG
Привет всем. Решила в свободное от работы время вспомнить молодость:hihi: Посоветуйте какие-нибудь одиночные РПГ. В WoW играла, но что-то...

одиночные операции
Здравствуйте. Операции записанные в обработчике событий FormKeyDown будут выполняться столько раз, сколько времени держится клавиша....

Одиночные и двойные кавычки
В Питоне строки в одинаковых кавычках - то же самое? Есть ли отличия в &quot;hello&quot; и 'hello'?


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru