Новости:

Форум на данный момент в стадии обновления. Если у Вас возникли проблемы со входом в свою учетную запись - просьба писать на email: info@excel-vba.ru

Главное меню

Просмотр сообщений

В этом разделе можно просмотреть все сообщения, сделанные этим пользователем.

Просмотр сообщений

Сообщения - Alex_ST

#31
Что-то совсем я, наверное, старый и слепой стал: так и не увидел, где FlintFD просил листы расцвечивать? :)
#32
Ну да, соврал малость  :(
Конечно, так:   Dim myWorksheet As Worksheet
   For Each myWorksheet In Worksheets
      If myWorksheet.Range("A1") <> "" And IsNumeric(myWorksheet.Range("A1")) Then myWorksheet.Name = myWorksheet.Range("A1").Value
   Next

А Value для диапазона - это свойство по умолчанию, поэтому его указывать не обязательно.
#33
Цитата: olesya_pl от 21.01.2013, 13:03:31... Каждая ячейка в столбце содержит три строки ...
У Вас что, объёдинённые ячейки что ли?
Если ДА, то
Цитата: olesya_pl от 21.01.2013, 13:03:31...получить столбец с данными, содержащий только значения вторых строк...
очень просто - запишите туда везде 0 :)
А если НЕТ, то давайте пример.
#34
   Dim myWorksheet As Worksheet
   For Each myWorksheet In Worksheets
      If myWorksheet.Range("A1") <> "" And IsNumeric.Range("A1") Then myWorksheet.Name = myWorksheet.Range("A1").Value
   Next

#35
Вы издеваетесь?
Разве то,что Вы выложили, имеет что-нибудь общее кроме фрагмента кода с тем, что я Вам выкладывал ЗДЕСЬ 1,5 года назад?
У Вас что, ctrl+V заело?
Вы не видите, что Макрос1 у Вас вставился САМ в СЕБЯ 10 раз и VBE весь красный от стыда?
А где данные на листах, которые должен был обработать макрос?
И почему Вы, если что-то не поняли в ТОМ макросе, не задали вопрос в  ТОЙ теме?
#36
Цитата: The_Prist от 11.01.2013, 12:02:36это не неявное объявление - это позднее связывание
Дмитрий, я просто, увидев какие вопросы задаёт baters (несмотря на то, что у него уже более 300 постов), решил не употреблять терминов "позднее" и "раннее связывание", т.к. ясности это явно не внесло бы :)

