Выбрать дату в календареВыбрать дату в календаре

Страницы: 1 2 3 След.
Как отсортировать 5 миллионов строк?
 
Вариант #51 дает лишние слэши в конце из-за наличия последнего столбца в котором может быть дополнительный текст. Поправил это дело, но производительность упала до 86 сек. Ну, как вариант с применением выражений SQL и возможностью простой выгрузки результата в DBF, Excel и различные форматы текста вполне может сгодиться. файл schema.ini
Код
[file.txt]
ColNameHeader=False
Format=Delimited(/)
CharacterSet=1251
TextDelimiter="none"
Col1=clm1 Text
Col2=clm2 Text
Col3=clm3 Text
Col4=clm4 Text
Col5=clm5 Text
Col6=clm6 Text
Col7=clm7 Text
MaxScanRows=0

[result.txt]
ColNameHeader=False
Format=Delimited(/)
CharacterSet=1251
TextDelimiter="none"
Col1=clm1 Text
MaxScanRows=0
код VBA
Код
Sub TextFileSort()
    Dim ft As Single: ft = Timer
    Dim objRS: Set objRS = CreateObject("ADODB.Recordset")
    objRS.Open "SELECT [clm1]+'//'+[clm3]+'/'+[clm4]+'/'+[clm5]+'/'+[clm6]+IIF([clm7] IS NOT NULL, '/'+[clm7], '') AS [clm1] INTO [result.txt] FROM [file.txt] IN 'D:\temp' 'TEXT;' ORDER BY VAL([clm6])", "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\temp;Extended Properties=TEXT"
    Debug.Print "Full time: " & Timer - ft
End Sub
Jack Famous, вряд-ли чем-то помогу, все упирается в производительность ADO. у меня ваш пример выполняется за 63 сек

PS еще раз поправил схему и запрос с учетом наличия лидирующих нолей, либо не числового значения...
PPS на всякий случай: синтаксис SQL в OLE DB из FoxPro, как-то мне эта инфа не сразу попалась...
Изменено: DenSyo - 29.06.2020 14:17:01
Как отсортировать 5 миллионов строк?
 
Цитата
каков порядок вывода будет для hpps://server/blabla/1000000 и hpps://server/blabla/20 - оценивали в своём решении?
Хорошее замечание, Андрей. Поправил schema.ini
Цитата
Добавил файл в сообщение 52, протестируйте на время - интересно.
у меня 4,577 - шустро канеш
Изменено: DenSyo - 29.06.2020 11:36:34
Как отсортировать 5 миллионов строк?
 
Цитата
время выполнения какое?
на моей машине 63 сек. пример Андрея из #29 показал у меня 86
Изменено: DenSyo - 29.06.2020 11:02:32
Как отсортировать 5 миллионов строк?
 
Добавлю еще вариант решения с использованием SQL. В примере исходный файл (file.txt) и результат (result.txt) находятся в папке D:\temp, там же создаем файл schema.ini со следующим содержимым:
Код
[file.txt]
ColNameHeader=False
Format=Delimited(/)
CharacterSet=1251
TextDelimiter="none"
Col1=clm1 Text
Col2=clm2 Text
Col3=clm3 Text
Col4=clm4 Text
Col5=clm5 Text
Col6=clm6 Long
Col7=clm7 Text
MaxScanRows=0

[result.txt]
ColNameHeader=False
Format=Delimited(/)
CharacterSet=1251
TextDelimiter="none"
Col1=clm1 Text
Col2=clm2 Text
Col3=clm3 Text
Col4=clm4 Text
Col5=clm5 Text
Col6=clm6 Long
Col7=clm7 Text
MaxScanRows=0
код VBA
Код
Sub TextFileSort()
    Dim objRS: Set objRS = CreateObject("ADODB.Recordset")
    objRS.Open "SELECT * INTO [result.txt] FROM [file.txt] IN 'D:\temp' 'TEXT;HDR=No;FMT=Delimited;' ORDER BY [clm6]", "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\temp;Extended Properties=TEXT"
End Sub
Изменено: DenSyo - 29.06.2020 11:23:01
Как удалить удаленные принтеры из ниспадающего списка выбора принтера
 
