powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Рекурсивный поиск по Excel
9 сообщений из 9, страница 1 из 1
Рекурсивный поиск по Excel
    #38598208
k_mak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Форумчане, добрый день!
Подскажите, пожалуйста, что исправить в коде, чтобы он заработал?
(P.S код функции нашел на просторах интернета, немножко подправил сам, но не работает..( )

Вобщем тут рекурсивные поиск по файлу xlsx.

Код: 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.
option explicit
dim ffound
dim y, c
dim strCFTMS, strCFTMSInput
dim objExcel, objSheet, objWorkbook1, objWorkbook2, objSheet1, objSheet2

strCFTMSInput = "C:\CFT_MemberShip_list.csv"
'strCFTMS = "C:\CFT_UserList"&"_"&FormatDateTime(Date, 0)&".xlsx"
strCFTMS = "C:\CFT_MemberShip"&"_"&FormatDateTime(Date, 0)&".xlsx"

set objExcel = createObject("Excel.Application")
objExcel.DisplayAlerts = false
objExcel.Visible = ture

set objWorkbook1 = objExcel.Workbooks.Open(strCFTMSInput)
set objSheet1 = objWorkbook1.Sheets(1) 'csv
set objWorkbook2 = objExcel.Workbooks.Add
set objSheet2 = objWorkbook2.Sheets(1) 'xlsx


objSheet1.Activate
objSheet1.Range("A3:C2000").Select
objExcel.Selection.Copy
objSheet2.Activate
objSheet2.Range("A2:C2000").PasteSpecial -4163

objExcel.Cells(1,1).Value = "subj_name"
objExcel.Cells(1,1).Font.Bold = TRUE
objExcel.Columns(1).ColumnWidth = 43
objExcel.Cells(1,2).Value = "granted_throught"
objExcel.Cells(1,2).Font.Bold = TRUE
objExcel.Columns(2).ColumnWidth = 43
objExcel.Cells(1,3).Value = "final_granted"
objExcel.Cells(1,3).Font.Bold = TRUE
objExcel.Columns(3).ColumnWidth = 43

objExcel.Range("A1:C1").Interior.ColorIndex = 42

for y = 2 to 10000
ffound = find1(objExcel.Cells(y,1))  
	objExcel.Cells(y,7) = ffound
next

objExcel.Columns("A:C").Select
objExcel.Selection.AutoFilter
objSheet2.Range("A1").Select


objWorkbook2.SaveAS(strCFTMS),51
objWorkbook2.Saved = true

SET objSheet = NOTHING 
objExcel.Quit
objExcel.Quit()
SET objExcel = NOTHING

'=====================================================================
'=====================================================================

'SOME FUNCTIONS
Function find1(item)
Dim strFirstAddress As String
Set c = Worksheets("Лист1").Range("A:A").Find(item)
	If Not c Is Nothing Then
	strFirstAddress = c.Address
		Do
		'debug
        c.Select
        c.Offset(0, 1).Select
        'find the next assembly (calling itself)
        find1 (c.Offset(0, 1).Value)
        'Come back and findnext previous value
        Set c = Worksheets("Лист1").Range("A:A").FindNext(c)
        Loop While c.Address <> strFirstAddress
	    Else
	        WScript.Echo ("Cells Not Found")
    End If
End Function



Главная проблема заключается в том, что не понимаю как правильно внедрить функцию в код, чтобы она обрабатывала данные.

На выходе должно быть что-то вроде этого
----
если по картинке не особо понятно, то вот текстовый вариант:
исходный вариант
FG1|SA1|1
FG2|SA2|1
FG1|CO1|4
SA1|SA3|2
SA1|CO2|3
SA3|CO3|2
SA2|SA3|4
SA2|CO4|1
то, что надо получить
FG1|FG1|SA1
FG1|SA1|SA3
FG1|SA3|CO3
FG1|SA1|CO2
FG1|FG1|CO1
FG2|FG1|SA2
FG2|SA2|SA3
FG2|SA3|CO3
FG2|SA2|CO4
...
Рейтинг: 0 / 0
Рекурсивный поиск по Excel
    #38598566
iMrTidy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
k_mak,

Для начала исправить ture на true. И в каком смысле код не работает?
...
Рейтинг: 0 / 0
Рекурсивный поиск по Excel
    #38602649
k_mak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
в ходе выполнения кода происходит просто попеременное выделение ячеек A2 и B2..и спустя секунд 10 выдается сообщение с ошибкой " Недостаточно памяти:'objSheet2.Range' "
немножко исправил код функции

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
Function find1(item)
Dim strFirstAddress
Set c = objSheet2.Range("A:A").Find(item)
	If Not c Is Nothing Then
	strFirstAddress = c.Address
		Do
                c.Select
                'WScript.Echo ("1")
		c.Offset(0, 1).Select
                'WScript.Echo ("2")
                'find the next assembly (calling itself)
                find1 (c.Offset(0, 1).Value)
		'WScript.Echo ("3")
		'Come back and find next previous value
 		Set c = objSheet2.Range("A:A").FindNext(c)
		'WScript.Echo ("4")
		Loop While c.Address = strFirstAddress
	        Else
	        WScript.Echo ("Cells Not Found")
    End If
End Function
...
Рейтинг: 0 / 0
Рекурсивный поиск по Excel
    #38603599
iMrTidy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
k_makв ходе выполнения кода происходит просто попеременное выделение ячеек A2 и B2..и спустя секунд 10 выдается сообщение с ошибкой " Недостаточно памяти:'objSheet2.Range' "
немножко исправил код функции

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
Function find1(item)
Dim strFirstAddress
Set c = objSheet2.Range("A:A").Find(item)
	If Not c Is Nothing Then
	strFirstAddress = c.Address
		Do
                c.Select
                'WScript.Echo ("1")
		c.Offset(0, 1).Select
                'WScript.Echo ("2")
                'find the next assembly (calling itself)
                find1 (c.Offset(0, 1).Value)
		'WScript.Echo ("3")
		'Come back and find next previous value
 		Set c = objSheet2.Range("A:A").FindNext(c)
		'WScript.Echo ("4")
		Loop While c.Address = strFirstAddress
	        Else
	        WScript.Echo ("Cells Not Found")
    End If
End Function



Этот код это бесконечный цикл, память утекает в перменную c. Будет проще помочь, если приложите файл с примером.
...
Рейтинг: 0 / 0
Рекурсивный поиск по Excel
    #38604329
k_mak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iMrTidy, спасибо за помощь!
в файлике попытался понятнее показать, что нужно
...
Рейтинг: 0 / 0
Рекурсивный поиск по Excel
    #38604916
iMrTidy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
k_mak,
...
Рейтинг: 0 / 0
Рекурсивный поиск по Excel
    #38605250
k_mak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iMrTidy, огромнейшее спасибо!!! Все очень круто работает=) Буду сейчас курить код) как там и что=)
...
Рейтинг: 0 / 0
Рекурсивный поиск по Excel
    #38607297
