Используя Excel, я пытаюсь выполнить следующее:
Мне нужно преобразовать все единицы в соответствующее название страны каждого столбца. С небольшим набором данных, как в примере выше, легко сделать это вручную, но не так просто, когда у меня 196 столбцов x 2 набора данных. Любые предложения будут высоко ценится!
«Если вы хотите, чтобы это было на месте, формулы этого не сделают» @Scott Craner Правильно. Формула не может этого сделать. Но пользовательский числовой формат может!
@ProfoundlyOblivious Меня бы заинтересовал пользовательский формат, который будет делать то, что хотят параметры
@Scott Craner в отдельных ячейках введите 1 0 R -1, создайте собственный числовой формат. В поле типа клавиша «Лошадь»; «Ричард»; «Осел»; "Пробить" щелкните и вернитесь к своему листу, наблюдая за результатом. Добавлен бонус, это все еще числа, так что Лошадь + Ричард = Осел. Вы также можете использовать условные выражения, такие как [> = 6] "Sallie" К сожалению, Салли сказала, что этот метод ограничивает вывод до 4 вариантов, но вы можете использовать настраиваемое форматирование, чтобы добавить больше. Просто используйте новый собственный числовой формат вместо традиционного изменения цвета.
@ProfoundlyOblivious Я думал, у вас есть один, который можно применить ко всем столбцам. Для каждого столбца потребуется отдельный формат. Я надеялся, что у тебя есть способ поискать
@Scott Craner второй формат не нужен для других столбцов, если используется набор данных в примере. Ограничением является количество доступных вариантов. В примере есть 6 возможных вариантов. Сам числовой формат может обрабатывать максимум 4 варианта, условное форматирование поверх настраиваемого числа может обрабатывать все 6 и может быть установлено для одной ячейки и скопировано в любой диапазон, где это необходимо. Это второстепенный вариант использования с лучшими вариантами, поэтому я упоминаю его только в комментариях. Тем не менее, настраиваемые числа очень полезны, иногда эффективны и заслуживают изучения.
Было бы, если бы OP хотел сохранить текущую настройку. @ProfoundlyOblivious Я знаю, как использовать настраиваемое форматирование и делать это регулярно, я просто не мог понять, как вы могли бы использовать его с текущим форматом в виде единого кода.
@Scott Craner Верно, это не поиск. Цитаты используются, потому что это поиск, но не тот тип, который обычно используется в Excel. Еще один момент, который следует учитывать, заключается в том, что OP использовал целое число в качестве флага, поэтому мы не можем предполагать, что математика не выполняется, если явно не указано иное. Используя только 4 варианта, у нас будет одно положительное и одно отрицательное целое число, ноль и нечисловой текстовый символ, а с 6 значениями вы вводите еще два неравных целых числа. Любая математика теперь требует ненужных сложностей. Уверяю вас, я бы использовал раздел ответов, если бы подумал, что это хорошее решение вопроса OP.
@ProfoundlyOblivious, в конце концов, я надеялся узнать что-то новое. Спасибо за обсуждение.
Дублируйте лист и удалите все значения, кроме заголовка, на втором листе. Поместите следующую формулу в каждую соответствующую ячейку, кроме строки заголовка на втором листе.
=IF(INDIRECT(ADDRESS(ROW(),COLUMN(),1,1,"Sheet1"),TRUE)=1,
MID(INDIRECT(ADDRESS(1,COLUMN())),
FIND("[",INDIRECT(ADDRESS(1,COLUMN())))+1,
FIND("]",INDIRECT(ADDRESS(1,COLUMN())))-
FIND("[",INDIRECT(ADDRESS(1,COLUMN())))-1),"")
Затем вы можете скопировать соответствующие ячейки второго листа. Прошлые значения в первый лист. Готово.
{Вы захотите удалить из формулы символы возврата каретки. Кроме того, вы можете удалить второй лист, чтобы скрыть магию. :-)}
Если вы хотите использовать vba вместо формулы, я думаю, это сработает для вас. Он ищет непустые ячейки в "A:F"
, и для этих ячеек он захватывает имя внутри [...]
.
Sub AdjustName()
Dim cell As Range
For Each cell In Range("A2:F" & LastRowInRange_Find(Range("A:F")))
If Len(cell.Value2) > 0 Then
With Cells(1, cell.Column)
cell.Value2 = Mid(.Value2, InStr(.Value2, "[") + 1, Len(.Value2) - 1 - InStr(.Value2, "["))
End With
End If
Next cell
End Sub
Function LastRowInRange_Find(ByVal rng As Range) As Long
'searches range from bottom up looking for "*" (anything)
Dim rngFind As Range
Set rngFind = rng.Find( _
What: = "*", _
After:=Cells(rng.row, rng.Column), _
LookAt:=xlWhole, _
LookIn:=xlValues, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious)
If Not rngFind Is Nothing Then
LastRowInRange_Find = rngFind.row
Else
LastRowInRange_Find = rng.row
End If
End Function
Если вы хотите, чтобы он был на месте, формулы этого не сделают.