#excel #vba
#excel #vba
Вопрос:
Может кто-нибудь, пожалуйста, помочь мне со следующим. я пытаюсь автоматизировать это, используя формулу в столбце P на основе ccy, записанной в столбце A. например: если ccy = ARS, то формула в столбце P должна быть = 1/24 5, если ccy = BRL, то формула в столбце p должна быть = 1/24 6, а формула должна сохраняться до последнегодоступная строка
должен ли я использовать Do while или Do until ?
Комментарии:
1. Делать до тех пор, пока условие не станет ложным = делать, пока условие не станет истинным.
Ответ №1:
Для каждого следующего решения цикла
Код
Option Explicit
Sub updateByCriteria()
' Define Constants.
Const wsName As String = "Sheet1"
Const FirstRow As Long = 5
Const srcCol As String = "A"
Const tgtCol As String = "P"
Dim Criteria As Variant
Dim Formulas As Variant
Criteria = Array("ARS", "BRL") ' add more...
Formulas = Array("=1/245", "=1/246") ' add more...
' Define Source Column Range.
' Define workbook.
Dim wb As Workbook
Set wb = ThisWorkbook
' Define worksheet.
Dim ws As Worksheet
Set ws = wb.Worksheets(wsName)
' Calculate Last Non-Empty Row.
Dim LastRow As Long
LastRow = ws.Cells(ws.Rows.Count, srcCol).End(xlUp).Row
' Define Source Column Range.
Dim rng As Range
Set rng = ws.Range(ws.Cells(FirstRow, srcCol), ws.Cells(LastRow, srcCol))
' Prepare to write to Target Column Range.
' Calculate Column Offset.
Dim ColOffset As Long
ColOffset = ws.Columns(tgtCol).Column - ws.Columns(srcCol).Column
' Declare variables.
Dim CurPos As Variant ' Current Position
Dim cel As Range ' Current Cell Range
' Write formulas to Target Column Range.
Application.ScreenUpdating = False
' Iterate the cell ranges in Source Range.
For Each cel In rng.Cells
' Check if Current Cell Range in Source Column Range is not empty.
If Not IsEmpty(cel) Then
' Try to find the value in Current Cell Range in Criteria Array
' and write the position to Current Position
CurPos = Application.Match(cel, Criteria, 0)
' Check if value in Current Cell Range has been found
' in Criteria Array.
If Not IsError(CurPos) Then
' Write formula from Formulas Array to current Target Cell
' Range, using Current Position in Criteria Array.
cel.Offset(, ColOffset).Formula = _
Application.Index(Formulas, CurPos)
End If
End If
Next cel
Application.ScreenUpdating = True
' Inform user.
MsgBox "Formulas copied.", vbInformation, "Success"
End Sub
Комментарии:
1. Благодаря VBasic, это сработало только одно, на случай, если я захочу использовать настраиваемые формулы, такие как p5 = K4 L5, P6 = K4 L6, P7 = K4 L7 и так далее для валюты ARS, а для BRL P15 = K14 L15, P16 = K14 L16, P17 = K14 L17 и так далее короче говоря, я настроил формулы для каждого набора валют (далее разделенные на подмножества строк каждого ccy). какие изменения вы бы предпочли в коде.
2. Вместо
=1/245
и=1/246
введите нужные вам формулы. Затем посмотрите, что произошло. Если это работает не так, как ожидалось, и вы не можете понять, что нужно изменить, просто задайте другой вопрос с подробным описанием того, что вы получаете и чего ожидаете. Конечно, включите код.3. Я думаю, вы могли бы использовать что-то вроде
=K$4 L5
иK$14 L15
.4. Да, vbasic, вы правы, я пробовал тот же подход, и он сработал. И последнее, что беспокоит, это то, что есть одна валюта RUB, в которой 6 строк, но мне нужно использовать формулу только для первых 4 строк и оставить последние две строки как есть и перейти на другую валюту. Случайно ли это возможно?
5. любая помощь по вышесказанному?
Ответ №2:
Do while
будет зацикливаться, пока условие истинно, и Do Until
будет зацикливаться до тех пор, пока условие не станет истинным, если вы измените свои условия, оба могут быть выполнены.