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

Страницы: 1
Удаление пунктов контекстного меню сводной таблицы
 
Добрый день

Пытаюсь убрать пару пунктов контекстного меню сводной таблицы для активной книги
В итоге получилось...вроде убрал, но есть некоторая масса пустых пунктов которые хотелось бы убрать (возможно появились при отладке),
а главное что это применилось не только к текущей книге, но и к любой где есть сводные таблицы...Можно как-то откатить или переустановкой только ?

Возможно надо было сохранить исходное меню...но как ?
Код
Option Explicit

Public Sub New_Commandbar()
Dim Cbr As CommandBar
Dim Ctr As CommandBarControl
On Error Resume Next
Application.CommandBars("PivotTable Context Menu").Delete
Application.CommandBars.Add Name:="PivotTable Context Menu", Position:=msoBarPopup, Temporary:=True
For Each Ctr In Application.CommandBars("PivotTable Context Menu").Controls
    With Application.CommandBars("PivotTable Context Menu").Controls.Add(Ctr.Type, Ctr.ID, Ctr.Parameter, , 1)
        If (Ctr.Caption <> "Показать список поле&й") Or (Ctr.Caption <> "&Параметры полей значений...") Then
        
        Else
            Ctr.Delete
        End If
    End With
Next
End Sub

Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
  Cancel = True
  New_Commandbar
  Application.CommandBars("PivotTable Context Menu").Show
End Sub
Изменено: roocs - 06.11.2017 12:50:14
Расширить данные с учетом даты
 
Требуется расширить данные в столбцах с учетом даты

Упрощенный пример находится в прилагаемом файле.
То есть сейчас есть столбец с "пропусками" в датах. Требуется из него сделать последовательность и под нее "растащить" данные таблицы.
Как это можно организовать ?

Спасибо
можно ли заменить перебор и Like, можно ли заменить перебор и Like
 
Требуется обработать данные с учетом значений в столбце М, при этом надо выполнить изменение содержимого в ячейках.
Если такого содержимого нет, то всю строку скопировать в лист Errors.

Делаю следующим образом

Код
'поиск ошибок по данным столбца M
    lLastRow = lLastRow - 1
    Dim J As Long
    J = 1
    Dim sTmp As String
    For i = 3 To lLastRow
        'значение ячейки
        sTmp = Range("M" & i).Value
        'возможные начальные и конечные пробелы
        sTmp = Trim(sTmp)
        'меняем значения ячейки только при указанных трех условиях
        If (sTmp Like "usi*") Or (sTmp Like "Usi*") Then
            Range("M" & i).Value = "USING"
        ElseIf (sTmp Like "proc*") Or (sTmp Like "Proc*") Then
            Range("M" & i).Value = "PROCESS"
        ElseIf (sTmp Like "pen*") Or (sTmp Like "Pen*") Then
            Range("M" & i).Value = "PENALTY"
        Else
            'если содержимое отличается от указанных выше
            'копируем на лист ошибок строку и добавляем в столбец U фразу
            Range("A" & i).EntireRow.Copy currentWB.Worksheets("Errors").Range("A" & J)
            currentWB.Worksheets("Errors").Range("U" & J).Value = "Not USING, PROCESS, PENALTY"
            J = J + 1
        End If
    Next i


на больших объемах (свыше 20000 строк), машина очень сильно тормозит. Предполагаю тут две проблемы - перебор строк и использование Like.
Как-нибудь можно этот участок кода оптимизировать ?

Спасибо
Изменено: roocs - 05.04.2017 08:48:01
переключение режима доступа и сохранение без изменений, переключение режима доступа и сохранение без изменений
 
Добрый день.

Мне требуется обработать файл, который создан в режиме совместного доступа и закрыть его не сохраняя изменений.
Для этого я  перевожу его в режим ExclusiveAccess, затем обрабатываю и закрываю. Так файл сохранится с изменением по режиму доступа.
Если я его в конце обработки пробую переключить на MultiUserEditing, то получаю ошибку, как в приведенном фрагменте.
Можно ли вернуть файлу свойство MultiUserEditing без сохранения изменений ?

Код
Dim accessProp As Boolean
accessProp = False
...
'открытие книги
Workbooks.Open tmpFileName, UpdateLinks:=0

'проверка на совместный доступ
If ActiveWorkbook.MultiUserEditing Then
            ActiveWorkbook.ExclusiveAccess
            accessProp = True
End If
Set tmpWB = ActiveWorkbook
....
....
....

'закрытие книги
If (accessProp = True) Then
            'tmpWB.MultiUserEditing <- ошибка INVALID USE OF PROPERTY
            'accessProp = False
End If
tmpWB.Close savechanges:=False

Спасибо
Automation error - Вызванный объект был отключен от клиентов
 
Добрых суток

Мне требуется создать новую книгу, куда войдет три листа(Errors,REPORT,Summary)
из текущей (та, которая с макросами). Лист REPORT содержит две сводные и несколько срезов.
При выполнении копирования получаю ошибку
Код
Run-time error '-2147417848 (80010108)':
Automation error - Вызванный объект был отключен от клиентов
После чего Excel сам закрывается. Указанная ошибка возникает на Office 2013. На машине с Office 2010 ошибки нет - все работает как надо

