1

На днях у меня была некоторая информация расписания в электронной таблице ($ X/hr, Y hrs), и я хотел вычислить потраченные доллары. Я закончил, просто отредактировав символы "/hr", "hrs" и "$", но есть ли способ, которым я мог бы преобразовать эти ячейки непосредственно в числа с плавающей точкой в формуле для выполнения вычисления?

= B $ 3 * B $ 4

Я попробовал VALUE, и это не сработало.

3 ответа3

3

Попробуйте этот маленький UDF

Public Function NumberPart(s As String) As Double
    Dim s2 As String, i As Long, L As Long, CH As String
    s2 = ""
    L = Len(s)
    For i = 1 To L
        CH = Mid(s, i, 1)
        If CH Like "[0-9]" Or CH = "." Then
            s2 = s2 & CH
        End If
    Next i
    NumberPart = CDbl(s2)
End Function

Пользовательские функции (UDF) очень просты в установке и использовании:

  1. ALT-F11 открывает окно VBE
  2. ALT-I ALT-M открывает новый модуль
  3. вставьте материал и закройте окно VBE

Если вы сохраните книгу, UDF будет сохранен вместе с ней. Если вы используете версию Excel более поздней, чем в 2003 году, вы должны сохранить файл как .xlsm, а не .xlsx

Чтобы удалить UDF:

  1. откройте окно VBE, как указано выше
  2. очистить код
  3. закройте окно VBE

Чтобы использовать UDF из Excel:

= NumberPart(А1)

Чтобы узнать больше о макросах в целом, смотрите:

http://www.mvps.org/dmcritchie/excel/getstarted.htm

а также

http://msdn.microsoft.com/en-us/library/ee814735(v=office.14).aspx

а также

http://www.cpearson.com/excel/WritingFunctionsInVBA.aspx

для уточнения на UDFs

Макросы должны быть включены, чтобы это работало!

1

Хотя приведенный выше ответ работает и очень хорошо задокументирован, у меня есть два возражения против него:

  • Он выдает ложные выходные данные, если ввод содержит непредусмотренные числовые значения (например, попробуйте: "12 часов1" или «$ 12/1 час» или когда ваша локаль использует «,» как десятичный разделитель вместо «.»).
  • Если возможно, я бы держался подальше от Visual Basic для приложений (VBA) и UDF; особенно если того же можно достичь с помощью следующих встроенных функций Excel:
    • LEFT: берет левую сторону строки до определенной длины (используется для обрезки "/hr").
    • VALUE: преобразовывает текст в значение (используется для преобразования оставшегося значения в строке в значение).
    • FIND: поиск символа или строки в другой строке (используется для поиска '/' в "/hr").
    • SUBSTITUTE: изменяет все вхождения строки в другой строке (используется для удаления "HRS").
    • UPPER: преобразует все символы в верхний регистр (используется для изменения "часов", "часов" и т.д. На "HRS").

Если упомянутые значения находятся в столбцах A (цена за час) и B (количество часов), начиная с данных в строке 1 (без строки заголовка), поместите следующую формулу в Excel:

  • C1: =VALUE(LEFT(A2;FIND("/";A1;1)-1)) и, при необходимости, скопируйте и вставьте.
  • D1: =VALUE(SUBSTITUTE(UPPER(B1);"HRS";"")) и скопировать-вставить по необходимости.

Это должно делать свое дело. Ничего сложного, я бы сказал.

0

Другой метод - использовать VBA вместе с Regex и подходящим шаблоном.
Например, шаблон \D соответствует всему, что не является цифрой (0-9).

  1. Вставьте этот код в модуль VBA ( ALT+F11). При вызове из Excel UDF требуется 2 аргумента: входная ячейка и шаблон RegEx для проверки. Затем код удаляет каждый символ, который соответствует данному шаблону.

    Function Remove(objCell As Range, strPattern As String)
    
        Dim RegEx As Object
        Set RegEx = CreateObject("VBScript.RegExp")
        RegEx.Global = True
        RegEx.Pattern = strPattern
        Remove = RegEx.Replace(objCell.Value, "")
    
    End Function
    
  2. Вернувшись в Excel, напишите свою формулу в этом синтаксисе в новую ячейку

    =Remove( <cellToCheck> ,"<regExPattern>")
    

Я взял ваш пример для умножения двух «нецифровых» ячеек: $50/hr * 8 hrs = 400


Тем не менее, это не будет работать, если у вас есть несколько (непреднамеренных) числовых значений в одной ячейке, например, $50/hr2

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .