Функции «next» и «for» не будут работать правильно - PullRequest
0 голосов
/ 03 февраля 2019
Sub Hinnan_korotus_välilehti_makro()
    Dim tulostusrivi As Integer
    Dim lukurivi As Integer
    Dim lukurivi_tausta As Integer
    Dim uusihinta As Double

    Sheets("Nimikkeitä").Select

    For lukurivi = 75 To 400
        If Range("F" & lukurivi) = "Hawle" Then
            nimike = Range("A" & lukurivi)
            Sheets("Taul1").Select

            For tulostusrivi = 2 To 400
                If Range("A" & tulostusrivi) = nimike Then
                    uusihinta = Range("F" & tulostusrivi)
                    Sheets("Nimikkeitä").Select
                    Range("E" & lukurivi) = uusihinta
                End If
            Next tulostusrivi
        End If
    Next lukurivi
End Sub

Привет! У меня проблема с функциями «for» и «next». Последние несколько строк, в которых макрос поместил «uusihinta» в Range «E» & lukurivi.Я хочу вернуться после «End if» к началу «lukurivi» и следующей строке, которая равна 76. Но она продолжает цикл «tulostusrivi» и никогда не переходит к «Next lukurivi».Спасибо!

1 Ответ

0 голосов
/ 04 февраля 2019

Double Loop

Краткий ответ уже был дан в комментариях IAmNerd2000 и Eleshar : Вы пропустили строку Exit For.Ниже приведена оптимизированная, закомментированная версия вашего кода, которая может показаться вам поучительной.

Советы

  • Обычно не используются подчеркивания " _ " взаголовки макросов, но использовать заглавные буквы: HinnanKorotusVälilehti, HinKorVäl или HKV вместо Hinnan_korotus_välilehti.И более короткие заголовки предпочтительны (Makro действительно не требуется в заголовке).
  • Всегда используйте Option Explicit для компилятора, чтобы найти переменные, которые не объявлены (nimike).
  • Начинайте переменные со строчных букв и вводите заглавные буквы для разделения слов, например lukuRivi или tulostusRivi.
  • Длинные против целых чисел
  • Удаление неиспользуемых переменных (lukurivi_tausta).
  • Не добавляйте ненужные переменные, например, НЕ A = B: C = A, а C = B (uusihinta).
  • Не используйте Select или Activate, если в этом нет необходимости, посколькуони замедляют ваш код.
  • Добавьте описания переменных или заголовки для вас (через некоторое время) и других, чтобы лучше понять код.
  • Используйте переменные объекта (ws), чтобы использоватьIntellisense.
  • Используйте оператор With для разделения кодов различных объектов (здесь это не совсем демонстрация).
  • Когда данные (строки) будут добавлены жестко закодированной последней строкой (* 1053)*) всегда нужно менять.Поэтому лучше вычислять его каждый раз, используя свойство End или метод Find.

Код

Option Explicit

Sub HinnanKorotusVälilehti()

    Dim ws As Worksheet       ' Worksheet Variable for worksheet "Taul1"
    Dim lukuRivi As Long      ' Worksheet "Nimikkeitä" Row Counter
    Dim tulostusRivi As Long  ' Worksheet "Taul1" Row Counter
    Dim nimike As String      ' Product Title

    ' Create a reference to worksheet "Taul1" (Everything starting with
    ' "ws." is referring to workhsheet "Taul1").
    Set ws = ThisWorkbook.Worksheets("Taul1")

    ' In Worksheet "Nimikkeitä" (Everything starting with a "." is referring
    ' to worksheet "Nimikkeitä".)
    With ThisWorkbook.Worksheets("Nimikkeitä")
        ' Loop through rows of worksheet "Nimikkeitä".
        For lukuRivi = 75 To 400
            ' Check if the cell at the intersection of the current row
            ' and column "F" contains "Hawle".
            If .Range("F" & lukuRivi) = "Hawle" Then ' IS "Hawle"
                ' Assign the value of the cell at the intersection of the
                ' current row and column "A" to variable "nimike".
                nimike = .Range("A" & lukuRivi)
                ' (In Worksheet Taul1) Loop through rows of Worksheet Taul1.
                For tulostusRivi = 2 To 400
                    ' Check if the cell at the intersection of the current row
                    ' and column "A" contains (the value of) "nimike".
                    If ws.Range("A" & tulostusRivi) = nimike Then ' IS "nimike".
                        ' Write the value of the cell at the intersection of
                        ' the current row (tulostusRivi) and the "F" column
                        ' in worksheet "Taul1" to the cell at the intersection
                        ' of the current row (lukuRivi) and the "E" column in
                        ' worksheet "Nimikkeitä".
                        .Range("E" & lukuRivi) = ws.Range("F" & tulostusRivi)
                        ' Since the value has been found, stop searching and
                        ' go to next row in worksheet "Nimikkeitä".
                        Exit For
                      'Else ' NOT "nimike".
                    End If
                Next ' Next row in worksheet "Taul1" (tulostusRivi).
              'Else  ' NOT "Hawle".
            End If
        Next ' Next row in worksheet "Nimikkeitä" (lukuRivi).
    End With

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