Как сделать переменную внутри цикла For Loop глобальной или доступной внутри sub или другого sub / form? - PullRequest
0 голосов
/ 19 октября 2018

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

У меня есть файл Excel, в котором есть список номеров файлов, с которыми я буду работать позже в своем коде для поиска PDF-файлов в каталоге.Мой код работает нормально, но мой код заполнен циклами, вложенными циклами, и все всегда должно быть внутри этих циклов, потому что именно там объявлены переменные.Пример в этом коде ниже:

Imports Microsoft.Office.Interop.Excel
Imports Microsoft.Office.Interop
Module Module1
    Dim aCell As Object = Nothing
    Dim eachcell As New List(Of String)

    Sub Main()

        Dim xlApp As Excel.Application
        Dim xlWorkBook As Excel.Workbook
        Dim xlWorkSheet As Excel.Worksheet
        Dim range As Excel.Range
        Dim aCpage = "unknown"
        xlApp = New Excel.Application
        xlWorkBook = xlApp.Workbooks.Open("C:\Users\XBorja.RESURGENCE\Desktop\xavier.xlsx")
        xlWorkSheet = xlWorkBook.Worksheets("sheet1")
        range = xlWorkSheet.UsedRange.SpecialCells(XlCellType.xlCellTypeConstants)
        Dim currentcell = Nothing


        For Each i In range.Value



            eachcell.Add(i)
        Next

        For Each aCell In eachcell
            currentcell = aCell.ToString
            Console.WriteLine(currentcell)
        Next

    End Sub

Это прекрасно работает, на консоли он показывает список всех номеров файлов, которые я написал в своем листе Excel:

ZTEST01.SMITH
ZTEST14.SAMPLE05
ZTEST02.RESTAURANT
ZTEST12.SAMPLE03
ZTEST03.MCDONALD
ZTEST04.DOE
ZTEST10.SAMPLE01
ZTEST13.SAMPLE04
ZTEST11.SAMPLE02
Press any key To Continue . . 

, но если яиспользуйте этот код:

    For Each i In range.Value

        eachcell.Add(i)
    Next

    For Each aCell In eachcell
        currentcell = aCell.ToString

    Next
    Console.WriteLine(currentcell)
End Sub

Это только говорит мне о последнем значении

ZTEST.11.SAMPLE02

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

Мой вопрос: как бы я мог вызвать весь этот список / массив вне для цикла for?

Я знаю, с помощью + = вы можете добавить целые числа, чтобы получить сумму в цикле for, и я попробовал это с помощью этого кода, и он просто вернул мне все объединенные номера файлов.

Может ли цикл for бытьпревратился в другую подпрограмму, поэтому я могу назвать эту переменную "currentcell" вне цикла?Или это можно превратить в функцию, чтобы вся моя подпрограмма всегда могла использовать эту переменную?

1 Ответ

0 голосов
/ 19 октября 2018

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

если вы ищете конкретный элемент, вам нужно сохранить его тоже в своем собственном значении, код, который выперезаписывает все, что вы нашли в последней итерации, поэтому currentcell имеет только самое последнее значение

Dim found As Sting
For each cell in eachCell
    If [condition] Then
        found = cell.ToString()
        Exit For
    End If
Next
If Not found is Nothing Then
    'Congrats you found it
Else
    'Too bad, not in list
End If

Если вы хотите сделать что-то с более чем одним элементом, вам нужно сделать это что-то вцикл или передать элемент в качестве параметра отдельной функции

Sub Main()
    Dim myArray As List(Of String);
    myArray = [get your array of elements]

    For Each item As String In myArray
        DoThing(item)
    Next

End Sub

Sub DoThing(value As String)
    Console.WriteLine(value)
End Sub

, надеюсь, это поможет вам

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