Есть ли способ сделать IF + - PullRequest
1 голос
/ 01 мая 2020

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

Я хотел бы сделать то, что в Excel выглядело бы так, но в VBA: - if(Search("5,",A10,1)>0,A5,0)+if(Search("4,",A10,1)>0,A4,0)+if(Search("3,",A10,1)>0,A3,0) и т. Д.

Единственный способ увидеть это в vba - это сделать поиск добавить данные в другом месте, а затем сделать сумму позже. У меня есть это: -

    Sub AmorTotal_1()

Dim Coll As String
Dim ClTo As String, RuTo As String, ElTo As String, Jig As String, Teth As String, Admin As String, Crane As String
Dim ClToS As Integer, RuToS As Integer, ElToS As Integer, JigS As Integer, TethS As Integer, AdminS As Integer, CraneS As Integer

Coll = "B"
ClTo = 5
RuTo = 6
ElTo = 7
Jig = 8
Teth = 9
Admin = 10
Crane = 11

ThisWorkbook.Sheets(2).Range(Coll & 2).Value = ThisWorkbook.Sheets(1).Range(Coll & 2).Value

If InStr(1, Range(Coll & 12), "5,") > 0 Then
ThisWorkbook.Sheets(2).Range(Coll & 3).Value = ThisWorkbook.Sheets(1).Range(Coll & ClTo).Value
Else
ThisWorkbook.Sheets(2).Range(Coll & 3).Value = 0
End If

If InStr(1, Range(Coll & 12), "6,") > 0 Then
ThisWorkbook.Sheets(2).Range(Coll & 4).Value = ThisWorkbook.Sheets(1).Range(Coll & RuTo).Value
Else
ThisWorkbook.Sheets(2).Range(Coll & 4).Value = 0
End If

If InStr(1, Range(Coll & 12), "7,") > 0 Then
ThisWorkbook.Sheets(2).Range(Coll & 5).Value = ThisWorkbook.Sheets(1).Range(Coll & ElTo).Value
Else
ThisWorkbook.Sheets(2).Range(Coll & 5).Value = 0
End If

If InStr(1, Range(Coll & 12), "8,") > 0 Then
ThisWorkbook.Sheets(2).Range(Coll & 6).Value = ThisWorkbook.Sheets(1).Range(Coll & Jig).Value
Else
ThisWorkbook.Sheets(2).Range(Coll & 6).Value = 0
End If

If InStr(1, Range(Coll & 12), "9,") > 0 Then
ThisWorkbook.Sheets(2).Range(Coll & 7).Value = ThisWorkbook.Sheets(1).Range(Coll & Teth).Value
Else
ThisWorkbook.Sheets(2).Range(Coll & 7).Value = 0
End If

If InStr(1, Range(Coll & 12), "10,") > 0 Then
ThisWorkbook.Sheets(2).Range(Coll & 8).Value = ThisWorkbook.Sheets(1).Range(Coll & Admin).Value
Else
ThisWorkbook.Sheets(2).Range(Coll & 8).Value = 0
End If

If InStr(1, Range(Coll & 12), "11,") > 0 Then
ThisWorkbook.Sheets(2).Range(Coll & 11).Value = ThisWorkbook.Sheets(1).Range(Coll & Crane).Value
Else
ThisWorkbook.Sheets(2).Range(Coll & 11).Value = 0
End If


ThisWorkbook.Sheets(1).Range(Coll & 13).Value = ThisWorkbook.Sheets(2).Range(Coll & 3).Value + ThisWorkbook.Sheets(2).Range(Coll & 4).Value + ThisWorkbook.Sheets(2).Range(Coll & 5).Value + ThisWorkbook.Sheets(2).Range(Coll & 6).Value + ThisWorkbook.Sheets(2).Range(Coll & 7).Value + ThisWorkbook.Sheets(2).Range(Coll & 8).Value + ThisWorkbook.Sheets(2).Range(Coll & 9).Value

End Sub

Мне нужно сделать это через 20 столбцов и несколько строк, поэтому надеялся, что был другой путь.

Я искал в Интернете и не могу найти что-либо или что-либо, что могу понять (я все еще новичок в VBA).

Ниже приведен пример некоторых данных. В итоге,

Пользователь вводит в некоторые значения некоторых инструментов в строках 5-11. Пользователь может решить, что определенные инструменты могут быть использованы для других элементов (элементов, представленных в столбцах), поэтому он может амортизировать стоимость этих инструментов для всех этих элементов. По первому пункту пользователь решил, что строки 8 и 9 (в строке 12) могут использоваться по элементам 1,2,3,5 (строка 15). Строка 13 принимает значение цен в ячейках B8 и B9 в элементе 1, строки 16 - амортизированное значение, которое является стоимостью строки 2 для каждого ссылочного элемента 1,2,3 + 5. Это выполняется с помощью этого элемента. стоимость, разделенная на (общая стоимость предмета для 1,2,3 + 5) * строка амортизированной стоимости 13.

Надеюсь, что это имеет смысл объяснить немного сложно. enter image description here

1 Ответ

0 голосов
/ 01 мая 2020

Если я правильно вас понимаю, вот две функции, которые вы можете использовать в B13 и B16

Примечание:

  • Поскольку различные статьи затрат не являются При непосредственном упоминании в формуле формула не будет обновляться автоматически при их изменении.
  • Формула будет обновляться при изменении списка строк или списка ячеек элементов
  • Два обходных пути:
    1. Добавить Application.Volatile после операторов объявления каждой функции (это может замедлить вычисления на листе).
    2. Изменить аргументы номера столбца / строки на ссылки на диапазон
Option Explicit

'sRows is the cell (or string) containing the commas separated row numbers
'lItemCol is the column number on which to run this calculation.
'    If omitted, it will default to the column containing the formula

Function toolCostToAmortize(sRows As String, Optional lItemCol As Long = 0) As Currency
    Dim v
    Dim P As Currency

If lItemCol = 0 Then lItemCol = Application.Caller.Column

For Each v In Split(sRows, ",")
    P = P + Cells(v, lItemCol)
Next v

toolCostToAmortize = P
End Function
'======================================
'sItemIDX is the cell containing the comma-separated string to use
'cCostToAmortize is the cell reference containing the toolCostToAmortize result
'lItemRow is optional and is the row containing the list of Items (row 1 in your screenshot)
'    If omitted, it will default to row 1

Function amortizedValue(sItemIDX As String, cCostToAmortize As Currency, Optional lItemRow As Long = 1) As Currency
    Dim v
    Dim P As Currency

For Each v In Split(sItemIDX, ",")
    'Assuming Item List starts in column B
    ' But could use other methods to locate table
    P = P + Cells(lItemRow + 1, v + 1)
Next v

amortizedValue = cCostToAmortize / P * Cells(lItemRow + 1, Application.Caller.Column)

End Function

Они дают ответы, показанные на скриншоте.

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