2016-07-06 3 views
0

Извините, вопрос не указан. Я попытался использовать Set, чтобы помочь мне заполнить таблицу контроля качества, но появляется ошибка 10o4. Это кажется правильным для меня, и поэтому я не знаю, как его исправить. Поэтому, пожалуйста, взгляните на это, и оставьте комментарий, если у вас есть идея. Спасибо!Использование Set, но ошибка «Определенная приложением или объектная ошибка» отображается

Private Sub FillTarget(ByVal TargetSheet As String, ByVal DepositSheet As String, _ 
     ByVal TargetRow As Integer, ByVal TargetColumn As String, _ 
     ByVal DepositRow As Integer, ByVal DepositColumn As Integer) 

Dim i, j, k As Integer 
Dim OpenedFile As String 
Dim myObject As String 

Dim MarkRow As Integer 
MarkRow = 1 
Dim myData As String 
Dim EndSearch As Boolean 

Dim TargetCell As Range 
Dim TargetTag As Range 
Dim TargetType As Range 
Dim TargetZone As Range 
Dim TargetTest As Range 

Dim DepositTag As Range 
Dim DepositZone As Range 
Dim DepositResult As Range 

For i = 3 To TargetRow 
    With Worksheets(TargetSheet) 
     myObject = .Cells(i, 15).Text + "_" + Worksheets(TargetSheet).Cells(i, 17).Text 
     Set TargetCell = .Cells(i, TargetColumn) <==== Here comes the error 
     Set TargetTag = .Cells(i, 15) 
     Set TargetType = .Cells(i, 17) 
     Set TargetZone = .Cells(i, 18) 
     Set TargetTest = .Cells(i, 20) 
    End With 

    For j = MarkRow To DepositRow 
     With Worksheets(DepositSheet) 
      Set DepositTag = .Cells(j, 1) 
      Set DepositZone = .Cells(j, 2) 
     End With 

     If InStr(DepositTag.Text, myObject) <> 0 Then 
      OpenedFile = OpenedFile & DepositTag.Text & "|" 

      If InStr(DepositZone.Text, TargetZone.Text + ":") <> 0 _ 
       Or InStr(TargetZone.Text, "/") <> 0 Then 

       For k = 2 To DepositColumn 
        With Worksheets(DepositSheet) 
         Set DepositResult = .Cells(j, k) 
        End With 

        If InStr(DepositResult.Text, TargetTest.Text) <> 0 Then 
         MarkRow = j 
         myData = DepositResult.Text 
         'Split_monData 
         'Derniere_Colonne 
         TargetCell.Value = myData 
         EndSearch = True 
         Exit For 
        End If 

       Next k 

      End If 

     End If 

     If EndSearch Then Exit For 
    Next j 

    EndSearch = False 
Next i 
End Sub 
+3

только FYI, ваш код можно сократить на тонну, разместив свой «Dim» s в одной строке. Вместо 'Dim range1 As Range' новой строки' Dim range2 As Range', все они могут быть записаны как «Dim range1 As Range, range2 As Range». Важно отметить, что вы должны всегда включать 'As Range' (или что бы то ни было объект), или эта конкретная переменная будет автоматически объявлена ​​как Variant – RGA

+1

Чтобы закончить комментарий @ RGA, вы должны написать' Option Explicit' над вашим ' Sub', поэтому вам всегда нужно объявлять переменные. Кроме того, будьте осторожны, когда объявляете 'Dim i, j, k As Integer' только' k' объявляется как integer, i и j будут как 'Variant' вам нужно написать' Dim i As Integer, j As Integer, k As Integer' –

+0

Приятно познакомиться с вами @ Rémi! А для «Option Exolicit» вы могли бы объяснить немного? Я не знаю, почему и как его использовать. – Hiddenllyy

ответ

1

Значение по умолчанию для Cells() - это значение ячейки. Передайте его как диапазон для определения переменной объекта Range.

Везде, где у вас есть диапазон переменной, равное .Cells(something), изменить его .Range(.Cells(something).Address) и он должен работать, как предполагалось

Кроме того, TargetColumn объявлен в виде строки, а не числовое значение. Если строковое значение не имеет имени столбца (т.е. «A» или «B»), это приведет к ошибке. Либо передайте переменную числовому значению с помощью Cdbl() CInt() или Clng(), либо объявите переменную с числовым типом с начала

+0

Спасибо, но это не сработало. Я изменил '.Cells (i, j)' на '.Range (Ячейки (i, j) .Address)', но все же я встретил ошибку 1004. – Hiddenllyy

+0

@Hiddenllyy Я вижу, теперь это может быть связано с "TargetColumn ", который передается как строка. Является ли это строковое значение буквой верхнего регистра, представляющей определенный столбец? – RGA

+1

@RGA - это правильно. 'TargetColumn' объявляется как String, поэтому, если его значения должны быть' 1', вы получите '' 1 "'. Вы должны объявить его как числовую переменную (integer, Long и т. Д.) Или как диапазон и добавить «.Column» сразу после. –