powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Array (выдает неправильные по номеру элементы)
13 сообщений из 13, страница 1 из 1
Array (выдает неправильные по номеру элементы)
    #39459590
maxim863
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Программа должна находить определенные ячейки и вставлять со смещением данные из других книг .Ошибок не выскакивает , и в начале работает нормально , но затем там где например должно быть F(t)=7 ,берется F(t)=6 .
Не могу найти ошибку . Может это как то связано с (Вызов функции Array без параметров приведёт к возврату массива нулевой длинны. При этом будет наблюдаться интересный эффект LBound вернёт вам 0, а UBound вернёт -1, то есть верхняя граница окажется меньше нижней границы.) ?
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
 Sub связатьцифирь10()
 Dim book1 As Workbook
 Dim book2 As Workbook
 Dim r As Range
 Dim firstAddress As String
 Dim n, m, e, t As Long
 Dim A
 Dim B
 Dim D
 Dim F
 Dim G As String
 Dim H As String
 
 'сезон (прошлый,допрошлый,додопрошлый)
 A = Array("прошлый", "допрошлый", "додопрошлый")
 'страна
 D = Array("Англия", "Испания", "Италия", "Германия", "Голландия", "Франция", "Португалия", "Россия", "Украина")
  'место (1,2,3,4,5,6)
 B = Array("1", "2", "3", "4", "5", "6")
 'номер условия
 F = Array("6", "7", "8", "16", "17", "21", "22", "23", "25", "26", "29", "30", "31", "54", "55", "56", "57", "58", "59")
 'Общ п/пр
 G = "AP100"
 'Общ
 H = "AO100"
 
 Set book1 = Workbooks.Open("E:\Super M\Проект ставки\Решение\цифирь.xlsx")
 
 'переходим в активную страницу откуда надо скопировать данные'
  'массив условие
  For t = 0 To 18
  'массив сезон
  For n = 0 To 2
  'массив страна
  For m = 0 To 8
  'массив место
 For e = 0 To 5
 
  
  'пропускаем ошибку
 On Error Resume Next
 Set book2 = Workbooks.Open("E:\Super M\Проект ставки\Поиск решения\Усов 4\БАЗА ДАННЫХ\" + A(n) + " сезон\" + D(m) + "\" + B(e) + "-ое место\" + F(t) + ".xlsx")
 'ищемс
  With book1.Worksheets("Лист1").Range("A1:CV808")
          
        Set r = .Find(What:="" + F(t) + "")
        If Not r Is Nothing Then
            firstAddress = r.Address
            Do
             'условие для страны
             'прошлый сезон
             If r.Offset(3, 0).Text = D(m) And A(n) = "прошлый" Then
                If B(e) = "1" Then
                book2.Worksheets("" + F(t) + "").Range("" + G + "").Copy
                r.Offset(6, 5).PasteSpecial xlPasteValues
                'копируем вторую ячейку
                book2.Worksheets("" + F(t) + "").Range("" + H + "").Copy
                r.Offset(6, 6).PasteSpecial xlPasteValues
                End If
                
                If B(e) = "2" Then
                book2.Worksheets("" + F(t) + "").Range("" + G + "").Copy
                r.Offset(7, 5).PasteSpecial xlPasteValues
                 'копируем вторую ячейку
                book2.Worksheets("" + F(t) + "").Range("" + H + "").Copy
                r.Offset(7, 6).PasteSpecial xlPasteValues
                End If
                
                 If B(e) = "3" Then
                book2.Worksheets("" + F(t) + "").Range("" + G + "").Copy
                r.Offset(8, 5).PasteSpecial xlPasteValues
                 'копируем вторую ячейку
                book2.Worksheets("" + F(t) + "").Range("" + H + "").Copy
                r.Offset(8, 6).PasteSpecial xlPasteValues
                End If
                
                If B(e) = "4" Then
                book2.Worksheets("" + F(t) + "").Range("" + G + "").Copy
                r.Offset(9, 5).PasteSpecial xlPasteValues
                 'копируем вторую ячейку
                book2.Worksheets("" + F(t) + "").Range("" + H + "").Copy
                r.Offset(9, 6).PasteSpecial xlPasteValues
                End If
                
                If B(e) = "5" Then
                book2.Worksheets("" + F(t) + "").Range("" + G + "").Copy
                r.Offset(10, 5).PasteSpecial xlPasteValues
                 'копируем вторую ячейку
                book2.Worksheets("" + F(t) + "").Range("" + H + "").Copy
                r.Offset(10, 6).PasteSpecial xlPasteValues
                End If
                
                 If B(e) = "6" Then
                book2.Worksheets("" + F(t) + "").Range("" + G + "").Copy
                r.Offset(11, 5).PasteSpecial xlPasteValues
                 'копируем вторую ячейку
                book2.Worksheets("" + F(t) + "").Range("" + H + "").Copy
                r.Offset(11, 6).PasteSpecial xlPasteValues
                End If
             End If
             
             'допрошлый сезон
             If r.Offset(3, 0).Text = D(m) And A(n) = "допрошлый" Then
                 If B(e) = "1" Then
                book2.Worksheets("" + F(t) + "").Range("" + G + "").Copy
                r.Offset(6, 3).PasteSpecial xlPasteValues
                 'копируем вторую ячейку
                book2.Worksheets("" + F(t) + "").Range("" + H + "").Copy
                r.Offset(6, 4).PasteSpecial xlPasteValues
                End If
                
                If B(e) = "2" Then
                book2.Worksheets("" + F(t) + "").Range("" + G + "").Copy
                r.Offset(7, 3).PasteSpecial xlPasteValues
                 'копируем вторую ячейку
                book2.Worksheets("" + F(t) + "").Range("" + H + "").Copy
                r.Offset(7, 4).PasteSpecial xlPasteValues
                End If
                
                 If B(e) = "3" Then
                book2.Worksheets("" + F(t) + "").Range("" + G + "").Copy
                r.Offset(8, 3).PasteSpecial xlPasteValues
                'копируем вторую ячейку
                book2.Worksheets("" + F(t) + "").Range("" + H + "").Copy
                r.Offset(8, 4).PasteSpecial xlPasteValues
                End If
                
                If B(e) = "4" Then
                book2.Worksheets("" + F(t) + "").Range("" + G + "").Copy
                r.Offset(9, 3).PasteSpecial xlPasteValues
                'копируем вторую ячейку
                book2.Worksheets("" + F(t) + "").Range("" + H + "").Copy
                r.Offset(9, 4).PasteSpecial xlPasteValues
                End If
                
                If B(e) = "5" Then
                book2.Worksheets("" + F(t) + "").Range("" + G + "").Copy
                r.Offset(10, 3).PasteSpecial xlPasteValues
                'копируем вторую ячейку
                book2.Worksheets("" + F(t) + "").Range("" + H + "").Copy
                r.Offset(10, 4).PasteSpecial xlPasteValues
                End If
                
                 If B(e) = "6" Then
                book2.Worksheets("" + F(t) + "").Range("" + G + "").Copy
                r.Offset(11, 3).PasteSpecial xlPasteValues
                'копируем вторую ячейку
                book2.Worksheets("" + F(t) + "").Range("" + H + "").Copy
                r.Offset(11, 4).PasteSpecial xlPasteValues
                End If
             End If
             'додопрошлый сезон
             If r.Offset(3, 0).Text = D(m) And A(n) = "додопрошлый" Then
                If B(e) = "1" Then
                book2.Worksheets("" + F(t) + "").Range("" + G + "").Copy
                r.Offset(6, 1).PasteSpecial xlPasteValues
                'копируем вторую ячейку
                book2.Worksheets("" + F(t) + "").Range("" + H + "").Copy
                r.Offset(6, 2).PasteSpecial xlPasteValues
                End If
                
                If B(e) = "2" Then
                book2.Worksheets("" + F(t) + "").Range("" + G + "").Copy
                r.Offset(7, 1).PasteSpecial xlPasteValues
                'копируем вторую ячейку
                book2.Worksheets("" + F(t) + "").Range("" + H + "").Copy
                r.Offset(7, 2).PasteSpecial xlPasteValues
                End If
                
                 If B(e) = "3" Then
                book2.Worksheets("" + F(t) + "").Range("" + G + "").Copy
                r.Offset(8, 1).PasteSpecial xlPasteValues
                'копируем вторую ячейку
                book2.Worksheets("" + F(t) + "").Range("" + H + "").Copy
                r.Offset(8, 2).PasteSpecial xlPasteValues
                End If
                
                If B(e) = "4" Then
                book2.Worksheets("" + F(t) + "").Range("" + G + "").Copy
                r.Offset(9, 1).PasteSpecial xlPasteValues
                'копируем вторую ячейку
                book2.Worksheets("" + F(t) + "").Range("" + H + "").Copy
                r.Offset(9, 2).PasteSpecial xlPasteValues
                End If
                
                If B(e) = "5" Then
                book2.Worksheets("" + F(t) + "").Range("" + G + "").Copy
                r.Offset(10, 1).PasteSpecial xlPasteValues
                'копируем вторую ячейку
                book2.Worksheets("" + F(t) + "").Range("" + H + "").Copy
                r.Offset(10, 2).PasteSpecial xlPasteValues
                End If
                
                 If B(e) = "6" Then
                book2.Worksheets("" + F(t) + "").Range("" + G + "").Copy
                r.Offset(11, 1).PasteSpecial xlPasteValues
                'копируем вторую ячейку
                book2.Worksheets("" + F(t) + "").Range("" + H + "").Copy
                r.Offset(11, 2).PasteSpecial xlPasteValues
                End If
             End If
             
            Set r = .FindNext(r)
             
            Loop While Not r Is Nothing And r.Address <> firstAddress
        End If
    End With
    book2.Close
    Next e
    book1.Save
    Next m
    Next n
    Next t
    book1.Save
    book1.Close
   End Sub
...
Рейтинг: 0 / 0
Array (выдает неправильные по номеру элементы)
    #39459603
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maxim863там где например должно быть F(t)=7 ,берется F(t)=6 .
Ага, а теперь в этой портянке нам предлагается найти то место, где сие происходит?

И что это вот за дикость:
Код: vbnet
1.
book2.Worksheets("" + F(t) + "")

Идиосинкразия на функцию CStr()?
...
Рейтинг: 0 / 0
Array (выдает неправильные по номеру элементы)
    #39459619
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Модератор: Поправил тип кода в src - впредь прошу указывать правильный.
FAQ
...
Рейтинг: 0 / 0
Array (выдает неправильные по номеру элементы)
    #39459624
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ааа... тип элементов массива - строковый... ну тогда, значит, идиосинкразия на конкатенацию.
...
Рейтинг: 0 / 0
Array (выдает неправильные по номеру элементы)
    #39459632
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maxim863

Попробуйте
1) дать вменяемые названия переменным и корректно указать всем их типы (в том числе прочитайте про правильный синтаксис оператора Dim)
2) откажитесь от использования Copy и Paste - можно просто присваивать значение ячейкам Range(...).Value
3) вместо повторяющейся копипасты кода сделайте цикл