обратите внимание, у всех удаленных принтеров есть документы в очереди. надо очистить очередь печати
Размышление о C API Functions для Excel, Испольpование C API Functions для Excel в .xll
 
Цитата
bedvit написал:
"буфер отмены действий"-что это?
да, был не прав. отмена действий имеет не буфер, а стек.
вопрос снимаю, здесь пояснение...
Размышление о C API Functions для Excel, Испольpование C API Functions для Excel в .xll
 
ах так...
Цитата
bedvit написал:
Посему предлагаю рассмотреть, что нужно в действительности, что работало бы быстро и реализовывалось через функцию рабочего листа Excel.
я вас за язык не тянул)
на самом деле, сейчас интересует только сама возможность такового, что бы знать о ней при необходимости, а реализация дело времени. если вам еще интересна тема си-апи, ну гляньте для нас, что есть для работы с буфером...
VBA. Событие изменения конкретных строк
 
склоняюсь к варианту с undo/redo, если уж продолжать в этом направлении. заполнять массив на каждый клик слишком уж бессмысленно...
Изменение ссылок в формулах в книге с помощью VBA.
 
Цитата
crjk написал:
Поэтому предполагаю, что это связано с тем, что данная книга открыта.
именно. сделайте проверку открыта книга или нет и если открыта не добавляйте путь в новой ссылке. добавьте функцию IsBookOpen из примеров по ссылке и замените часть кода
Код
For Each wb In Application.Workbooks
    If wb.Name Like "1.0*" Then
        newAddress = IIf(IsBookOpen(wb.Name), "", wb.Path & "\") & "[" & wb.Name & "]"
    End If
Next
Изменено: DenSyo - 07.12.2018 14:59:42
Размышление о C API Functions для Excel, Испольpование C API Functions для Excel в .xll
 
тут старую как эксель тему подняли, есть в си-апи варианты сделать доступ к содержимому буфера отмены действий без применения отмены?
VBA. Событие изменения конкретных строк
 
гугол подсказывает...
Код
Dim vOldVal 'Must be at top of module

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    vOldVal = Target
End Sub
второй вариант, там же предложенный, использование отмены предыдущего действия, так же справедлив и в некоторых случаях может быть производительнее.
Изменено: DenSyo - 07.12.2018 09:32:50
Использование фильтра при слиянии в Word VBA
 
на самом деле как только не пробовал экранировать и не экранировать имя поля в запросе, все варианты пригодны, привел такой, какой непосредственно строит ворд. не пробовал только вариант запроса который сам и опубликовал в топике))) ввел всех в заблуждение, прошу понять и простить, не там искал проблему. запрос по всем полям действительно корректно работает. WHERE пропадает конкретно в таком случае:
Код
MailMerge.OpenDataSource Name:=filePath, ConfirmConversions:=False, ReadOnly:=False, LinkToSource:=True, _
    AddToRecentFiles:=False, PasswordDocument:="", PasswordTemplate:="", WritePasswordDocument:="", _
    WritePasswordTemplate:="", Revert:=False, Format:=wdOpenFormatAuto, _
    Connection:="Provider=Microsoft.ACE.OLEDB.12.0;User ID=Admin;Data Source=" & Path, _
    SQLStatement:="SELECT CHET,PLACE,ISP_VID,ISP_NOM,RIGHT(DATE_ISP,2)+'.'+MID(DATE_ISP,5,2)+'.'+LEFT(DATE_ISP,4) AS DATE_ISP,SUD_NAME,SUD_REG,DELO_NOM,RIGHT(DELO_DAT,2)+'.'+MID(DELO_DAT,5,2)+'.'+LEFT(DELO_DAT,4) AS DELO_DAT,D_NAME,DOLG,PENY,GOS_SBOR,ALL_DOLG", _
    SQLStatement1:=" FROM `fl_isp` WHERE PLACE=1", SubType:=wdMergeSubTypeAccess
Использование фильтра при слиянии в Word VBA
 
