Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.03.2018, 08:09   #1
Katiy2002
Пользователь
 
Регистрация: 25.11.2015
Сообщений: 11
По умолчанию subscript out of range

Добрый день!
При запуске макроса ругается на строку If x <> MnumberA(k) Then
Где выходит из массива не могу понять

Код:
Public MC As Boolean
Public TMP As Variant
Public Rx As Variant
Public x As Variant
Public y As Variant
Public MnumberA() As Variant
Public nu As Long

'ÎÁÍÎÂËÅÍÈÅ ËÈÑÒÀ "ÐÅÅÑÒÐ ÄÎÑÒÀÂÊÈ"

Public Sub Main()
'Dim dt As Date
'dt = Application.InputBox("Ââåäèòå äàòó:")
MC = True
MANK = RangeCNT("ANK", 1, 1)
For i = 2 To MANK
     If Sheets("ANK").Cells(i, 11).Value = 2 And Sheets("ANK").Cells(i, 13).Value > CDate(Now()) Then 'ïðîâåðêà äàòû
        If FindPos(CStr(Sheets("ANK").Cells(i, 1).Value), "ÐÅÅÑÒÐ ÄÎÑÒÀÂÊÈ", 3, 2) = 0 Then
          If poisk(MnumberA(), i) = True Then 'ïðîâåðêà íàëè÷èÿ çàïèñè â ðååñòðå
          AddANK i, RangeCNT("ÐÅÅÑÒÐ ÄÎÑÒÀÂÊÈ", 3, 1)
          End If
        End If
     End If
Next i
MC = False
MsgBox ("Âûïîëíåíî!")
End Sub

Public Function poisk(MnumberA(), k) As Boolean
'Dim MnumberA()
MANK = RangeCNT("ANK", 1, 1)
With ActiveSheet
  MnumberA() = Range(Sheets("ÐÅÅÑÒÐ ÄÎÑÒÀÂÊÈ").Cells(2, 3), Sheets("ÐÅÅÑÒÐ ÄÎÑÒÀÂÊÈ").Cells(2, Columns.Count).End(xlToLeft)).Value
End With
For s = 2 To MANK
x = CStr(Sheets("ANK").Cells(s, 1).Value)
 For k = 0 To UBound(MnumberA)
    If x <> MnumberA(k) Then
    poisk = True: Exit Function
 Next k
Next s
End Function

Function FindPos(FVal As String, SName As String, FRow As Long, FCol As Long)
For i = 0 To RangeCNT(SName, FRow, FCol)
 If CStr(Sheets(SName).Cells(i + FRow, FCol).Value) = FVal Then
  FindPos = i
  Exit Function
 End If
   FindPos = 0
Next i
End Function

Function RangeCNT(SName As String, FRow As Long, FCol As Long)
 i = 0
 While Sheets(SName).Cells(i + FRow, FCol) <> ""
  i = i + 1
 Wend
 RangeCNT = i + FRow
End Function

Function MaxID(SName As String, FRow, FCol)
 i = 0
 j = 0
 While Sheets(SName).Cells(j + FRow, FCol) <> ""
  If Sheets(SName).Cells(j + FRow, FCol).Value > i Then
   i = Sheets(SName).Cells(j + FRow, FCol).Value
  End If
  j = j + 1
 Wend
 MaxID = i
End Function