Программа будет раз в десять короче, понятнее, ошибку в ней можно будет найти гораздо легче (если сама не пройдет из-за того, что вы при копипасте не исправили какое-то значение)

А так вашу простыню кода, с учетом того, что нет ни исходных файлов, ни внятного описания того, что вы хотели этим алгоритмом сказать, никто изучать не будет.
...
Рейтинг: 0 / 0
Array (выдает неправильные по номеру элементы)
    #39459635
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maxim863Может это как то связано с (Вызов функции Array без параметров приведёт к возврату массива нулевой длинны.С учетом того, что вы не вызываете эту функцию без параметров, какой смысл вашего вопроса?
...
Рейтинг: 0 / 0
Array (выдает неправильные по номеру элементы)
    #39460083
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maxim863,
первая ошибка :
Код: vbnet
1.
2.
'пропускаем ошибку
 On Error Resume Next



и вторая - проверьте опцию
Код: vbnet
1.
Option Base 0
...
Рейтинг: 0 / 0
Array (выдает неправильные по номеру элементы)
    #39460992
Фотография i45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maxim863,

Там столько If не нужно. Сравните насколько короче фрагмент с условиями "прошлый - додопрошлый":

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Dim intBe As Integer
Dim varValue1 As Variant
Dim varValue2 As Variant

intBe = CInt(B(e)) + 5
varValue1 = book2.Worksheets("" + F(t) + "").Range("" + G + "").Value
varValue2 = book2.Worksheets("" + F(t) + "").Range("" + H + "").Value

'условие для страны прошлый сезон
If r.Offset(3, 0).Text = D(m) And a(n) = "прошлый" Then
   r.Offset(intBe, 4).Value = varValue1 
   r.Offset(intBe, 5).Value = varValue2
End If

'додопрошлый сезон
If r.Offset(3, 0).Text = D(m) And a(n) = "допрошлый" Then
   r.Offset(intBe, 3).Value = varValue1 
   r.Offset(intBe, 4).Value = varValue2 
End If



Подумайте, как дальше улучшить.
...
Рейтинг: 0 / 0
Array (выдает неправильные по номеру элементы)
    #39461583
maxim863
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
i45,
выдает тот же результат (мне кажется , что ошибка как то связана с функцией Array , но конкретно в чем дело , пока понять не могу)
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
 
 Sub связатьцифирь12()
 Dim book1 As Workbook
 Dim book2 As Workbook
 Dim r As Range
 Dim firstAddress As String
 Dim n, m, e, t As Long
 Dim A
 Dim B
 Dim D
 Dim F
 Dim G As String
 Dim H As String
 Dim intBe As Integer
 Dim varValue1 As Variant
 Dim varValue2 As Variant
 
 
 
 'сезон (прошлый,допрошлый,додопрошлый)
 A = Array("прошлый", "допрошлый", "додопрошлый")
 'страна
 D = Array("Англия", "Испания", "Италия", "Германия", "Голландия", "Франция", "Португалия", "Россия", "Украина")
  'место (1,2,3,4,5,6)
 B = Array("1", "2", "3", "4", "5", "6")
 'номер условия
 F = Array("6", "7", "8", "16", "17", "21", "22", "23", "25", "26", "29", "30", "31", "54", "55", "56", "57", "58", "59")
 'Общ п/пр
 G = "AP100"
 'Общ
 H = "AO100"
 
 Set book1 = Workbooks.Open("E:\Super M\Проект ставки\Решение\цифирь.xlsx")
 
 'переходим в активную страницу откуда надо скопировать данные'
  'массив условие
  For t = 0 To 18
  'массив сезон
  For n = 0 To 2
  'массив страна
  For m = 0 To 8
  'массив место
 For e = 0 To 5
 
  
  'пропускаем ошибку
 On Error Resume Next
 Set book2 = Workbooks.Open("E:\Super M\Проект ставки\Поиск решения\Усов 4\БАЗА ДАННЫХ\" + A(n) + " сезон\" + D(m) + "\" + B(e) + "-ое место\" + F(t) + ".xlsx")
 
 intBe = CInt(B(e)) + 5
 varValue1 = book2.Worksheets("" + F(t) + "").Range("" + G + "").Value
 varValue2 = book2.Worksheets("" + F(t) + "").Range("" + H + "").Value
 'ищемс
  With book1.Worksheets("Лист1").Range("A1:CV808")
          
        Set r = .Find(What:="" + F(t) + "")
        If Not r Is Nothing Then
            firstAddress = r.Address
            Do
             'условие для страны
             'прошлый сезон
             If r.Offset(3, 0).Text = D(m) And A(n) = "прошлый" Then
             r.Offset(intBe, 5).Value = varValue1
             r.Offset(intBe, 6).Value = varValue2
             End If
             'допрошлый сезон
            If r.Offset(3, 0).Text = D(m) And A(n) = "допрошлый" Then
            r.Offset(intBe, 3).Value = varValue1
            r.Offset(intBe, 4).Value = varValue2
            End If
             'додопрошлый сезон
             If r.Offset(3, 0).Text = D(m) And A(n) = "додопрошлый" Then
            r.Offset(intBe, 1).Value = varValue1
            r.Offset(intBe, 2).Value = varValue2
            End If
            
            Set r = .FindNext(r)
             
            Loop While Not r Is Nothing And r.Address <> firstAddress
        End If
    End With
    book2.Close
    Next e
    book1.Save
    Next m
    Next n
    Next t
    book1.Save
    book1.Close
   End Sub 
...
Рейтинг: 0 / 0
Array (выдает неправильные по номеру элементы)
    #39461708
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maxim863выдает тот же результатmaxim863.Ошибок не выскакиваетHandKotпервая ошибка :
Код: vbnet
1.
2.
'пропускаем ошибку
 On Error Resume Next
...
Рейтинг: 0 / 0
Array (выдает неправильные по номеру элементы)
    #39461979
maxim863
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,
'пропускаем ошибку
On Error Resume Next
Это специально написано , что бы пропускать ошибку ,которая выскакивает при открытии книг ,которых не существует .
...
Рейтинг: 0 / 0
Array (выдает неправильные по номеру элементы)
    #39461990
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) Если книги не существует, зачем выполнять весь остальной код, который следует за открытием книги?
Посмотрите примеры, как правильно использовать конструкцию On Error.

2) Даже если книга существует, вы игнорируете ВСЕ ошибки дальнейшего кода.

В третий раз вам совет - уберите On Error Resume Next
Потом, когда отладите программу, поставите On Error Goto только там, где реально требуется.
...
Рейтинг: 0 / 0
Array (выдает неправильные по номеру элементы)
    #39465727
maxim863
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Понял в чем дело : надо было точнее задать Find
Код: vbnet
1.
Set r = .Find(What:="" & F(t) & "", LookAt:=xlWhole, LookIn:=xlValues)


Теперь работает нормально .
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Array (выдает неправильные по номеру элементы)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]