делаю в ворде слияние с файлом дбф:
Код
ActiveDocument.MailMerge.OpenDataSource Name:="C:\mypath\fl_isp.dbf", ConfirmConversions:=False, ReadOnly:=False, LinkToSource:=True, _
        AddToRecentFiles:=False, PasswordDocument:="", PasswordTemplate:="", WritePasswordDocument:="", _
        WritePasswordTemplate:="", Revert:=False, Format:=wdOpenFormatAuto, _
        Connection:="Provider=Microsoft.ACE.OLEDB.12.0;User ID=Admin;Data Source=C:\mypath;", _
        SQLStatement:="SELECT * FROM [fl_isp] WHERE `PLACE`=1", SQLStatement1:="", SubType:=wdMergeSubTypeAccess
при выполнении условие WHERE не отрабатывает, и собственно свойство ActiveDocument.MailMerge.DataSource.QueryString имеет значение "SELECT * FROM [fl_isp] ", без куска с WHERE. при включении в интерфейсе фильтра получателей слияния "PLACE равно 1" условие выполняется и ActiveDocument.MailMerge.DataSource.QueryString принимает значение "SELECT * FROM [fl_isp]  WHERE `PLACE` = 1". запись макроса во время включения фильтра пишет пустой макрос, нет понимания что именно делает ворд для включения выполнения условия WHERE в запросе. поиск ответов не дал. как он это делает?
Экспорт в pdf и отправка на почту
 
Цитата
А  для отправки вложения требуется нечто большее.
например, командная строка
Сортировка таблицы по некоторым условиям
 
поправил пример под случай с цифрами через точку
Сортировка таблицы по некоторым условиям
 
выкладывал в теме по сортировке подстрок в строке с разделителем функцию, сделал ее аналог для сортировки ячеек. диапазон можно передавать только одномерный, либо один столбец, либо строка. используется временная книга для сохранения ячеек с форматами, может стоит упростить и кто подскажет как...
Код
Sub TestSortRange()
    Dim toRng As Range
    Set toRng = Selection
    If toRng.Rows.Count > 1 And toRng.Columns.Count > 1 Then Set toRng = toRng.Columns(1)
    Call SortRange(toRng, regPattern:=".", regReplace:="a", regSet:=68, sortSet:=2)
End Sub

