Здравствующие, Уважаемые форумчане Помогите пожалуйста с макросом. Надо присвоить форматы числам сформированные из символов которые находятся в соседней к этому числу ячейке. Как возможно такое? Более понятно постаралась изобразить в файле.
Если именно отформатировать, то при ограниченном количестве вариантов можно условным форматированием, если не ограниченно, то только макросом, Если прост рядом отобразить , то текст( ) а в формате указать суффикс.
Sub ApplyFormatBasedOnAdjacentCell()
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("ВашЛист") ' Укажите имя вашего листа
Dim lastRow As Long
lastRow = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row ' Предполагается, что данные в столбце B
Dim i As Long
For i = 1 To lastRow
Dim formatString As String
formatString = ws.Cells(i, "B").Value ' Символы для формата
Select Case formatString
Case "TTRT"
ws.Cells(i, "C").NumberFormat = "0.00" ' Пример формата для TTRT
Case "RRT"
ws.Cells(i, "C").NumberFormat = "0" ' Пример формата для RRT
Case "RRR"
ws.Cells(i, "C").NumberFormat = "#,##0" ' Пример формата для RRR
Case Else
' Действие по умолчанию, если формат не найден
ws.Cells(i, "C").NumberFormat = "General"
End Select
Next i
End Sub
Пускаете через редактор VBA. Этот код проверяет символы в столбце B и применяет соответствующий числовой формат к ячейкам в столбце C. Больше условий можете добавить в Select Case
написал: Пускаете через редактор VBA. Этот код проверяет символы в столбце B и применяет соответствующий числовой формат к ячейкам в столбце C. Больше условий можете добавить в Select Case
Спасибо большое за труд, но в вашем варианте в коде строго прописаны значения форматов. Мысль была иная,- какое значение в ячейке столбца "B" таков и формат числа по строке в ячейке столбца "С" (в файле примере столбец "С" с "D" спутан)
написал: И видите, куда в коде можно прописать эти символы.Можно например так использовать - встать на любую ячейку в D с числом и выполнить
Простите, за беспокойство, но вот сама никак не смогла разобраться. На определенные символы возникает ошибка, не подскажите в чем дело? Пример в файле.
Вероника Суворова, я смотрю Вы там уже ставили вручную такие форматы... Запись рекордера даёт
Код
Selection.NumberFormat = "#,##0.00 \D\D\D"
т.е. для таких резервированных системой символов (формата даты и времени в данном случае) нужно экранировать каждый символ. Это усложняет, но теоретически сделать можно. Но практически возиться никто не будет, если только сидя и работая работу )) Наверняка ведь есть перечень этих возможных символов - составьте список форматов, и подставляйте готовое по списку. P.S. Хотя можно просто любой набор символов разбивать на элементы и перед каждым ставить слэш... наверное должно сработать.
Код
Sub ФорматПрисвоить()
' Присваивает формат числу символом из соседней ячейки
Dim s$, ss$
s = Selection.Offset(, -2) 'получаем в переменную символы
For i = 1 To Len(s)
ss = ss & "\" & Mid(s, i, 1)
Next
Selection.NumberFormat = "#,##0.00" & " " & ss 'используем
End Sub
написал: Это усложняет, но теоретически сделать можно. Но практически возиться никто не будет, если только сидя и работая работу ))Наверняка ведь есть перечень этих возможных символов - составьте список форматов, и подставляйте готовое по списку.
Спасибо большое! Вроде работает! Это наименование токенов, а их все не переберешь для списка...
написал: Хотя можно просто любой набор символов разбивать на элементы и перед каждым ставить слэш... наверное должно сработать.
Уважаемый, Hugo извините за реанимацию темы, но никак сама не могу дойти... Как подправить код, что бы столбец с символами в ячейках, к которому идет обращение, был постоянным, а столбец с данными для форматирования мог быть разным? То есть при активации той или иной ячейки (при запуске макроса) находящееся в ней число подлежала форматированию по своей строке из ячейки со столбца с символами. Столбец с символами может быть самый крайний с лева относительно форматируемых данных Ну и намотала... понятно то хоть...?
Вероника Суворова, Добрый день. Ну отлучился чуть, отвлёкся на другой вопрос, не уследил... (( Можно в коде указать номер столбца, можно определить последнее заполненное значение в строке например аналогично как и последнюю строку:
Вероника Суворова, вариант дальнейшего развития - выделяем ИЗБРАННО ячейки ОДНОГО столбца, выполняем tt
Код
Sub tt()
Dim c As Range
Dim x&
x = InputBox("Запрос сдвига", "Введите число")
For Each c In Selection
Call ФорматЧисла(c, x)
Next
End Sub
Sub ФорматЧисла(c As Range, x&)
' ссылка на тему: https://www.planetaexcel.ru/forum/?PAGE_NAME=read&FID=1&TID=170324&TITLE_SEO=170324-formaty-dlya-chisel-s-simvolami-iz-sosedney-yacheyki
' Присваивает формат числу символом из соседней ячейки 13/03/2025 реализация HUGO
Dim s$, ss$
s = c.Offset(, -x) 'получаем в переменную символы
For i = 1 To Len(s)
ss = ss & "\" & Mid(s, i, 1)
Next
c.NumberFormat = "#,##0.00" & " " & ss 'используем
End Sub
Можно жёстко в коде прописать откуда брать формат, если он всегда там. Ну и тут ещё разрядность не учитывается, это потом руками понажимать на кнопочку в панели
написал: Можно жёстко в коде прописать откуда брать формат, если он всегда там.
Вариант очень интересный со сдвигом, но вот боюсь оперативно у операциониста получится с ошибкой на какое кол-во стлб в лево сдвинуть.. А можно вариант с жестким определением столбца от куда брать формат? Главное чтоб понятно было как самой поправить когда таблица окончательно в своем виде утрясется. Если не затруднит конечно
Вероника Суворова, Тогда нужно написать два разных макроса, в каждом указать свой сдвиг. Ну один tt, второй ttt, и в каждом убрать запрос, заменив на константу, которую давать макросу задающему формат. Как вариант. Но его тоже нужно чуть поправить. Сейчас гляну
Глянул, скорректировал
Код
Sub Символ()
Dim c As Range
Dim x&
x = 3 'InputBox("Запрос сдвига", "Введите число")
For Each c In Selection
Call ФорматЧисла(c, x)
Next
End Sub
Sub Пара()
Dim c As Range
Dim x&
x = 4 'InputBox("Запрос сдвига", "Введите число")
For Each c In Selection
Call ФорматЧисла(c, x)
Next
End Sub
Sub ФорматЧисла(c As Range, x&)
' ссылка на тему: https://www.planetaexcel.ru/forum/?PAGE_NAME=read&FID=1&TID=170324&TITLE_SEO=170324-formaty-dlya-chisel-s-simvolami-iz-sosedney-yacheyki
' Присваивает формат числу символом из соседней ячейки 13/03/2025 реализация HUGO
Dim s$, ss$
s = Cells(c.Row, x) 'c.Offset(, -x) 'получаем в переменную символы
For i = 1 To Len(s)
ss = ss & "\" & Mid(s, i, 1)
Next
c.NumberFormat = "#,##0.00" & " " & ss 'используем
End Sub
Вероника Суворова, Вероника, есть небольшой update основного макроса:
Код
Sub ФорматЧисла(c As Range, x&)
' ссылка на тему: https://www.planetaexcel.ru/forum/?PAGE_NAME=read&FID=1&TID=170324&TITLE_SEO=170324-formaty-dlya-chisel-s-simvolami-iz-sosedney-yacheyki
' Присваивает формат числу символом из соседней ячейки 13/03/2025 реализация HUGO
Static f As String
Dim s$, ss$
s = Cells(c.Row, x) 'c.Offset(, -x) 'получаем в переменную символы
If Len(s) Then f = s
For i = 1 To Len(f)
ss = ss & "\" & Mid(f, i, 1)
Next
c.NumberFormat = "#,##0." & howmatch(c) & " " & ss 'используем
End Sub
Function howmatch(c) As String
Dim x, y&
x = Abs(c)
y = Application.Max(2, Len(CStr(x)) - InStr(CStr(x), ","))
howmatch = String(y, "0")
End Function
С этим кодом можно выделять диапазон целиком
как на скрине
и формат будет и в строках сумм. Код запоминает последний формат, и если нового нет в образце то применяет последний.
Вероника Суворова, для идеала на практике ещё бы нужно чтобы код сам искал где написаны эти символы форматов! Но если они всегда будут в этих столбцах то ОК. Но можно например подстраховаться - если в начале работы код в ячейке C3 не находит "Символ | Пара" то вывести какое-то сообщение - тогда если вдруг кто-то сдвинет таблицу то это побудит и код подправить/доработать.
вот например эту одну строку
Код
вот например эту одну строку в оба кода добавить так:
Sub Символ()
Dim c As Range
Dim x&
If [c3] <> "Символ | Пара" Then MsgBox "Alarma!!!", vbCritical: Exit Sub '<==============
x = 3 'InputBox("Запрос сдвига", "Введите число")
For Each c In Selection
Call ФорматЧисла(c, x)
Next
End Sub
Я думала про это, но не осмелилась)). Столбец с символами как раз и может (будет) меняться и не раз.. Изначально содержание символа и пары уникально: символ/пара в одной ячейке - напр PPP/USD то есть через косую (это я уже разнесла по столбцам для упрощения задачи) во всей таблице подобное сложение символов только у "символа и пары" ну вот как то так...
Вероника Суворова, если будет часто меняться - то кроме проверки можно координаты этих столбцов писать где-то на листе, где всегда пусто, и невидимыми чернилами чтоб не мешало и не печаталось. И брать их кодом из этих константных ячеек. Т.е. не поменяли координаты - будет сообщение. Скорректировали - работаете без сообщений. Ну или можно делать поиск (перебором, или Find использовать) - ну это если вообще код в надстройке, а файл каждый раз новый и совсем другой, но есть точный признак как найти эти символы. И они могут быть и через косую черту, это не сложно в коде обработать.
Я поняла. Тогда для понимания варианта составление ТЗ надо выяснить вопрос какой принцип обработки применить по принципу проще - бюджетней. 1) Столбец с символами будущих форматов чисел в таблице как константа (то есть как сейчас). 2) Первоначально в исходных данных в ячейках таблицы в числах присутствуют буквенные символы напр. - 10 000 PPP. Могут ли они являться будущими форматами этих чисел? После чего эти буквенные символы удаляются из чисел для приобретения их считабельности. Ну и конечно же как итог стоимость этого проекта, так как это чисто моя хотелка для облегчения в работе.
Вероника Суворова написал: в числах присутствуют буквенные символы напр. - 10 000 PPP.Могут ли они являться будущими форматами этих чисел?
- могут. По сути всё равно откуда брать символы в переменную s. Т. к. они удаляются другим кодом (не вникал в тут тему, но очевидно что связано с этой)) - нужно будет подумать как это связать. По стОимости пока ничего не скажу, т.к. нужно видеть всю картину. Но сразу говорю - рублями взять не могу, санкции пока действуют.