Код где копирую листы (пробовал разными вариантами)
Код
    Dim outputWorkbook As Workbook
    Set outputWorkbook = Workbooks.Add
    Dim dt As String
    Dim outFilename As String
    dt = Format(CStr(Now), "ddmmyyyyhhmmss")
    outFilename = ThisWorkbook.Path & "\REPORT_" & dt
    outputWorkbook.SaveAs outFilename
    'currentWB.Worksheets("Errors").Copy outputWorkbook.Worksheets(1)
    'currentWB.Worksheets("REPORT").Copy outputWorkbook.Worksheets(2) '<-Ошибка тут
    'currentWB.Worksheets("Summary").Copy outputWorkbook.Worksheets(3)
    currentWB.Worksheets("Errors").Copy before:=outputWorkbook.Sheets(1)
    currentWB.Worksheets("REPORT").Copy before:=outputWorkbook.Sheets(1) '<-Ошибка тут
    currentWB.Worksheets("Summary").Copy before:=outputWorkbook.Sheets(1)
        
    outputWorkbook.Close savechanges:=True

Спасибо
ошибка при обновлении сводной таблицы
 
Доброго времени суток

Строю таблицу Summary на листе Data, которая должна обновить сводную Svod на листе REPORT. К сожалению, саму сводную строил не я - это наследство :(

Этот код выполняется когда лист Data активен
Код
'создание таблицы Summary
ActiveSheet.ListObjects.Add(xlSrcRange, Range(Cells(2, 1), Cells(getLastRow("A"), getLastColumn("A", 2))), , xlGuess, xlNo).Name = "Summary"
ActiveSheet.ListObjects("Summary").TableStyle = "TableStyleLight14"
'обновить все
Refresh 
Для обновления сводной нашел функцию отсюда

http://www.planetaexcel.ru/forum/index.php?FID=1&MID=501177&PAGE_NAME=message&TID=59837#message50117...
Код
'функция обновления сводной таблицы
Sub Refresh()
    Dim nName As Name
    Dim x As PivotCache
 
    'http://www.planetaexcel.ru/forum/?PAGE_NAME=read&FID=8&TID=34084
 
    For Each nName In ThisWorkbook.Names
      If nName.Name Like "Svod" Then nName.Delete 'удаляем имя для диапазона сводной (прошлое)
    Next nName
    'создаём новое имя с тем же названием для нового диапазона
    Sheets("Data").Range("A5").CurrentRegion.Name = "Svod"
         
    'Лист на котором сводная
    ThisWorkbook.Sheets("REPORT").Activate
    For Each x In Application.ActiveWorkbook.PivotCaches
        x.MissingItemsLimit = xlMissingItemsNone
        x.Refresh  'ОШИБКА ТУТ
    Next
End Sub
Получаю ошибку следующего содержания

Run-time error '1004':
Недопустимое имя поля сводной таблицы. Чтобы создать сводную таблицу, используйте данные,
организованные в виде списка с заголовками столбцов. Для изменения имени поля сводной таблицы введите новое имя.


Если проверять макрорекодером, то видно, что глючит диапазон источника - размер строк и столбцов иной чем в Summary.
Можно ли указать для сводной что источник Summary? или как скорректировать диапазон источника ?

Спасибо

P.S. файл приложить не могу :(
Как скопировать лист на новый в рамках одной книги
 
Как скопировать лист на новый (с заданным именем) в рамках одной книги ? Оба листа должны находится в одной книге

делаю
Код
'добавляю новый лист в текущую книгу
currentWB.Sheets.Add.Name = "Data"
'копирую
currentWB.Worksheets("OLD_Data").Copy Worksheets("Data")

результатом является создание листа Data (он чистый)  и создается лист OLD_Data(2) в который было выполнено копирование

???
Изменено: roocs - 23.10.2016 19:50:09
длинные номера становятся экспоненциальными
 
Копирую данные VBA макросом из нескольких книг в одну
В нескольких столбцах, в которых содержатся значения из 20-25 цифр, часть данных копируется с превращением в экспоненциальную форму

Было   12345678901234500000  
стало 1.23457E+19

При этом если в экспоненциальную ячейку "влезть" и нажать enter, то  значение будет  12345678901234500000  

Текстовый формат на столбец не помог
Код
Set rng = ActiveSheet.Range("Z3:Z" & getLastRow("Z"))
rng.NumberFormat = "@"

Как это устранить ?
Удалить отфильтрованные строки с учетом условий
 
Пытаюсь удалить отфильтрованные строки с учетом условий  

то есть например после фильтрации получилось такая таблица.
user1 34 r input
user2 12t output
user3 34 y output
user4 12 u input
user5 35 y input
надо оставить только

user535 y input
В реальности таблица больше по столбцам и по строкам

пробую вот так, но мне кажется решение должно быть проще.

Код
Worksheets("Summary").Activate

Dim countRows As Long
Dim accounts As String
Dim rTable As Range
Dim rRow As Range
Dim j As Long
    
'массив для сохранения номеров фильтрованных строк
Dim numArray() As Long
    
For i = 0 To countRowsFromWS_Input - 2  
   'i-ое значение в критерий из массива
        ActiveSheet.ListObjects("sumTable").Range.AutoFilter Field:=19, Criteria1:=valuesArray(i)
        countRows = CountVisibleRows(1)
        ReDim numArray(countRows)
        j = 0
        
        'сбор номеров фильтрованных строк
        Set rTable = ActiveSheet.UsedRange
        For Each rRow In rTable.SpecialCells(xlCellTypeVisible).Rows
            numArray(j) = rRow.Row
            j = j + 1
        Next rRow
        
        'первый элемент пропуск - шапка   
        For j = countRows To 1 Step -1
            If (Range("B" & numArray(j)).Value = Range("B" & numArray(j - 1))) Then
                        Range("B" & numArray(j)).EntireRow.Delete (xlUp)
                        Range("B" & numArray(j - 1)).EntireRow.Delete (xlUp)
                
            End If
        Next j
   'оставшиеся строки копировать
Next i


Спасибо
Как узнать количество отфильтрованных строк?
 
Мне надо обработать отфильтрованные строки

Как узнать количество отфильтрованных строк ? Сейчас в visibleCellsCount почему-то заоблачное число
фрагмент кода
Код
Dim visibleCells As Range
Dim visibleCellsCount As Long
Dim j As Long

For i = 2 To countSizeWorksheet1
        account = valuesArray(i)
        ActiveSheet.ListObjects("Summary").Range.AutoFilter Field:=10, Criteria1:=account
        Set visibleCells = ActiveSheet.UsedRange.SpecialCells(xlCellTypeVisible)
        visibleCellsCount = ActiveSheet.UsedRange.SpecialCells(xlCellTypeVisible).Count
        j=1
        while (j<visibleCellsCount) 'как узнать количество отфильтрованных строк ?
            '... манипуляции 
            'if (условие) then удаление строки текущей и одной из следующих
next i

Спасибо
Изменено: roocs - 13.09.2016 09:37:02
Несоответствии типов SQL и VBA
 
Добрый день

Пытаюсь обратится к листам через SQL запрос, чтобы получить выборку данных, например все данные с 3 часов до 8 часов.

Отлавливаю ошибку
Run-time error '-2147217913 (80040e07)
Несоответствие типов данных в выражении условия отбора

Сам код как мне кажется рабочий.
Так если SQL запрос ограничить таким вариантом
sSQL = "SELECT * FROM " & tableName
то все работает, но проблема у столбца со временем, в котором значения становятся некорректными вместо 2:54:00 там 00.01.1900  2:54:00.

Предполагаю что ошибка в несоответствии типов SQL и VBA.

Соответственно фрагмент  кода, где это все происходит.


Код
...
    Dim startLT As Double
    Dim endLT As Double
    startLT = ThisWorkbook.Worksheets(1).Range("D7").Value
    endLT = ThisWorkbook.Worksheets(1).Range("E7").Value
   
    'преобразую в формат пользовательский hh.hh в формат hh:mm:ss  (т.е. 2.5 = 2:30:00)
    Dim startTime As Date
    Dim endTime As Date
    startTime = CDate(startLT / 24)
    endTime = CDate(endLT / 24)

    Dim CN As New ADODB.connection         
    CN.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
                            "Data Source=" & fName & _
                            ";Extended Properties=""Excel 12.0;HDR=YES"""
    CN.Open
    
    'листы для запросов
    Dim names
    names = Array("000", "001", "010", "011", "100", "101", "110")
    Dim i As Long
    Dim sSQL As String
    Dim tableName As String
    Dim sqlTime As String
    sqlTime = "SQLTime"            'заголовок столбца
    For i = 1 To UBound(names, 1)
        
        ActiveWorkbook.Worksheets("Summary").Activate
        
        'очистка для удобства теста
        ActiveSheet.Cells.Select
        Selection.Delete xlUp
        Selection.Clear
        
        Set RS = Nothing
        Set RS = CreateObject("ADODB.Recordset")
        
        tableName = "[" & CStr(names(i)) & "$]"
        sSQL = "SELECT * FROM " & tableName & " WHERE " & sqlTime & " BETWEEN '" & startTime & "' AND '" & endTime & "'"
       
        'в окне locals значения 
        'sSQL ="SELECT * FROM [001$] WHERE SQLTime BETWEEN '3:00:00' AND '8:00:00'"
        'startTime=#3:00:00#        '<- тип Date
        'endtime=#8:00:00#          '<- тип Date


        MsgBox sSQL
        RS.Open sSQL, CN              ' <<<< РУГАЕТСЯ НА ЭТУ СТРОКУ
        ActiveWorkbook.Worksheets("Summary").Activate
        Range("A1").CopyFromRecordset RS
    Next i
...
Подскажите, как исправить проблему

Спасибо
Страницы: 1
Наверх