' Сортировка ячеек в диапазоне inputRange
' regPattern - шаблон регулярного выражения применяемого к подстрокам перед сортировкой. если не задан сортировка ведется по значениям подстрок
' regReplace - строка регулярного выражения для замены
' regSet - флаги регулярного выражения (по умолчанию 0):
'   младший бит: если 0 возвращаемый результат соответствует шаблону, 1 - из подстроки удаляется соответствие шаблону
'   второй бит:
'   третий бит: если 0 поиск до первого совпадения, 1 - поиск по всему тексту
'   четвертый бит: если 0 учитывать регистр, 1 - не учитывать регистр
'   пятый бит: если 0 текст однострочный, 1 - многострочный текст
'   шестой бит:
'   седьмой бит: если 1 используется серия замен в строке inputString вместо регулярного выражения:
'     строка regPattern задает набор искомых строк разделенных разделителем withDelimit,
'     строка regReplace набор строк замены с разделителем withDelimit соответствующий порядку строк regPattern
'     третий и четвертый биты имеют такое же значение как для регулярного выражения
'   восьмой бит: если 1 сортировка подстрок в строке inputString производится по индексам в строке regPattern заданным через разделитель withDelimit
'     все остальные биты в regSet и другие флаги не имеют значения
' sortSet - флаги сортировки (по умолчанию 0):
'   младший бит: если 1 сортировка по убыванию
'   второй бит: если 1 использовать натуральное сравнение
Sub SortRange(inputRange As Variant, Optional regPattern As String = "", Optional regReplace As String = "", _
    Optional regSet As Byte = 0, Optional sortSet As Byte = 0, Optional withDelimit As String = " ")
    
    Dim arrStr() As Variant, arrBuff() As String, s As String, arrFind() As String, arrRep() As String
    Dim arrIdx() As Long, i As Long, n As Long, r As Long, j As Long
    Dim regEx As Object, regItems As Object, rItem As Object, inRng As Range, tmpRng As Range
    Dim theWS As Worksheet, tmpWS As Worksheet, tmpWB As Workbook
    Dim fScreen As Boolean
    
    fScreen = Application.ScreenUpdating
    Application.ScreenUpdating = False
    If IsObject(inputRange) Then Set inRng = inputRange Else Set inRng = Range(inputRange)
    Set theWS = inRng.Worksheet
    Set tmpWB = Workbooks.Add(xlWBATWorksheet)
    Set tmpWS = tmpWB.Sheets(1)
    Set tmpRng = tmpWS.Range(inRng.Address)
    inRng.Copy
    tmpRng.PasteSpecial
    arrStr = Application.Transpose(inRng.Value)
    On Error Resume Next
    n = UBound(arrStr, 2)
    If n > 0 Then arrStr = Application.Transpose(arrStr)
    n = UBound(arrStr)
    If regPattern = "" Then
        arrIdx = SortArrIdx(arrStr, IIf(sortSet And 1, 1, 0) + IIf(sortSet And 2, 2, 0) + 16)
    ElseIf regSet And 128 Then
        arrBuff = Split(regPattern, withDelimit)
        If UBound(arrBuff) < n Then ReDim Preserve arrBuff(0 To n)
        ReDim arrIdx(0 To n)
        For i = 1 To n
            If arrBuff(i) > "" Then If IsNumeric(arrBuff(i)) Then If CLng(arrBuff(i)) <= n And CLng(arrBuff(i)) > 0 Then arrIdx(i) = arrStr(CLng(arrBuff(i)))
        Next i
    Else
        If regSet And 64 Then
            arrFind = Split(regPattern, withDelimit)
            arrRep = Split(regReplace, withDelimit)
            r = UBound(arrFind)
            If UBound(arrRep) < r Then ReDim Preserve arrRep(0 To r)
        Else
            Set regEx = CreateObject("VBScript.RegExp")
            If regSet And 4 Then regEx.Global = True Else regEx.Global = False
            If regSet And 8 Then regEx.IgnoreCase = True Else regEx.IgnoreCase = False
            If regSet And 16 Then regEx.MultiLine = True Else regEx.MultiLine = False
            regEx.Pattern = regPattern
        End If
        ReDim arrBuff(0 To n)
        For i = 0 To n
            If regSet And 64 Then
                arrBuff(i) = arrStr(i)
                For j = 0 To r
                    arrBuff(i) = Replace(arrBuff(i), arrFind(j), arrRep(j), 1, IIf(regSet And 4, -1, 1), IIf(regSet And 8, vbTextCompare, vbBinaryCompare))
                Next j
            Else
                If regEx.Test(arrStr(i)) Then
                    If regSet And 4 Then
                        Set regItems = regEx.Execute(arrStr(i))
                        s = ""
                        For Each rItem In regItems
                            s = s & rItem
                        Next rItem
                    Else
                        s = regEx.Execute(arrStr(i)).Item(0)
                    End If
                    If regSet And 1 Then arrBuff(i) = regEx.Replace(arrStr(i), regReplace) Else arrBuff(i) = IIf(regReplace = "", s, regEx.Replace(s, regReplace))
                Else
                    If regSet And 1 Then arrBuff(i) = arrStr(i) Else arrBuff(i) = ""
                End If
            End If
        Next i
        arrIdx = SortArrIdx(arrBuff, 16 + IIf(sortSet And 1, 1, 0) + IIf(sortSet And 2, 2, 0))
    End If
    For i = 1 To n
        tmpRng.Cells(arrIdx(i)).Copy
        inRng.Cells(i).PasteSpecial
    Next
    tmpWB.Close SaveChanges:=False
    Application.ScreenUpdating = fScreen
End Sub

' keySet значения:
' младший бит: 0 - сортировка по возрастанию, 1 - сортировка по убыванию
' второй бит: если 1 использовать натуральное сравнение
' пятый бит: если 1 вернуть индексы исходных подстрок в отсортированном порядке
Function SortArrIdx(ByVal Arr, Optional keySet As Byte = 0)
Dim i&, j&, n&, l&, tmp, tt, arrIdx() As Long

