Доброго времени суток! Делаю макрос, в котором надо к числовым значениям ячеек прибавить некоторое число. Таблица со значениями генерируется сторонней программой и все значения в текстовом виде, однако у некоторых значений имеется у числа звездочка "*", например 1677.25*. При этом после вычислений эту звездочку надо вернуть на место. Но что только не делал, но избавиться от звездочки в числе не получается. Пробовал и символами играть "~*", Chr(42), и Left+Len и Replace не хочет работать и все. Помогите с этой звездочкой. П.С. ИИ тоже не помог.
Sub Summa2() Dim LastRowList, LastRowObr AsLong, List, zvezda, TempCell AsString Dim Cell As Range Dim add, CellVal AsDouble With Sheets("обработка")
List = Str(.Cells(1, 2))
LastRowObr = .Cells(.Rows.Count, "A").End(xlUp).Row EndWith
For j = 2To LastRowList IfCStr(Sheets(List).Cells(j, "B").Value) = CStr(Sheets("обработка").Cells(i, "A").Value) Then
For k = 3To10 Set Cell = Sheets(List).Cells(j, k)
zvezda = ""
'начало проблемного места IfLen(Trim(Cell.text)) = 0Or Cell.Value = "*"ThenGoTo2ElseGoTo1 1: IfCStr(Cell.Value) Like"\*"Then zvezda = "*": _
Cell.Value = Replace(Cell.Value, Chr(42), "") _ Else: zvezda = ""
CellVal = CDbl(Cell.Value) 'конец проблемного места
CellVal = CellVal + add
Cell = CellVal & zvezda
Cell = Format(Cell.Value, "0.00") 2: Next k EndIf Next j Next i
EndSub
Доброго времени суток! Делаю макрос, в котором надо к числовым значениям ячеек прибавить некоторое число. Таблица со значениями генерируется сторонней программой и все значения в текстовом виде, однако у некоторых значений имеется у числа звездочка "*", например 1677.25*. При этом после вычислений эту звездочку надо вернуть на место. Но что только не делал, но избавиться от звездочки в числе не получается. Пробовал и символами играть "~*", Chr(42), и Left+Len и Replace не хочет работать и все. Помогите с этой звездочкой. П.С. ИИ тоже не помог.
Sub Summa2() Dim LastRowList, LastRowObr AsLong, List, zvezda, TempCell AsString Dim Cell As Range Dim add, CellVal AsDouble With Sheets("обработка")
List = Str(.Cells(1, 2))
LastRowObr = .Cells(.Rows.Count, "A").End(xlUp).Row EndWith
Hugo, был бы любой другой символ - это работало, но именно со звездочкой какой-то треш. При stop смотрю значения, а звездочка как была, так и остается, соответственно потом улетает в ошибку типа данных.
Hugo, был бы любой другой символ - это работало, но именно со звездочкой какой-то треш. При stop смотрю значения, а звездочка как была, так и остается, соответственно потом улетает в ошибку типа данных.Паштет
' Сохраняем адресс ячейки, если есть * для того чтоб её после вернуть обратно IfRight(Cell.Text, 1) = "*"Then
starCells(Cell.Address) = True
Cell.Value = Replace(Cell.Value, "*", "") EndIf
Ну и в конечном результате вот такой код:
Sub Summa2() Dim i AsLong, j AsLong, k AsLong Dim Cell As Range Dim CellVal AsDouble Dim Key AsVariant
Dim starCells AsObject Set starCells = CreateObject("Scripting.Dictionary") ' Для хранения адресов с *
With ThisWorkbook.Worksheets("обработка")
Dim List AsString
List = CStr(.Cells(1, 2).Value)
Dim LastRowObr AsLong
LastRowObr = .Cells(.Rows.Count, "A").End(xlUp).Row EndWith
' Сохраняем адресс ячейки, если есть * для того чтоб её после вернуть обратно IfRight(Cell.Text, 1) = "*"Then
starCells(Cell.Address) = True
Cell.Value = Replace(Cell.Value, "*", "") EndIf
' Возвращаем * обратно For Each Key In starCells.Keys
ThisWorkbook.Worksheets(List).Range(Key).Value = ThisWorkbook.Worksheets(List).Range(Key).Value & "*" Next Key
Set starCells = Nothing EndSub
Логику расчётов не менял так как не вникал в неё. Думаю это тот результат который вы ожидаете. Удачи.
Паштет, Вобщем долго я не мог понять логику вашего кода. А именно данного блока кода:
' Сохраняем адресс ячейки, если есть * для того чтоб её после вернуть обратно IfRight(Cell.Text, 1) = "*"Then
starCells(Cell.Address) = True
Cell.Value = Replace(Cell.Value, "*", "") EndIf
Ну и в конечном результате вот такой код:
Sub Summa2() Dim i AsLong, j AsLong, k AsLong Dim Cell As Range Dim CellVal AsDouble Dim Key AsVariant
Dim starCells AsObject Set starCells = CreateObject("Scripting.Dictionary") ' Для хранения адресов с *
With ThisWorkbook.Worksheets("обработка")
Dim List AsString
List = CStr(.Cells(1, 2).Value)
Dim LastRowObr AsLong
LastRowObr = .Cells(.Rows.Count, "A").End(xlUp).Row EndWith
' Сохраняем адресс ячейки, если есть * для того чтоб её после вернуть обратно IfRight(Cell.Text, 1) = "*"Then
starCells(Cell.Address) = True
Cell.Value = Replace(Cell.Value, "*", "") EndIf
' Возвращаем * обратно For Each Key In starCells.Keys
ThisWorkbook.Worksheets(List).Range(Key).Value = ThisWorkbook.Worksheets(List).Range(Key).Value & "*" Next Key
Set starCells = Nothing EndSub
Логику расчётов не менял так как не вникал в неё. Думаю это тот результат который вы ожидаете. Удачи.MikeVol
Паштет, Вобщем долго я не мог понять логику вашего кода. А именно данного блока кода
Смысл в том, что если число написано со звездочкой, то убираем звездочку из числа, и присваиваем ее переменной zvezda, что бы после вычисления обратно добавить звезду к получившемуся числу. Чуть позже проверю ваш код.
Hugo, Pelena, при всем уважении, при первой обработке числа со звездой вылет ошибки в строке:
CellVal = CDbl(Cell.Value)
.
Цитата
Паштет, Вобщем долго я не мог понять логику вашего кода. А именно данного блока кода
Смысл в том, что если число написано со звездочкой, то убираем звездочку из числа, и присваиваем ее переменной zvezda, что бы после вычисления обратно добавить звезду к получившемуся числу. Чуть позже проверю ваш код.
Hugo, Pelena, при всем уважении, при первой обработке числа со звездой вылет ошибки в строке:
при первой обработке числа со звездой вылет ошибки в строке:
- это другой вопрос, у нас очевидно не вылетает, у меня точно. Это уже региональные настройки, разделители. Можно конечно делать универсально или под конкретную систему... Но не было такой задачи. Тем более что это срабатывает когда никакой звёздочки в значении нет ))
при первой обработке числа со звездой вылет ошибки в строке:
- это другой вопрос, у нас очевидно не вылетает, у меня точно. Это уже региональные настройки, разделители. Можно конечно делать универсально или под конкретную систему... Но не было такой задачи. Тем более что это срабатывает когда никакой звёздочки в значении нет ))Hugo
Ну это не проблема, просто в ячейке может быть строка, которую можно преобразовать в число, а может быть то что нельзя. У меня отработало без ошибок, но я не изучал где ошибка у Вас, да Вы и не показали.
Ну это не проблема, просто в ячейке может быть строка, которую можно преобразовать в число, а может быть то что нельзя. У меня отработало без ошибок, но я не изучал где ошибка у Вас, да Вы и не показали.Hugo
А с чего вы взяли что должна произойти ошибка? Ошибка может произойти если значение в ячейке вообще не число (например, "abc" или "#DIV/0!", ошибка в вычеслиния формулы). CDbl выдаёт ошибку - подавляется ошибка и CellVal остаётся 0 и тогда в расчётах будет использоваться ноль, что может быть логически неверно. Вопрос возможно будет от вас следуйщий: Как CellVal остаётся 0? Всё потому что мы объявили Dim CellVal As Double, и значит по умолчанию равен 0 (ноль). Хотите можете так написать данный блок:
' Проверка: можно ли безопасно конвертировать в число IfIsNumeric(Cell.Value) Then
CellVal = CDbl(Cell.Value)
CellVal = CellVal + add
Cell.Value = Format(CellVal, "0.00") EndIf
Тут мы чётко проверяем, что значение действительно числовое, это явнее и безопаснее, чем полагаться на On Error Resume Next. А может я не понял ваш вопрос
А с чего вы взяли что должна произойти ошибка? Ошибка может произойти если значение в ячейке вообще не число (например, "abc" или "#DIV/0!", ошибка в вычеслиния формулы). CDbl выдаёт ошибку - подавляется ошибка и CellVal остаётся 0 и тогда в расчётах будет использоваться ноль, что может быть логически неверно. Вопрос возможно будет от вас следуйщий: Как CellVal остаётся 0? Всё потому что мы объявили Dim CellVal As Double, и значит по умолчанию равен 0 (ноль). Хотите можете так написать данный блок:
' Проверка: можно ли безопасно конвертировать в число IfIsNumeric(Cell.Value) Then
CellVal = CDbl(Cell.Value)
CellVal = CellVal + add
Cell.Value = Format(CellVal, "0.00") EndIf
Тут мы чётко проверяем, что значение действительно числовое, это явнее и безопаснее, чем полагаться на On Error Resume Next. А может я не понял ваш вопрос