Member 13399448 Ответов: 2

Ошибка времени выполнения 9, индекс вне диапазона


Привет,
Я нашел старый макрос excel (примерно с 2005 года), но не могу заставить его работать.

Предпосылка кода берет базу данных на листе под названием "top" и еще один лист под названием "bot" и удаляет соответствующие элементы, а остатки объединяет в 3-й лист под названием " new"

Эти базы данных основаны на выходных данных, сгенерированных с рабочей машины, поэтому не имеют традиционного стиля базы данных

Он падает на
temp = sArray(1)


Sub MergeDat()

 Dim countTop As Long
    Dim countBot As Long
    Dim alg As String
    Dim sArray As Variant
    Dim temp As String
    Dim temp2 As String
    Dim count As Long
    Dim count2 As Long
    Dim count3 As Long
    Dim tempcount As Long
    Dim this As Boolean

    countTop = 1
    
    Do While Not Sheets("Top").Cells(countTop, 2).Value = "OCVDatabase"
        If Sheets("Top").Cells(countTop, 1).Value = "USER" Then
            alg = Sheets("Top").Cells(countTop, 2).Value
           
            'Search for this algorithm in the bottom side
            countBot = 1
            Do While (Not Sheets("Bottom").Cells(countBot, 2).Value = alg) And (Not Sheets("Bottom").Cells(countBot, 2).Value = "OCVDatabase")
                countBot = countBot + 1
            Loop
            
            If Sheets("Bottom").Cells(countBot, 2).Value = alg Then
            'Clear the data from the bottom sheet if it already exists in the top one.
                tempcount = countBot
                Do While Not Sheets("Bottom").Cells(tempcount, 1).Value = ""
                    tempcount = tempcount + 1
                Loop
                
                Sheets("Bottom").Select
                Range("A" + CStr(countBot) + ":W" + CStr(tempcount)).Select
                Selection.Clear
            
            'Clear the OCV data
                countBot = 1
                Do While Not Sheets("Bottom").Cells(countBot, 2).Value = "OCVDatabase"
                    countBot = countBot + 1
                Loop
                
                countBot = countBot + 2
                
                Do While Not Sheets("Bottom").Cells(countBot, 2).Value = "Classifiers"
                    sArray = Split(Sheets("Bottom").Cells(countBot, 2).Value, "[")
                    temp = sArray(1)
                    sArray = Split(temp, "]")
                    temp = sArray(0)
                    sArray = Split(temp, "ocv")
                    temp2 = sArray(0)
                    
                    If temp2 = alg Then
                        'erase this line
                        Sheets("Bottom").Rows(countBot).Select
                        Selection.Clear
                        
                        'Seek out the data from the above database
                        count = 1
                        
                        Do While Not Sheets("Bottom").Cells(count, 2).Value = "OCVDatabase"
                            If Sheets("Bottom").Cells(count, 1).Value = "DEVICE" And Sheets("Bottom").Cells(count, 2).Value = temp Then
                                'erase it
                                Sheets("Bottom").Select
                                Range("A" + CStr(count) + ":W" + CStr(count + 26)).Select
                                Selection.Clear
                            End If
                            count = count + 1
                        Loop
                        
                    End If
                    
                    countBot = countBot + 1
                Loop
            End If
        End If
        
        countTop = countTop + 1
    Loop

' Now, compile the new database in the sheet "New," starting with the top of the top database
    countTop = countTop - 1
    Sheets("Top").Select
    Range("A1:W" + CStr(countTop)).Select
    Selection.Copy
    
    Sheets("New").Select
    Range("A1").Select
    ActiveSheet.Paste
    