If Not IsArray(Arr) Then SortArrIdx = Arr: Exit Function
n = UBound(Arr)
l = LBound(Arr)
ReDim arrIdx(l To n)
For i = l To n
    arrIdx(i) = i
Next i
If n > 0 Then
    If keySet And 1 Then
        For i = n To 1 Step -1
            For j = i - 1 To l Step -1
                If IsNumeric(Arr(i)) And IsNumeric(Arr(j)) Then
                    If Val(Arr(i)) > Val(Arr(j)) Then tmp = Arr(i): Arr(i) = Arr(j): Arr(j) = tmp: tt = arrIdx(j): arrIdx(j) = arrIdx(i): arrIdx(i) = tt
                Else
                    If keySet And 2 Then
                        If CompareNaturale(Arr(i), Arr(j)) = 1 Then tmp = Arr(i): Arr(i) = Arr(j): Arr(j) = tmp: tt = arrIdx(j): arrIdx(j) = arrIdx(i): arrIdx(i) = tt
                    Else
                        If Arr(i) > Arr(j) Then tmp = Arr(i): Arr(i) = Arr(j): Arr(j) = tmp: tt = arrIdx(j): arrIdx(j) = arrIdx(i): arrIdx(i) = tt
                    End If
                End If
        Next j, i
    Else
        For i = l To n - 1
            For j = i + 1 To n
                If IsNumeric(Arr(i)) And IsNumeric(Arr(j)) Then
                    If Val(Arr(i)) > Val(Arr(j)) Then tmp = Arr(i): Arr(i) = Arr(j): Arr(j) = tmp: tt = arrIdx(j): arrIdx(j) = arrIdx(i): arrIdx(i) = tt
                Else
                    If keySet And 2 Then
                        If CompareNaturale(Arr(i), Arr(j)) = 1 Then tmp = Arr(i): Arr(i) = Arr(j): Arr(j) = tmp: tt = arrIdx(j): arrIdx(j) = arrIdx(i): arrIdx(i) = tt
                    Else
                        If Arr(i) > Arr(j) Then tmp = Arr(i): Arr(i) = Arr(j): Arr(j) = tmp: tt = arrIdx(j): arrIdx(j) = arrIdx(i): arrIdx(i) = tt
                    End If
                End If
        Next j, i
    End If
End If
If keySet And 16 Then SortArrIdx = arrIdx Else SortArrIdx = Arr
End Function