P.S. А ведь пример он так в xls и не выложил, хоть я и намекнул, что по нему смог бы помочь. Наверное, я угадал и там, действительно, искалеченный кем-то кусок моего кода :)
#37
Если бы Вы выложили пример в формате Excel-2003, я бы его посмотрел...
Но что-то эти имена переменных, стиль фрагментов кода и комментариев очень похожи на те, что обычно использую я :)
Поэтому, на вскидку:
Dim wSh1 As Worksheet: Set wSh1 = [KOD1].Parent
Parent - это родительский объект. У диапазона родитель - лист. Следовательно [KOD1].Parent - это лист, на котором расположен диапазон [KOD1]
Dim Arr() - задаём переменную Arr(). () указывает, что тип переменной - массиы
Dim lRow& - задаём переменную lRow . & указывает, что тип переменной - long
With CreateObject("Scripting.Dictionary") - не явное объявление объекта СЛОВАРЬ.
Можно было бы, конечно и назначить переменную явно, типа Dim oDict As Object: Set oDict = CreateObject("Scripting.Dictionary")
но неявное объявление мне обычно нравится больше (не приходится назначать лишнюю переменную)
lRow = ... не видя всего кода пояснить не могу.
' сейчас .Items - это 1D-массив, каждый из элементов которого сам является 1D-массивом - я не понимаю, что тут написано не понятно?
' двойным транспонированием преобразуем 1D-массив 1D-массивов в 2D-массив - массив массивов на лист вывести нельзя, поэтому сначала нужно его преобразовать в двумерный массив. Наиболее просто (при числе элементов, кажется, до 65000) это делается функцией листа ТРАНСП (она же в VBA Application.Worksheetfunctions.Transpose)
#38
Серёга, а как быть если найти что-то нужно по всем листам книги? На каждом выбирать только одну ячейку что ли перед поиском?
А ведь, похоже, что так и есть. И именно поэтому данные иногда в книге не находятся, хотя точно знаю, что они есть на одном из листов :(
Я-то не мог понять, что за фигня!
Придётся на ctrl+f свой хоткей прописывать, который вызовет сначала процедуру прохода по всем листам и выделения только по одной ячейке, а потом уже собственно выполнит ctrl+f
#39
Попробуйте так:Function GetPath(Optional Title$ = "Выберите папку", Optional sPath$ = "") As String   ' выбор папки
    If sPath = "" Then sPath = ThisWorkbook.Path & "\"
    If Not Right$(sPath, 1) = "\" Then sPath = sPath & "\"
    With Application.FileDialog(msoFileDialogFolderPicker)
        .ButtonName = "Выбрать": .Title = Title: .InitialFileName = sPath
        If .Show = 0 Then Exit Function   'если нажали "Отмена", то GetPath = ""
        GetPath = .SelectedItems(1)   ' путь у первому элементу в выбранной папке
        If Not Right$(GetPath, 1) = "\" Then GetPath = GetPath & "\"   'если в папке - только файлы
    End With
    'GetPath = IIf(ChkPATH(sPath), GetPath, "")
End Function

С ярлыками сетевых папок и дисков проверить не могу, но ярлыки папок видит и по ним переходит куда надо.
#40
Нашёл и поправил пару мест, где надстройка вылетала в отладку по ошибке.
#41
Немного подполировал надстройку:
1. Сделал чтобы была независима от локализации (проверить не могу, но должна нормально работать и с другими названиями пунктов меню)
2. Чуть подчистил код в процедурах (только для красоты)
3. Переименовал надстройку чтобы опять же не было проблем локализаций.
#42
На Планете знающие люди мне посоветовали использовать метод FindControl чтобы по ID узнать Caption элемента управления.
Хоть и сложновато накручено получилось, но вполне работает:
Private Sub PopupMenuCellChange()   'изменение меню ячейки
   On Error Resume Next
   With Application.CommandBars("Cell")
      .Controls(.FindControl(ID:=370).Caption).Delete 'удалить "Вст&авить значения"
      .Controls.Add ID:=370, Before:=.Controls(.FindControl(ID:=22).Caption).Index + 1 'добавить "Вст&авить значения" после "Вставить"
   End With
End Sub


Спасибо всем. Вопрос снят.
#43
Excel-2003 !!!
Причёсываю свой Personal.xls
При его открытии производится настройка разных менюшек (добавляются/удаляются меню, кнопки и подменю)
Перед тем, как добавить макросом кнопку в меню, на всякий случай (чтобы не было дублирования) хорошо бы попытаться её удалить.
Добавить то стандартную кнопку можно просто по её ID, а вот как обратиться к .Controls не по индексу или капче кнопки (они могут меняться), а тоже по ID?

Вот, например, как я сейчас в выпадающее меню ячейки после "Вставить" добавляю стандартную команду "Вставить значения"
Private Sub PopupMenuCellChange()
  On Error Resume Next
  With Application.CommandBars("Cell"):
     .Controls("Вст&авить значения").Delete
     .Controls.Add ID:=370, Before:=.Controls("Вставить").Index + 1, Temporary:=True
  End With
End Sub
Оно, конечно, работает, но при смене наименований пунктов (например, в английской локали) работать перестанет, т.к. пункты "Вст&авить значения" и "Вставить" будут называться по-другому.
Но ведь при этом команда "Вст&авить значения" имеет вполне однозначный идентификатор ID:=370, а команда "Вставить" имеет ID:=22, которые, как я понимаю, не зависят ни от локализации, ни от версии Excel
Вот и встал вопрос: нельзя ли вместо обращения к стандартному элементу меню по его названию использовать обращение по его ID?
Что-то я не смог найти как :(
#44
driver,
без файла разобраться сложно, но скорее всего дело в том, что Вы спутали два похожих понятия: AutoFilter-объект и AutoFilter-метод
Методом осуществляется фильтрация.
Но чтобы её можно было осуществить нужно сначала создать объект.
Т.е. в Вашем случае, наверное, следует попробовать примерно так:
Range("B" & iGoCell, "G" & iGoCell).AutoFilter
Selection.AutoFilter Field:=1, Criteria1:=">=49", Operator:=xlAnd
#45
Вы ЗДЕСЬ цитируете мой пост, где я описку Дмитрия исправил.
А тестируете код из его поста, где он не заметил и не исправил опечатку.
Яндекс.Метрика Рейтинг@Mail.ru