'Delete all unnecessary entries
    count2 = 1
    Do While count2 < countTop
        If Sheets("New").Cells(count2, 1).Value = "#" Then
            If Sheets("New").Cells(count2 - 1, 1).Value = "" Then
                'delete the section
                count3 = count2
                Do While Not Sheets("New").Cells(count3, 1).Value = ""
                    count3 = count3 + 1
                Loop
                
                Rows(CStr(count2) + ":" + CStr(count3)).Select
                Selection.Delete Shift:=xlUp
    
                countTop = countTop - (count3 - count2) - 1
             End If
        End If
        count2 = count2 + 1
    Loop
    
    
    countTop = countTop + 1
    countBot = 7
    
    this = False
    
    Do While this = False
        'Find the first lot of writing
        Do While Sheets("Bottom").Cells(countBot, 2).Value = ""
            countBot = countBot + 1
        Loop
        
        'Make sure it's a useful part
        Do While Sheets("Bottom").Cells(countBot, 1).Value = "#"
            Do While Not Sheets("Bottom").Cells(countBot, 2).Value = ""
                countBot = countBot + 1
            Loop
            Do While Sheets("Bottom").Cells(countBot, 1).Value = ""
                countBot = countBot + 1
            Loop
        Loop
            
        count = countBot
        
        'Find the end of the writing
        Do While Not Sheets("Bottom").Cells(countBot, 2).Value = ""
            If Sheets("Bottom").Cells(countBot, 2).Value = "Classifiers" Then
                this = True
            End If
            countBot = countBot + 1
        Loop
        
        countBot = countBot
        
        'Paste it in
        Sheets("Bottom").Select
        Range("A" + CStr(count) + ":W" + CStr(countBot)).Select
        Selection.Copy
        
        Sheets("New").Select
        Range("A" + CStr(countTop)).Select
        ActiveSheet.Paste
        
        Do While Not Sheets("New").Cells(countTop, 1).Value = ""
            countTop = countTop + 1
        Loop
        countTop = countTop + 1
        
    Loop

    countBot = countTop
    countTop = 1
    
    Do While Not Sheets("Top").Cells(countTop, 2).Value = "OCVDatabase"
        countTop = countTop + 1
    Loop
    
    count = countTop + 2
    
    Do While Not Sheets("Top").Cells(countTop, 2).Value = "Classifiers"
        countTop = countTop + 1
    Loop
    
    Sheets("Top").Select
    Range("A" + CStr(count) + ":E" + CStr(countTop)).Select
    Selection.Copy
    
    Sheets("New").Select
    Range("A" + CStr(countBot - 2)).Select
    ActiveSheet.Paste
    
    Beep
End Sub


Что я уже пробовал:

Я пробовал везде искать решение, но у меня практически нет понимания VBA, поэтому я не уверен, что даже если я исправлю эту конкретную ошибку, она может перестать работать на следующей строке!

RedDk

Попробуйте пройти через него в консоли VBA. Предполагая практически ... возможно, отсутствует библиотека объектов, которую вы можете добавить туда через браузер объектов. Но Ошибка времени выполнения 9, вероятно, торчит как отсутствующий входной файл или массив или даже диапазон, который не имеет имени.

2 Ответов

Рейтинг:
2

Jochen Arndt

Цитата:
Он падает на
temp = sArray(1)
Тогда массив содержит, вероятно, только один элемент. Посмотрите где sArray устанавливается (предыдущая строка):
sArray = Split(Sheets("Bottom").Cells(countBot, 2).Value, "[")
Это происходит, когда строка, подлежащая разбиению, не содержит символа' ['.

Но как объяснено в решении 1:
У нас нет ваших данных, так что мы не можем помочь дальше.

Все, что я могу предположить, это то, что ваши данные находятся не в ожидаемом формате.


Рейтинг:
0

OriginalGriff

Цитата:
я пробовал везде искать решение, но у меня практически нет понимания VBA, поэтому я не уверен, что даже если я исправлю эту конкретную ошибку, она может перестать работать на следующей строке!

И тут возникает проблема. Мы тоже не можем-и мы даже не можем проверить это, потому что у нас нет доступа к вашим данным.

Подумайте об этом: вы бы попытались починить тормоза на своей машине, если бы не знали, как пользоваться гаечным ключом? А потом вы с удовольствием покатаетесь с женой и детьми по городу? Нет-потому что вы знаете, что вам нужен кто-то, кто знает, что он делает, и это не вы в данный момент! Сначала вам нужно потренироваться на простых вещах: правильная смена колеса - это необходимая предпосылка для работы тормоза,а это значит, что вы должны знать, как правильно поднимать и поддерживать автомобиль, чтобы вас не раздавило насмерть!

Мне очень жаль, но вам нужен кто - то со знанием VBA, чтобы написать код для вас-просто найти старый код и надеяться, что вы сможете "немного поколотить его" и заставить работать, не понимая языка, на котором он написан, просто не является рецептом успеха!
У вас есть три варианта:
1) Изучите VBA и сделайте это сами.
2) заплатите кому-то с нужными навыками и опытом, чтобы он сделал это за вас.
3) найдите какой-то способ сделать это, который вы уже понимаете.