2015-04-28 1 views
0

я определил следующий массив:Integer делает обратный массив неверное значение

Global Locations_Array() As String 
ThisWorkbook.Worksheets("Locations").Activate 
TotalRowsLocations = ActiveSheet.UsedRange.Rows.Count 
ReDim Locations_Array(1 To TotalRowsLocations, 1 To 6) As String 

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

Однако теперь я вновь призываю этот массив со следующим кодом:

Sub Get_Lat_Lng() 
    Dim row As Integer 
    Dim data_row As Integer 

    Call Fill_Array_Locations 

    totalrowsdata = ThisWorkbook.Worksheets("Locations").UsedRange.Rows.Count - 1 

    TotalRowsDataLookup = ThisWorkbook.Worksheets(Locations_Array(row, 1)).UsedRange.Rows.Count 

    For row = 2 To totalrowsdata 
     ThisWorkbook.Worksheets(Locations_Array(row, 1)).Activate 
     If (UCase(Locations_Array(row, 5))) = (UCase(ThisWorkbook.ActiveSheet(row, 7))) And (UCase(Locations_Array(row, 6))) = (UCase(Worksheet.ActiveSheet(row, 8))) Then 

      For data_row = 1 To TotalRowsDataLookup 
       If (UCase(Locations_Array(row, 2)) = UCase(ThisWorkbook.Worksheets(Locations_Array(data_row, 1)).Cells(data_row, 5))) Then 
        Cells(data_row, 7) = Locations_Array(row, 5) 
        Cells(data_row, 8) = Locations_Array(row, 6) 
        Exit For 
       End If 
      Next data_row 

      Exit For 
     End If 
    Next row 
End Sub 

И это возвращает «ошибка времени выполнения„9“: Подстрочный из диапазона» Когда я проверяю для значений в эта строка строки кода имеет значение 0 из-за того, что она является целым числом. Есть ли способ заставить это целое число начинаться с 1 вместо 0? Я нашел возможность установить:

Option Base 1 

Но это мешает остальной части моего кода.

+0

Где вы определяете значение 'row'? – stucharo

+0

Я расширил фрагмент кода в OP, чтобы показать, что – Luuklag

+0

. Нет элемента с индексом '0', но вы используете индекс' row', когда его значение равно 0. 'Locations_Array (row, 1)'. Вы должны назначить 'row' 1 или что угодно, если вы используете его в качестве индекса. –

ответ

2

Определение целого числа для Dim row As Integer с присвоением ему значения по умолчанию будет row = 0. Если вы хотите другое значение, вы должны назначить значение, которое вы хотите использовать, прежде чем использовать его.

Try:

Dim row As Integer 
row = 1 

указано лет данные uhave в каждой строке вашего Location_Array до totalrowsdata, то ваш For Loop пересмотрит row = 2 в качестве исходного значения и увеличиваем до totalrowsdata.

Лучший способ понять, какое влияние будет иметь изменение на вашем коде, - попробовать его и посмотреть. Если он не работает, как вы думаете, попробуйте использовать F8 для перехода по каждой строке и проверьте значение row с каждым циклом.

+0

Я расширил фрагмент кода в своем OP далее, чтобы включить всю подпрограмму. Мне лучше разослать все сразу, извините за это. Я не вижу, как это будет происходить с использованием следующей строки в моем цикле. Спасибо за ваш ответ. – Luuklag

0
Sub Get_Lat_Lng() 
    Dim row As Integer 
    Dim data_row As Integer 

    Call Fill_Array_Locations 

    totalrowsdata = ThisWorkbook.Worksheets("Locations").UsedRange.Rows.Count - 1 

    Row = 1 'Row should be at least 1 

    '"Row" should be at least 1 before here. 
    TotalRowsDataLookup = ThisWorkbook.Worksheets(Locations_Array(row, 1)).UsedRange.Rows.Count 

    For row = 2 To totalrowsdata 
     ThisWorkbook.Worksheets(Locations_Array(row, 1)).Activate 
     If (UCase(Locations_Array(row, 5))) = (UCase(ThisWorkbook.ActiveSheet(row, 7))) And (UCase(Locations_Array(row, 6))) = (UCase(Worksheet.ActiveSheet(row, 8))) Then 

      For data_row = 1 To TotalRowsDataLookup 
       If (UCase(Locations_Array(row, 2)) = UCase(ThisWorkbook.Worksheets(Locations_Array(data_row, 1)).Cells(data_row, 5))) Then 
        Cells(data_row, 7) = Locations_Array(row, 5) 
        Cells(data_row, 8) = Locations_Array(row, 6) 
        Exit For 
       End If 
      Next data_row 

      Exit For 
     End If 
    Next row 
End Sub