Гость
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Array (выдает неправильные по номеру элементы) / 13 сообщений из 13, страница 1 из 1
25.05.2017, 13:22
    #39459590
maxim863
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Array (выдает неправильные по номеру элементы)
Программа должна находить определенные ячейки и вставлять со смещением данные из других книг .Ошибок не выскакивает , и в начале работает нормально , но затем там где например должно быть 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
25.05.2017, 13:30
    #39459603
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Array (выдает неправильные по номеру элементы)
maxim863там где например должно быть F(t)=7 ,берется F(t)=6 .
Ага, а теперь в этой портянке нам предлагается найти то место, где сие происходит?

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

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

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

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

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



и вторая - проверьте опцию
Код: vbnet
1.
Option Base 0
...
Рейтинг: 0 / 0
28.05.2017, 06:00
    #39460992
i45
i45
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Array (выдает неправильные по номеру элементы)
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
29.05.2017, 14:19
    #39461583
maxim863
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Array (выдает неправильные по номеру элементы)
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
29.05.2017, 16:43
    #39461708
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Array (выдает неправильные по номеру элементы)
maxim863выдает тот же результатmaxim863.Ошибок не выскакиваетHandKotпервая ошибка :
Код: vbnet
1.
2.
'пропускаем ошибку
 On Error Resume Next
...
Рейтинг: 0 / 0
30.05.2017, 08:41
    #39461979
maxim863
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Array (выдает неправильные по номеру элементы)
Shocker.Pro,
'пропускаем ошибку
On Error Resume Next
Это специально написано , что бы пропускать ошибку ,которая выскакивает при открытии книг ,которых не существует .
...
Рейтинг: 0 / 0
30.05.2017, 09:02
    #39461990
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Array (выдает неправильные по номеру элементы)
1) Если книги не существует, зачем выполнять весь остальной код, который следует за открытием книги?
Посмотрите примеры, как правильно использовать конструкцию On Error.

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

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


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


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