Sub AddANK(XRow, TargetX)
  Sheets("ÐÅÅÑÒÐ ÄÎÑÒÀÂÊÈ").Cells(TargetX, 1) = MaxID("ÐÅÅÑÒÐ ÄÎÑÒÀÂÊÈ", 3, 1) + 1
  Sheets("ÐÅÅÑÒÐ ÄÎÑÒÀÂÊÈ").Cells(TargetX, 2) = Sheets("ANK").Cells(XRow, 1)
  Sheets("ÐÅÅÑÒÐ ÄÎÑÒÀÂÊÈ").Cells(TargetX, 3) = Sheets("ANK").Cells(XRow, 2)
  Sheets("ÐÅÅÑÒÐ ÄÎÑÒÀÂÊÈ").Cells(TargetX, 5) = Sheets("Ëèñò1").Range("A2")
  Sheets("ÐÅÅÑÒÐ ÄÎÑÒÀÂÊÈ").Cells(TargetX, 4) = Sheets("ANK").Cells(XRow, 12)
  Sheets("ÐÅÅÑÒÐ ÄÎÑÒÀÂÊÈ").Cells(TargetX, 6) = "Öåíòð äîñòàâêè" 'ÊÊ Ñ ËÏ 120 Ä
  Sheets("ÐÅÅÑÒÐ ÄÎÑÒÀÂÊÈ").Cells(TargetX, 8) = Now()
  Sheets("ÐÅÅÑÒÐ ÄÎÑÒÀÂÊÈ").Cells(TargetX, 9) = Now()
  Sheets("ÐÅÅÑÒÐ ÄÎÑÒÀÂÊÈ").Cells(TargetX, 10) = "ÊÊ Ñ ËÏ 120 Ä"
  Sheets("ÐÅÅÑÒÐ ÄÎÑÒÀÂÊÈ").Cells(TargetX, 11) = Sheets("ANK").Cells(XRow, 3)
  Sheets("ÐÅÅÑÒÐ ÄÎÑÒÀÂÊÈ").Cells(TargetX, 12) = Sheets("ANK").Cells(XRow, 4)
  Sheets("ÐÅÅÑÒÐ ÄÎÑÒÀÂÊÈ").Cells(TargetX, 13) = Sheets("ANK").Cells(XRow, 5)
  Sheets("ÐÅÅÑÒÐ ÄÎÑÒÀÂÊÈ").Cells(TargetX, 15) = Sheets("ANK").Cells(XRow, 8)
  Sheets("ÐÅÅÑÒÐ ÄÎÑÒÀÂÊÈ").Cells(TargetX, 16) = Sheets("ANK").Cells(XRow, 7)
  Sheets("ÐÅÅÑÒÐ ÄÎÑÒÀÂÊÈ").Cells(TargetX, 17) = Sheets("ANK").Cells(XRow, 17)
  Sheets("ÐÅÅÑÒÐ ÄÎÑÒÀÂÊÈ").Cells(TargetX, 21) = Sheets("ANK").Cells(XRow, 16) + ", " + Sheets("ANK").Cells(XRow, 17) + ", " + Sheets("ANK").Cells(XRow, 18) + ", " + Sheets("ANK").Cells(XRow, 19) + ", " + Sheets("ANK").Cells(XRow, 20) + ", " + Sheets("ANK").Cells(XRow, 21)
  Sheets("ÐÅÅÑÒÐ ÄÎÑÒÀÂÊÈ").Cells(TargetX, 22) = Sheets("ANK").Cells(XRow, 13)
  Sheets("ÐÅÅÑÒÐ ÄÎÑÒÀÂÊÈ").Cells(TargetX, 23) = Sheets("ANK").Cells(XRow, 14)
  Sheets("ÐÅÅÑÒÐ ÄÎÑÒÀÂÊÈ").Cells(TargetX, 24) = Sheets("ANK").Cells(XRow, 22)
End Sub
Katiy2002 вне форума Ответить с цитированием
Старый 02.03.2018, 09:37   #2
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

1. Тут аж 2 ошибки:
Код:
For k = 0 To UBound(MnumberA)' - в массиве нет 0-го индекса!
    If x <> MnumberA(k) Then' - массив двумерный!
Используйте окно Locals или Watch!

2. Вот тут явно две строки лишние, ибо не используются:
Код:
With ActiveSheet
  MnumberA() = Range(Sheets("ÐÅÅÑÒÐ ÄÎÑÒÀÂÊÈ").Cells(2, 3), Sheets("ÐÅÅÑÒÐ ÄÎÑÒÀÂÊÈ").Cells(2, Columns.Count).End(xlToLeft)).Value
End With
и можете нарваться на ошибку с числом столбцов.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 02.03.2018, 10:18   #3
Katiy2002
Пользователь
 
Регистрация: 25.11.2015
Сообщений: 11
По умолчанию

MnumberA - массив одномерный, не двумерный
Katiy2002 вне форума Ответить с цитированием
Старый 02.03.2018, 10:31   #4
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Чем докажете?
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 02.03.2018, 11:02   #5
Katiy2002
Пользователь
 
Регистрация: 25.11.2015
Сообщений: 11
По умолчанию

ну допустим, что двумерный, как мне создать одномерный массив с данными из определенного столбца? Да еще так чтобы пустые ячейки пропускались
Katiy2002 вне форума Ответить с цитированием
Старый 02.03.2018, 11:05   #6
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Зачем себя мучить одномерным? Вернее нас
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 02.03.2018, 11:07   #7
Katiy2002
Пользователь
 
Регистрация: 25.11.2015
Сообщений: 11
По умолчанию

мне нужен так)
получается значения этого массива сравниваются со значениями из определенного столбца
Katiy2002 вне форума Ответить с цитированием
Старый 02.03.2018, 11:09   #8
Katiy2002
Пользователь
 
Регистрация: 25.11.2015
Сообщений: 11
По умолчанию

код собственно говоря на это сравнение и ругается
Katiy2002 вне форума Ответить с цитированием
Старый 02.03.2018, 11:21   #9
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Ну тогда ответ на последний вопрос - подсчитать занятые, создать массив, в цикле наполнить.
Или взять как есть в двумерный, транспонированием преобразовать в одномерный (application.transpose(arr)), переложить заполненные в другой.
Или циклом собрать всё нужное в коллекцию, создать массив, переложить.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 02.03.2018, 11:28   #10
Katiy2002
Пользователь
 
Регистрация: 25.11.2015
Сообщений: 11
По умолчанию

а как код будет выглядеть? понимание есть, а как сделать то
Katiy2002 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка Subscript out of range ольгаг Microsoft Office Excel 5 01.10.2017 11:06
subscript out of range Bape}l{ka Microsoft Office Excel 2 31.10.2011 12:54
Subscript out of range amator_roma Помощь студентам 1 04.07.2011 11:32
Динамический массив - Subscript out of range Zeraim Microsoft Office Excel 2 29.11.2010 16:28
ReDim и Subscript out of range (Error 9) oldfatham Microsoft Office Excel 5 24.08.2009 18:32