Доброго времени суток! Такая проблема: при новой сортировке по возрастанию формулы, которые ссылались на эту ячейку, не меняют динамический адрес. Чтобы быть точнее, прикрепляю файл с примером: там стоит задача сделать новую сортировку по возрастанию по столбцу В (выделен желтым), так чтобы формулы в столбце I "Остатки итоговые" ссылались на те ячейки, к которым были прикреплены изначально. Буду очень рада помощи.
Доброго времени суток! Такая проблема: при новой сортировке по возрастанию формулы, которые ссылались на эту ячейку, не меняют динамический адрес. Чтобы быть точнее, прикрепляю файл с примером: там стоит задача сделать новую сортировку по возрастанию по столбцу В (выделен желтым), так чтобы формулы в столбце I "Остатки итоговые" ссылались на те ячейки, к которым были прикреплены изначально. Буду очень рада помощи.marmusia86
Да, именно к значениям. Т.е. вот внизу есть формула для спрея+масла, которая после изменения сортировки должна ссылаться на спрей и масло (соответственно).
Да, именно к значениям. Т.е. вот внизу есть формула для спрея+масла, которая после изменения сортировки должна ссылаться на спрей и масло (соответственно).marmusia86
Сообщение отредактировал marmusia86 - Среда, 06.07.2022, 16:37
Вы лучше напишите, что Вы хотите с этим спреем маслом сделать, т.к. используемые вами формулы похоже каждый раз нужно руками править
Так в этом и вопрос, как сделать так чтобы руками не править? Чтобы когда я сделала новую сортировка по желтому столбцу, формула спрей+масло ссылалась на спрей и масло, а не на те ячейки, где раньше эти позиции стояли.
Вы лучше напишите, что Вы хотите с этим спреем маслом сделать, т.к. используемые вами формулы похоже каждый раз нужно руками править
Так в этом и вопрос, как сделать так чтобы руками не править? Чтобы когда я сделала новую сортировка по желтому столбцу, формула спрей+масло ссылалась на спрей и масло, а не на те ячейки, где раньше эти позиции стояли.marmusia86
Что-то совсем какая-то беда... А текстовый формат на колонку I с какой целью установлен? Там же формулы, которые, вроде, пересчитываться должны...
Я попытался зайти в ячейку и включить с помощью клавиши F4 полную абсолютную адресацию всех слагаемых. Т.е. в ячейке I73 сейчас формула вида:
Код
=H73-J73-J218-J183
а должна стать:
Код
=$H$73-$J$73-$J$218-$J$183
По идее, это должно помочь (но на 100 % не уверен - надо проверять). Но меня встретил поголовный текстовый формат... Разумеется, эту операцию по абсолютизации адресов надо будет применить ко всем ячейкам колонки I до сортировки.
[p.s.]Хотя, скорее всего, я НЕ ПРАВ. И всё сложнее - надо все адреса не из текущей строки превращать в формулы с ИНДЕКС/ПОИСKПОЗ, как это обсуждалось в этой теме: http://www.excelworld.ru/forum/2-29353-1
Адреса внутри формулы, ссылающиеся на ячейки текущей строки, после сортировки перестроятся сами. А ссылки на другие строки надо будет превратить в комбинацию функций ИНДЕКС/ПОИСKПОЗ. Для этого также надо будет держать отдельный столбец с зафиксированными первоначальными номерами строк, но, вроде, такой столбец уже имеется - столбец A.[/p.s.]
Чтобы не мучаться с ручной заменой в каждой ячейке колонки I, можно попробовать (где-нибудь "сбоку") сочинить формулу или макрос VBA для выполнения подобной трансформации. Т.е. надо будет к номерам строк, не совпадающим с текущей, "пристраивать" функции ИНДЕКС и ПОИСКПОЗ. В помощь - функция Ф.ТЕКСТ:
Код
=Ф.ТЕКСТ(I73)
а также клавиатурная комбинация Ctrl+~ (контрол+тильда) для переключения ячеек рабочего листа в режим отображения формул.
В общем, задача на автозамену поставлена. Считаю, довольно интересная. Может, кто-нибудь откликнется и поможет. Сам бы хотел поучаствовать, но у меня сейчас нет времени на нее, но позже, если никто не откликнется, попробую что-нибудь сотворить.
Что-то совсем какая-то беда... А текстовый формат на колонку I с какой целью установлен? Там же формулы, которые, вроде, пересчитываться должны...
Я попытался зайти в ячейку и включить с помощью клавиши F4 полную абсолютную адресацию всех слагаемых. Т.е. в ячейке I73 сейчас формула вида:
Код
=H73-J73-J218-J183
а должна стать:
Код
=$H$73-$J$73-$J$218-$J$183
По идее, это должно помочь (но на 100 % не уверен - надо проверять). Но меня встретил поголовный текстовый формат... Разумеется, эту операцию по абсолютизации адресов надо будет применить ко всем ячейкам колонки I до сортировки.
[p.s.]Хотя, скорее всего, я НЕ ПРАВ. И всё сложнее - надо все адреса не из текущей строки превращать в формулы с ИНДЕКС/ПОИСKПОЗ, как это обсуждалось в этой теме: http://www.excelworld.ru/forum/2-29353-1
Адреса внутри формулы, ссылающиеся на ячейки текущей строки, после сортировки перестроятся сами. А ссылки на другие строки надо будет превратить в комбинацию функций ИНДЕКС/ПОИСKПОЗ. Для этого также надо будет держать отдельный столбец с зафиксированными первоначальными номерами строк, но, вроде, такой столбец уже имеется - столбец A.[/p.s.]
Чтобы не мучаться с ручной заменой в каждой ячейке колонки I, можно попробовать (где-нибудь "сбоку") сочинить формулу или макрос VBA для выполнения подобной трансформации. Т.е. надо будет к номерам строк, не совпадающим с текущей, "пристраивать" функции ИНДЕКС и ПОИСКПОЗ. В помощь - функция Ф.ТЕКСТ:
Код
=Ф.ТЕКСТ(I73)
а также клавиатурная комбинация Ctrl+~ (контрол+тильда) для переключения ячеек рабочего листа в режим отображения формул.
В общем, задача на автозамену поставлена. Считаю, довольно интересная. Может, кто-нибудь откликнется и поможет. Сам бы хотел поучаствовать, но у меня сейчас нет времени на нее, но позже, если никто не откликнется, попробую что-нибудь сотворить.Gustav
Сделал. Написал макрос, который меняет формулы с помощью подхода, обсужденного выше. Прикладываю файл, в котором обработка уже сделана. Попробуйте посортировать в нём строки и посмотреть как ведут себя формулы. Макрос - в файле. Здесь тоже дублирую: [vba]
Код
Option Explicit
Sub mainLoop() 'запускать эту процедуру Dim cell As Range
'в самой книге делается активным лист обработки (просто встаем на него) 'а тут задается адрес диапазона применения обработки на этом листе For Each cell In Range("I4:I320").Cells cell.Activate Call oneCellFormulaTransformation Next cell End Sub
Sub oneCellFormulaTransformation() Dim strFormula As String Dim lngRow As Long Dim arrAddress As Variant Dim strCellAddr As String Dim arrCellAddr As Variant Dim i As Integer Dim digits As Integer
'спешно добавленный обратный цикл по числу знаков номера строки (digits) 'чтобы корректно обрабатывать встретившуюся формулу типа =МИН(I7;I72) 'т.е. сначала заменить более длинный I72, а затем более короткий I7 'неоптимально чудовищно, но работает все равно бодро :) 'по-хорошему, здесь нужна просто сортировка массива, но где ж ее взять по-быстрому For digits = 7 To 1 Step -1 For i = LBound(arrAddress) To UBound(arrAddress) If arrAddress(i) <> "" Then strCellAddr = Application.ConvertFormula(arrAddress(i), xlA1, xlA1, xlAbsRowRelColumn) arrCellAddr = Split(strCellAddr, "$") If UBound(arrCellAddr) = 1 Then If Len(arrCellAddr(1)) = digits Then If CLng(arrCellAddr(1)) <> lngRow Then strFormula = Replace(strFormula, _ arrCellAddr(0) & arrCellAddr(1), _ "INDEX(" & arrCellAddr(0) & ":" & arrCellAddr(0) & ",MATCH(" & arrCellAddr(1) & ",A:A,))") End If End If End If End If Next i Next digits ActiveCell.NumberFormat = "General" ActiveCell.Formula = strFormula End Sub
[/vba]
Сделал. Написал макрос, который меняет формулы с помощью подхода, обсужденного выше. Прикладываю файл, в котором обработка уже сделана. Попробуйте посортировать в нём строки и посмотреть как ведут себя формулы. Макрос - в файле. Здесь тоже дублирую: [vba]
Код
Option Explicit
Sub mainLoop() 'запускать эту процедуру Dim cell As Range
'в самой книге делается активным лист обработки (просто встаем на него) 'а тут задается адрес диапазона применения обработки на этом листе For Each cell In Range("I4:I320").Cells cell.Activate Call oneCellFormulaTransformation Next cell End Sub
Sub oneCellFormulaTransformation() Dim strFormula As String Dim lngRow As Long Dim arrAddress As Variant Dim strCellAddr As String Dim arrCellAddr As Variant Dim i As Integer Dim digits As Integer
'спешно добавленный обратный цикл по числу знаков номера строки (digits) 'чтобы корректно обрабатывать встретившуюся формулу типа =МИН(I7;I72) 'т.е. сначала заменить более длинный I72, а затем более короткий I7 'неоптимально чудовищно, но работает все равно бодро :) 'по-хорошему, здесь нужна просто сортировка массива, но где ж ее взять по-быстрому For digits = 7 To 1 Step -1 For i = LBound(arrAddress) To UBound(arrAddress) If arrAddress(i) <> "" Then strCellAddr = Application.ConvertFormula(arrAddress(i), xlA1, xlA1, xlAbsRowRelColumn) arrCellAddr = Split(strCellAddr, "$") If UBound(arrCellAddr) = 1 Then If Len(arrCellAddr(1)) = digits Then If CLng(arrCellAddr(1)) <> lngRow Then strFormula = Replace(strFormula, _ arrCellAddr(0) & arrCellAddr(1), _ "INDEX(" & arrCellAddr(0) & ":" & arrCellAddr(0) & ",MATCH(" & arrCellAddr(1) & ",A:A,))") End If End If End If End If Next i Next digits ActiveCell.NumberFormat = "General" ActiveCell.Formula = strFormula End Sub