2014-12-17 3 views
0

Я искал решение и пробовал много вариантов, но ничего не работает.Ошибка времени выполнения '1004': Определенная пользователем или объектная ошибка VBA

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

У меня возникли проблемы с помощью следующей строки:

count = Application.WorksheetFunction.CountIf(Range(Cells(4, c), Cells(14, c)), Workbooks("Testing").Worksheets("Barrel MASTER").Range(BarrelSheet.Cells(r, "A"))) 

Я все переменные, определенные как лучше, как я знаю, как. Когда в режиме отладки и зависает над последним диапазоном в приведенной выше строке, я получаю желаемый результат. Вышеуказанная строка работала без переменной строки в BarrelSheet.Cells(r, "A"). Он работал, когда это были ячейки («A15»).

Это остальная часть кода:

Sub Item_Location() 
 

 
Dim c As Integer 'Counter to cycle through columns in cage inventory 
 
Dim r As Integer 'Counter to cycle through Rows on MASTER sheets 
 
Dim Finalcolumn As Integer 
 
Dim ItemNum As Integer 
 
Dim count As Integer 
 
Dim multi As Integer 'Is there a repeat code in the same cage 
 
Dim multioverall As Integer 'Is there a repeat code within 2 different cages 
 
Dim ItemCode As String 
 

 
Dim BarrelMasterB As Workbook 
 
Dim BarrelSheet As Worksheet 
 
Dim CodeCage As Worksheet 
 

 
Set BarrelMasterB = Workbooks("Testing") 
 
Set BarrelSheet = Workbooks("Testing").Worksheets("Barrel MASTER") 
 

 
'Application.ScreenUpdating = False 
 

 
'MsgBox ("This may take some time. When completed you will be prompted") 
 

 
For r = 15 To 18 
 
Workbooks("Testing").Activate 
 
'ItemCode = Workbooks("Testing").Worksheets("Barrel MASTER").Range(BarrelSheet.Cells(r, "A")).Value 
 

 
Finalcolumn = Range("L1").Column 
 

 
ItemNum = Workbooks("Testing").Sheets(1).Range("B1000").End(xlUp).Row 
 

 
multioverall = 0 
 

 
'------------ Start of Searching for 1 Item code and 1 Cage ------------- 
 

 
multi = 0   'Resets to 0 for different cage 
 
Workbooks.Open ("C:\Users\me\Desktop\Camp Spider Web\Inventory\Cage Inventory\Cage 1.xlsm")   'Opens Cage file to search for specified Code 
 
Set CodeCage = Workbooks("Cage 1").Worksheets("Cage Inventory Coded") 
 

 
For c = 5 To Finalcolumn 
 
    count = Application.WorksheetFunction.CountIf(Range(Cells(4, c), Cells(14, c)), Workbooks("Testing").Worksheets("Barrel MASTER").Range(BarrelSheet.Cells(r, "A")))   'Counts how many 
 

 
    If count = 1 And multi = 1 Then   'If there was a double code in the same item row 
 
     MsgBox ("Repeated Code. Check Item Codes on Cage Inventory") 
 
     c = 12   'Ending the search 
 
    ElseIf count = 1 Then 
 
     Workbooks("Testing").Worksheets("Barrel MASTER").Range(Cells(r, "E")) = Workbooks("Cage 1").Worksheets("Cage Inventory Coded").Range("M4")   'returning cage # 
 
     multi = multi + 1  'Keep track of how many codes have been found 
 
     multioverall = multioverall + 1 
 
     If multioverall = 2 Then 
 
      MsgBox ("There as been a second Item code found in Cage 1") 
 
      GoTo Reset 
 
     End If 
 
    ElseIf count > 1 Then  'if there is a double item code in the same column 
 
     MsgBox ("Repeated Code. Check Item Codes on Cage 1 Inventory") 
 
     c = 12   'Ending the search for next column 
 
    End If 
 
Next c 
 

 
Workbooks("Cage 1").Close SaveChanges:=True   'Saves and closes above cage 
 

 
'-------- Start of Searching for 1 Item code and 1 Cage ------------ 
 

 
Next r 
 

 
'Application.ScreenUpdating = True 
 

 
'MsgBox ("Now Complete") 
 
End Sub

Некоторые из линий имеют "впереди, просто так, что, когда я тестирую его, он не бежит все , Могут также быть некоторые переменные, которые определены, которые я не использую. Это потому, что я много пробовал, и после этого я их удалю. Некоторые могут быть использованы позднее.

Код будет запущен, пока рабочая книга Barrel Master активна, но открывается рабочая тетрадь 1, которая активирует ее. Секция поиска (код между -----) будет скопирована 32 раза, так как будет 32 разных книги информации, все в том же формате, что и для поиска. Спасибо заранее! Приветствия

ответ

0

Попробуйте это:

count = Application.WorksheetFunction.CountIf(Range(Cells(4, c), Cells(14, c)), _ 
               BarrelSheet.Cells(r, "A").Value) 

хотя вы действительно должны квалифицировать каждое использование Range() или Cells() с определенным рабочим листом, в противном случае вы полагаетесь на конкретных рабочих листы, являющихся активными в определенные моменты времени, что может привести к большим проблем с отладкой.

+0

спасибо. Это боль, которая не знает точно, что делать, поскольку я новичок в этом. Кажется, это имеет смысл, поскольку это не диапазон, и я использовал его, чтобы вернуть ценность. Есть ли другой момент, когда вы будете использовать .range, когда у вас есть только одна ссылка на ячейку? Снова Спасибо, что так много до сих пор это сделало трюк. – Walkintall

+0

Обычно, если у вас уже есть переменная диапазона, вам не нужно обертывать ее в 'Range()', если вы не делаете что-то вроде «Range (topLeftCell, bottomRightCell)», чтобы получить прямоугольный диапазон. Чаще всего, когда вы используете 'Range()' для оценки строки, чтобы вернуть диапазон, например 'Range (" A1 ")', 'Range (" E10: F20 ")' или 'Range (Range (Range) A1 "). Значение)' (где A1 может содержать, например, «F40») –

+0

Удивительное идеальное объяснение. Большое вам спасибо за вашу помощь. Я действительно ценю это, так как мой опыт VBA - это самообучение из Интернета и форумов. Все спасибо вам и другим, как вы. ура – Walkintall

Смежные вопросы

 Смежные вопросы