Делать до или делать пока?

#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 будет зацикливаться до тех пор, пока условие не станет истинным, если вы измените свои условия, оба могут быть выполнены.