' функция натурального сравнения, возвращает номер большего аргумента либо 0 в случае равенства
' при сравнении чисел в строках учитывается знак минус, знак точки и региональный знак точки (запятая)
Function CompareNaturale(ByVal str1 As String, ByVal str2 As String) As Integer
    Dim i, k, k1, k2 As Long
    Dim s1(), s2(), dsep As String
    Dim v1, v2 As Variant
    Dim nn As Boolean
    
    If str1 = str2 Then
        CompareNaturale = 0
    Else
        If str1 Like "*#*" And str2 Like "*#*" Then
            dsep = Application.International(xlDecimalSeparator)
            k1 = 1
            ReDim Preserve s1(0 To k1)
            If IsNumeric(Left(str1, 1)) Then nn = True Else nn = False
            For i = 1 To Len(str1)
                If IsNumeric(Mid(str1, i, 1)) Then
                    If Not nn Then
                        k1 = k1 + 1
                        ReDim Preserve s1(0 To k1)
                        nn = True
                        If LTrim(Right(s1(k1 - 1), 2)) = "-" And Not (IsNumeric(s1(k1 - 2)) And Len(s1(k1 - 1)) = 1) Then
                            s1(k1 - 1) = Left(s1(k1 - 1), Len(s1(k1 - 1)) - 1)
                            s1(k1) = "-"
                        End If
                    End If
                Else
                    If nn Then
                        k1 = k1 + 1
                        ReDim Preserve s1(0 To k1)
                        nn = False
                    End If
                End If
                s1(k1) = s1(k1) & Mid(str1, i, 1)
            Next i
            k2 = 1
            ReDim Preserve s2(0 To k2)
            If IsNumeric(Left(str2, 1)) Then nn = True Else nn = False
            For i = 1 To Len(str2)
                If IsNumeric(Mid(str2, i, 1)) Then
                    If Not nn Then
                        k2 = k2 + 1
                        ReDim Preserve s2(0 To k2)
                        nn = True
                        If LTrim(Right(s2(k2 - 1), 2)) = "-" And Not (IsNumeric(s2(k2 - 2)) And Len(s2(k2 - 1)) = 1) Then
                            s2(k2 - 1) = Left(s2(k2 - 1), Len(s2(k2 - 1)) - 1)
                            s2(k2) = "-"
                        End If
                    End If
                Else
                    If nn Then
                        k2 = k2 + 1
                        ReDim Preserve s2(0 To k2)
                        nn = False
                    End If
                End If
                s2(k2) = s2(k2) & Mid(str2, i, 1)
            Next i
            k = IIf(k1 < k2, k1, k2)
            For i = 1 To k
                If s1(i) <> s2(i) Then
                    If IsNumeric(s1(i)) And IsNumeric(s2(i)) Then
                        v1 = CLng(s1(i))
                        v2 = CLng(s2(i))
                        If i > 1 Then
                            If Replace(Trim(s1(i - 1)), ".", dsep) = dsep Then
                                v1 = CDbl("0" & dsep & s1(i))
                                If i > 2 Then If IsNumeric(s1(i - 2)) Then If CLng(s1(i - 2)) < 0 Then v1 = 0 - v1
                            End If
                            If Replace(Trim(s2(i - 1)), ".", dsep) = dsep Then
                                v2 = CDbl("0" & dsep & s2(i))
                                If i > 2 Then If IsNumeric(s2(i - 2)) Then If CLng(s2(i - 2)) < 0 Then v2 = 0 - v2
                            End If
                        End If
                        If v1 <> v2 Then
                            If v1 > v2 Then CompareNaturale = 1 Else CompareNaturale = 2
                        Else
                            If s1(i) > s2(i) Then CompareNaturale = 1 Else CompareNaturale = 2
                        End If
                    Else
                        If s1(i) > s2(i) Then CompareNaturale = 1 Else CompareNaturale = 2
                    End If
                    Exit For
                Else
                    If i = k Then
                        If k1 = k2 Then CompareNaturale = 0 Else If k1 > k2 Then CompareNaturale = 1 Else CompareNaturale = 2
                    End If
                End If
            Next i
        Else
            If str1 > str2 Then CompareNaturale = 1 Else CompareNaturale = 2
        End If
    End If
End Function
Изменено: DenSyo - 27.06.2018 14:26:11
PQ: Получение данных из Outlook базы
 
в редакторе vba на строке 10 (на вашем скриншоте стрелка на нее показывает) слева от текстового поля ткните мышкой чтобы установить точку останова и запустите процедуру. когда дебагер остановится на этой строке добавьте в окно просмотра переменных объект objNS и разверните его. будет вся структура. а вообще, надо погуглить как с подпапками аутлука работать. здесь все применимо из примеров для аутлука, только явное объявление объектов надо менять на не явное
PQ: Получение данных из Outlook базы
 
в дебагере посмотрите посмотрите структуру объектов если вопросы по получению данных из аутлука возникнут. а вот так можно подключить внешний файл аутлука:
Код
objNS.AddStore "D:\Temp\Personal Folders.pst"
PQ: Получение данных из Outlook базы
 
забираем письма из аутлука в эксель. имена ящиков свои задайте
Код
Sub GetMessages()
    Dim objNS As Object
    Dim objOL As Object
    Dim i As Long
    
    Set objOL = CreateObject("Outlook.Application")
    Set objNS = objOL.GetNamespace("MAPI")
    With objNS.Folders("info@mail.su").Folders("Входящие")
        For i = 1 To .Items.Count
            Cells(i, 1).Value = .Items(i).Subject
            Cells(i, 2).Value = .Items(i).Body
        Next
    End With
    Set objNS = Nothing
    Set objOL = Nothing
End Sub
Оптимизация программного кода: Connection, RecordSet, Оптимальное использование программного кода при прописывании Connection, RecordSet
 