k_mak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iMrTidy,

а не могли бы Вы немножко пояснить по коду?

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
'...
Set rToAnalyze = sh.Range("A1:C65536")
'...
aToAnalyze = rToAnalyze
'...

lRUpper = UBound(aToAnalyze, 1)
lCUpper = UBound(aToAnalyze, 2)

ReDim aResult(1 To lRUpper, 1 To lCUpper + 1)

aResult(1, lCUpper) = "GrantedThrough(n)"



я правильно понимаю, что
IRUpper - количество элементов в массиве A:В, а lCUpper - количество элементов в массиве А:С?
а что происходит в ReDim?

Пытаюсь под VBScript переделать=)

Заранее спасибо=)
...
Рейтинг: 0 / 0
Рекурсивный поиск по Excel
    #38607782
iMrTidy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
k_makiMrTidy,

а не могли бы Вы немножко пояснить по коду?

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
'...
Set rToAnalyze = sh.Range("A1:C65536")
'...
aToAnalyze = rToAnalyze
'...

lRUpper = UBound(aToAnalyze, 1)
lCUpper = UBound(aToAnalyze, 2)

ReDim aResult(1 To lRUpper, 1 To lCUpper + 1)

aResult(1, lCUpper) = "GrantedThrough(n)"



я правильно понимаю, что
IRUpper - количество элементов в массиве A:В, а lCUpper - количество элементов в массиве А:С?
а что происходит в ReDim?

Пытаюсь под VBScript переделать=)

Заранее спасибо=)

Нет, Вы понимаете неверно. Как указано в справке , эта функция (UBound) возвращает наибольший индекс (тип данных Long ) указанного измерения массива. Массив aToAnalyze двумерный. В данном конкретном примере первое измерение представляет собой строки, а второе столбцы. В данном конкретном случае количество элементов обоих измерений массива совпадает со значениями их наибольших индексов.
Оператор ReDim задает нижний и верхний индексы измерений массива.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Рекурсивный поиск по Excel
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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