Гость
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Рекурсивный поиск по Excel / 9 сообщений из 9, страница 1 из 1
27.03.2014, 15:25
    #38598208
k_mak
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рекурсивный поиск по Excel
Форумчане, добрый день!
Подскажите, пожалуйста, что исправить в коде, чтобы он заработал?
(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
27.03.2014, 22:24
    #38598566
iMrTidy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рекурсивный поиск по Excel
k_mak,

Для начала исправить ture на true. И в каком смысле код не работает?
...
Рейтинг: 0 / 0
02.04.2014, 10:18
    #38602649
k_mak
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рекурсивный поиск по Excel
в ходе выполнения кода происходит просто попеременное выделение ячеек 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
02.04.2014, 22:45
    #38603599
iMrTidy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рекурсивный поиск по Excel
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
03.04.2014, 14:37
    #38604329
k_mak
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рекурсивный поиск по Excel
iMrTidy, спасибо за помощь!
в файлике попытался понятнее показать, что нужно
...
Рейтинг: 0 / 0
03.04.2014, 23:05
    #38604916
iMrTidy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рекурсивный поиск по Excel
k_mak,
...
Рейтинг: 0 / 0
04.04.2014, 11:55
    #38605250
k_mak
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рекурсивный поиск по Excel
iMrTidy, огромнейшее спасибо!!! Все очень круто работает=) Буду сейчас курить код) как там и что=)
...
Рейтинг: 0 / 0
07.04.2014, 14:32
    #38607297
k_mak
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рекурсивный поиск по Excel
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
07.04.2014, 23:56
    #38607782
iMrTidy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рекурсивный поиск по Excel
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
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Рекурсивный поиск по Excel / 9 сообщений из 9, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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