цель ТСа не избавится от лишней писанины, а избавиться от бессмысленных конектов. если пишите "вещь в себе", программу которая работает как есть и больше не надо, то глобальные переменные правильный вариант. если пишите функции которые можно использовать в других задачах, то подход другой. лучший пример - встроенные функции, например, диапазон можно передать строкой, объектом Range или объектами Cell. удобно. я в своих функциях предусматриваю вызов с открытым конектом либо с новым так. может кто предложит лучше)
Код
Function ExecuteSQL(strConn As Variant) As Variant
    Dim dbs As ADODB.Connection
    Dim rst As ADODB.Recordset
    Dim fObjConn As Boolean
    
    If IsObject(strConn) Then
        fObjConn = True
    Else
        Set dbs = New ADODB.Connection
        On Error Resume Next
        dbs.Open strConn
        If Err.Number = 0 Then
            fObjConn = False
        Else
            ExecuteSQL = Err.Description
            Exit Function
        End If
    End If
    Set rst = New ADODB.Recordset
    rst.ActiveConnection = IIf(fObjConn, strConn, dbs)
    'код
    If Not fObjConn Then dbs.Close
End Function
Оптимизация программного кода: Connection, RecordSet, Оптимальное использование программного кода при прописывании Connection, RecordSet
 
Цитата
Nordheim написал:
В этом случае так же нужно в каждом коде прописывать переменную
а зачем ее прописывать если мы ее уже получили в параметрах?  
Оптимизация программного кода: Connection, RecordSet, Оптимальное использование программного кода при прописывании Connection, RecordSet
 
... или передавать объект параметром
Код
Sub mysub(cn As Object)
CopyPicture работает через раз
 
у меня тесты показывают обратное, без копирования все отрабатывает в разных ситуациях, с копированием, например, при свернутом окне возникнет ошибка
CopyPicture работает через раз
 
уберите везде в коде перед копированием картинки копирование ячеек: Range("AE5:AG8").Copy - оно не несет никакой смысловой нагрузки и порождает ошибку
Определить неизвестные свойства ListBox на форме
 
вот так вообще хорошо будет
Код
ColiWidth = Val(Trim(Split(Replace(Listbox1.ColumnWidths, " pt",""), ";")(i-1)))
CopyPicture работает через раз
 
у вас везде в коде используются ActiveSheet экселя и ActiveWindow паверпоинта, неочень так делать. замените строку Sheets(Lists(i)).Select на Set mySheet = ThisWorkbook.Sheets(Lists(i)) и далее, везде где обращаетесь к объектам листа, пишите так: mySheet.Range("AB6:AC8").CopyPicture Appearance:=xlScreen, Format:=xlPicture. аналогичное следует сделать с паверпоинтом, строку AppPowerPoint.ActivePresentation.Slides.Item(i).Select заменить на Set myPower = AppPowerPoint.ActivePresentation.Slides.Item(i) и использовать примерно так (тут нет уверенности в правильности из-за отсутствия опыта, но суть в этом): myPower.View.Paste
Определить неизвестные свойства ListBox на форме
 
стандартных методов нет, по крайней мере не знаю.  
Определить неизвестные свойства ListBox на форме
 
Цитата
Alemox написал:
Это топорный метод, который не точный, если будет строк больше 1000, то по любому не подберёшь
на самом деле можно добиться поразительной точности. тем более если вы готовы отобразить на своем экране 1000 строк. всего то и надо точно подогнать высоту объекта вровень с последней строкой. 10000 дадут еще более точный результат
Определить неизвестные свойства ListBox на форме
 
речь идет про ActiveX элемент, правильно понимаю?
1) .ColumnWidths содержит строку с шириной столбцов вида: "40 pt;30 pt"
3) определить высоту одной строки самостоятельно (либо зависимость ее высоты от размера шрифта), умножить ее на .ListCount и разделить полученное на .Height  
Ручной ввод имени файла через adodb
 
а кто знает, такая конструкция вообще рабочая и где про нее почитать если да?
SELECT * FROM [Лист$] IN "файл.xlsm" [строка подключения]
Sofunky, если конструкция запроса у вас верная, то как минимум ошибка в объявлении одноименных полей: SELECT F1, null as F1, F8, null as F8, F15, null as F15
Страницы: 1 2 3 След.
Наверх