Как возвратить диапазон ячеек в VBA, не используя цикл?

Я нашел решение. Возвращаемое значение "fopen ()" должно было быть FILE *, вместо этого я неправильно использовал int.

5
задан shruti1810 27 May 2015 в 06:20
поделиться

6 ответов

Вот некоторые примечания по использованию recordset для возврата диапазона.

Sub GetRange()
Dim cn As Object
Dim rs As Object
Dim strcn, strFile, strPos1, strPos2

    Set cn = CreateObject("ADODB.Connection")
    Set rs = CreateObject("ADODB.Recordset")

    strFile = ActiveWorkbook.FullName

    strcn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" _
    & strFile & ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=1';"

    cn.Open strcn

    rs.Open "SELECT * FROM [Sheet1$]", cn, 3 'adOpenStatic'

    rs.Find "Col2='cat'"
    strPos1 = rs.AbsolutePosition + 1
    rs.MoveLast
    If Trim(rs!Col2 & "") <> "cat" Then
        rs.Find "Col2='cat'", , -1 'adSearchBackward'
        strPos2 = rs.AbsolutePosition + 1
    Else
        strPos2 = rs.AbsolutePosition + 1
    End If
    Range("A" & strPos1, "B" & strPos2).Select
End Sub
2
ответ дан 15 December 2019 в 01:14
поделиться

Этот парень сделал, чтобы функционировал хороший FindAll:

http://www.cpearson.com/excel/findall.aspx

1
ответ дан 15 December 2019 в 01:14
поделиться

Забыл другую функцию XL2007: усовершенствованная фильтрация. Если Вы хотите это в VBA, я получил это от зарегистрированного макроса:

Range("A1:A1000000").AdvancedFilter Action:=xlFilterCopy, CopyToRange:= Range("F1"), Unique:=True

Я синхронизировал его приблизительно в 0,35 секунды...

По общему признанию, не много использования, если у Вас нет 2007.

1
ответ дан 15 December 2019 в 01:14
поделиться

Спасибо ди-джей.

То решение FindAll все еще использует цикл VBA, чтобы сделать вещи.

Я пытаюсь найти путь, не используя цикл уровня пользователя для фильтрации диапазона в Excel VBA.

Здесь я нашел решение. это использует в своих интересах Excel встроенный механизм, чтобы сделать задание.

(1) используйте worksheetfunction. CountIf ("CAT") для получения количества ячеек "кошки"

(2) используйте.Find ("кошка") для получения первой строки "кошки"

с количеством строк и первой строки, я уже могу получить диапазон "кошки".

Хорошая часть этого решения: никакой цикл уровня пользователя, это могло бы улучшить производительность, если диапазон является большим.

0
ответ дан 15 December 2019 в 01:14
поделиться

Excel поддерживает протокол ODBC. Я знаю, что можно соединиться с электронной таблицей Excel от базы данных Access и запросить ее. Я не сделал этого, но возможно существует способ запросить электронную таблицу с помощью ODBC из Excel.

0
ответ дан 15 December 2019 в 01:14
поделиться

Если Вы не используете veeeery старую машину, или у Вас есть рабочий лист XL2007 с огромным количеством строк, цикл будет достаточно быстрым. Честный!

Не доверяйте мне? Посмотрите на это. Я заполнил миллион диапазонов строки случайными буквами с помощью этого:

=CHAR(RANDBETWEEN(65,90))

Затем я записал эту функцию и назвал ее от 26 диапазонов ячеек с помощью Control-Shift-Enter:

=TRANSPOSE(UniqueChars(A1:A1000000))

Вот является not-very-optimised VBA функцией, которую я вырубил за несколько минут:

Option Explicit

Public Function UniqueChars(rng As Range)

Dim dict As New Dictionary
Dim vals
Dim row As Long
Dim started As Single

    started = Timer

    vals = rng.Value2

    For row = LBound(vals, 1) To UBound(vals, 1)
        If dict.Exists(vals(row, 1)) Then
        Else
            dict.Add vals(row, 1), vals(row, 1)
        End If
    Next

    UniqueChars = dict.Items

    Debug.Print Timer - started

End Function

На моем году Core 2 Duo T7300 (2 ГГц) ноутбук потребовалось 0,58 секунды.

0
ответ дан 15 December 2019 в 01:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: