Формула Excel для суммирования столбца определенных валют - PullRequest
0 голосов
/ 10 сентября 2018

У меня есть следующий столбец в Excel.

enter image description here

Я хотел бы иметь формулу Excel, которая может суммировать ячейки определенных валют. Ячейки в формате валют. Пользовательская функция VBA тоже подойдет, но предпочтение отдается формуле Excel.

Я использую Excel 2016.

РЕДАКТИРОВАТЬ: ячейки в формате валюты. Префикс символа валюты перед не является строкой в ​​ячейке.

Ответы [ 3 ]

0 голосов
/ 10 сентября 2018

UDF на основе регулярных выражений. Это основано на представленной в тексте валюте, т. Е. В ячейке указан доллар США / евро и т. Д.

Option Explicit

Public Function GetCurrencySum(ByVal rng As Range, ByVal aCurrency As String) As Variant
    Dim inputString As String, arr()
    If rng.Columns.Count > 1 Then
        GetCurrencySum = CVErr(xlErrNA)
        Exit Function
    End If

    Select Case rng.Count
    Case 1
        ReDim arr(0): arr(0) = rng.Value
    Case Else
        arr = rng.Value
    End Select

    inputString = Join(Application.WorksheetFunction.Transpose(Application.WorksheetFunction.Index(arr, 0, 1)), "~") & "~"

    Dim matches As Object, match As Object
    With CreateObject("VBScript.RegExp")
        .Global = True
        .MultiLine = True
        .Pattern = "[+-]?" & aCurrency & ".*?(?=~)"
        On Error GoTo errhand:
        If .TEST(inputString) Then
            Set matches = .Execute(inputString)
            For Each match In matches
                 GetCurrencySum = GetCurrencySum + CDbl(Replace$(match, aCurrency, vbNullString))
            Next
            Exit Function
        End If
        GetCurrencySum = 0
        Exit Function
    End With
errhand:
    GetCurrencySum = CVErr(xlErrNA)
End Function

В листе:

enter image description here


Regex:

Попробуйте здесь .

[+-]?JPY.*?(?=~)
/
gm

Соответствует одному символу, представленному в списке ниже [+-]?

? Квантификатор - сопоставляет от нуля до одного раза столько раз, сколько возможно, возвращая при необходимости (жадный) +- соответствует одному символу в списке +- (с учетом регистра)

JPY соответствует буквам JPY буквально (с учетом регистра) '

.*? соответствует любому символу (кроме ограничителей строки) *? Квантификатор - Сопоставляет от нуля до неограниченного количества раз, насколько это возможно, с расширением по мере необходимости (ленивый)

Позитивный взгляд вперед (?=~)

Утверждают, что приведенное ниже регулярное выражение совпадает ~ соответствует символу ~ буквально (с учетом регистра)


Если в ячейке есть другой текст, вы можете попробовать:

Public Function GetCurrencySum(ByVal rng As Range, ByVal aCurrency As String) As Variant
    Dim inputString As String, arr()
    If rng.Columns.Count > 1 Then
        GetCurrencySum = CVErr(xlErrNA)
        Exit Function
    End If

    Select Case rng.Count
    Case 1
        ReDim arr(0): arr(0) = rng.Value
    Case Else
        arr = rng.Value
    End Select

    inputString = Join(Application.WorksheetFunction.Transpose(Application.WorksheetFunction.Index(arr, 0, 1)), "~") & "~"

    Dim matches As Object, match As Object
    With CreateObject("VBScript.RegExp")
        .Global = True
        .MultiLine = True
        .Pattern = "[\-\+]?" & aCurrency & "\s[\d,.]+"
        On Error GoTo errhand:
        If .test(inputString) Then
            Set matches = .Execute(inputString)
            For Each match In matches
                  GetCurrencySum = GetCurrencySum + CDbl(Replace$(Replace$(match, aCurrency, vbNullString), "~", vbNullString))
            Next
            Exit Function
        End If
        GetCurrencySum = 0
        Exit Function
    End With
errhand:
    GetCurrencySum = CVErr(xlErrNA)
End Function

Попробуйте здесь .

0 голосов
/ 10 сентября 2018

Я внес несколько изменений в ответ Дилана, чтобы внести некоторые изменения в соответствии со своими предпочтениями. Я публикую этот ответ на свой вопрос для дальнейшего использования.

Предположим, что существует диапазон (A2: A5), где A2 = евро, а все остальное - это USD, чтобы получить сумму в долларах США, вы должны ввести следующее в любую ячейку =GetCurrencySum(A2:A5, "[$USD] #,##0.00").

Function GetCurrencySum(SumCellRange As Range, CurrencyFormat As String) As Single
    On Error GoTo errorhd
    Dim Cell As Variant
    Dim SumRange As Single

    SumRange = 0
    For Each Cell In SumCellRange
        If Cell.NumberFormat = CurrencyFormat Then
            SumRange = SumRange + Cell
        End If
    Next Cell    

    GetCurrencySum = SumRange
    Exit Function
errorhd:
    MsgBox Err.Source & "-->" & Err.Description, , "CurrencyVal"
End Function
0 голосов
/ 10 сентября 2018

Итак, я пошел по маршруту UDF - дайте мне знать, если это работает для вас. Если вам нужна помощь в настройке и запуске, не стесняйтесь, дайте мне знать.

Синтаксис для UDF: CurrencyVal (диапазон, который вы используете как «sumif», ячейка с форматированием, которое вы хотите суммировать)

Так, например:

Если у меня есть диапазон (A2: A5), где A2 = евро, а все остальное - доллары США, то для получения суммы в долларах США вы должны ввести следующее в любую ячейку = CurrencyVal (A2: A5, A3).

Option Explicit
Function CurrencyVal(SumCellRange As Range, CurrencySumCell As Range) As Integer

Dim Cell As Variant
Dim SumRange As Integer

For Each Cell In SumCellRange
    If Cell.NumberFormat = CurrencySumCell.NumberFormat Then
        SumRange = SumRange + Cell
    End If
Next Cell


CurrencyVal = SumRange


End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...