Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Выбрать дату в календареВыбрать дату в календаре

Страницы: 1 2 3 4 5 6 7 8 9 10 11 ... 393 След.
Запустить макрос если получен Email в папке Outlook, Outlook как запустить макрос если в папку под названием "Задачи" пришло письмо
 
Цитата
Anton_Kozlov написал:
как прописать путь папки, если она не находится во входящих
Я выше в сообщении и коде именно это и показал
Цитата
Дмитрий(The_Prist) Щербаков написал:
единственное, я бы один момент изменил, если папка "Задачи" является вложенной в папку "Входящие". Вот так:
Если папка не во Входящих - то нужно заменять Inbox на нужную константу или имя. При этом возможно даже не GetDefaultFolder нужно будет использовать. Но т.к. информации мало(непонятно даже где эта папка, если не во Входящих - то ли как вложенная, то ли вообще не во Входящих), то расписывать здесь полный ликбез по обращению к папкам Outlook ни желания ни времени нет.
Изменено: Дмитрий(The_Prist) Щербаков - 27 янв 2021 09:37:13
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Подскажите, как наложить одну гистограмму на другую? или же одну поделить на две?
 
А вот еще вариант - при помощи дублирования данных и вспомогательной оси
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Макрос на изменение цвета текста, Чайник в VBA, не могу написать - Selection.Font.ColorIndex ))
 
Цитата
Товарищ Alibekov написал:
не получается уже 2-ой день
А макрорекордером пробовали это сделать? Он отлично показывает то, что Вам надо.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Подскажите, как наложить одну гистограмму на другую? или же одну поделить на две?
 
См. выше - приложил пример, как теоретически можно это сделать.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Подскажите, как наложить одну гистограмму на другую? или же одну поделить на две?
 
Лично я вот не понял, что именно надо. То ли в диаграмму что-то добавить каким-то хитрым способом, то ли вычислить величину, которая могла бы быть.
Если первое - в чем сложность, ведь в примере Вы это сделали? Или сделали не так, как хотелось? Тогда как хотелось?

В общем что именно хотели так и не понял - как вариант пример во вложении.
Изменено: Дмитрий(The_Prist) Щербаков - 27 янв 2021 09:07:20
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Сводная таблица из разных листов с разной шапкой
 
Цитата
havenoideas написал:
Но был нюанс
ну а кто о нем кроме Вас знал? :) Вы об этом не писали, пример данных не приложили. Да и по сути принцип от этого не меняется - надо лишь сначала дернуть из листов данные и подготовить их к "слейке"(удалить лишние столбцы, повысить заголовки).
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Автоматическая дата с текстом в ячейке., Автодата вместе с текстом, и прибавление к дате еще три числа.
 
Ну вообще, если не знаете даже для чего скобки - лучше начать изучать предмет более тщательно. С таким подходом далеко не продвинетесь и все задачи будут неподъемными
Код
=ТЕКСТ(СЕГОДНЯ()+3;"ДД.ММ.ГГГГ")
Изменено: Дмитрий(The_Prist) Щербаков - 26 янв 2021 18:12:50
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Заполнение массива объектом Shape
 
Цитата
khvostatyy написал:
ругается
тип аргумента в функции поменяли как я показал? Или оставили ParamArray?
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Передача переменной в пользовательскую форму
 
Цитата
Фарит написал:
переменная будет видна на уровне модуля?
Что такое переменная и как правильно её объявить?
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Заполнение массива объектом Shape
 
Не забывайте, что любая фигура и диаграмма это объект
Код
dim aShapes
ReDim aShapes(0 to 3)
'здесь можно и циклом, но принцип понятен
set aShapes(0) = ws.Shapes(5)
set aShapes(1) = ws.Shapes(6)
set aShapes(2) = ws.Shapes(7)
set aShapes(3) = ws.Shapes(8)
Call FillPP(oPPTPres, 2, aShapes)
забыл. Не забудьте после такого подхода изменить тип аргумента в функции:
Код
Function FillPP(pPres As Presentation, SlideNo As Long, cCharts)
Изменено: Дмитрий(The_Prist) Щербаков - 26 янв 2021 14:47:16
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Запустить макрос если получен Email в папке Outlook, Outlook как запустить макрос если в папку под названием "Задачи" пришло письмо
 
Цитата
Александр Моторин написал:
Application_NewMail
если мне не изменяет мой склероз, то это событие не отслеживает получение письма в конкретную папку. Это событие обрабатывает абсолютно все поступающие письма до того, как сработает какое-либо правило, например правило перемещения в определенную папку.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Запустить макрос если получен Email в папке Outlook, Outlook как запустить макрос если в папку под названием "Задачи" пришло письмо
 
Цитата
Anton_Kozlov написал: нужно чтобы срабатывал макрос от excel
во как. И как же он сработает? Вы будете из Outlook его запускать? Или все это хотите на стороне Excel сделать?
Куда помещаете приведенный выше код?

Кстати, сам код почти рабочий. единственное, я бы один момент изменил, если папка "Задачи" является вложенной в папку "Входящие". Вот так:
Код
Private WithEvents Items As Outlook.Items
Private Sub Application_Startup()
  Dim olApp As Outlook.Application
  Dim objNS As Outlook.NameSpace
  Set olApp = Outlook.Application
  Set objNS = olApp.GetNamespace("MAPI")
 ' default local Inbox
    Set Items = objNS.GetDefaultFolder(olFolderInbox).Folders("Задачи").Items
End Sub
Private Sub Items_ItemAdd(ByVal item As Object)
 
  On Error GoTo ErrorHandler
  Dim Msg As Outlook.MailItem
  If TypeName(item) = "MailItem" Then
    Set Msg = item
    ' ******************
    ' do something here
    MsgBox ("пришло письмо")
    ' ******************
  End If
ProgramExit:
  Exit Sub
ErrorHandler:
  MsgBox Err.Number & " - " & Err.Description
  Resume ProgramExit
End Sub
Если папка "Задачи" сама по себе - то этого можно не делать.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Запустить макрос если получен Email в папке Outlook, Outlook как запустить макрос если в папку под названием "Задачи" пришло письмо
 
Трудно с Вами...Остальные вопросы я себе, что ли задавал? :) Что не получается? На чем спотыкаетесь? Ошибки какие-то, результат не тот, в папке не ищет и т.д. Поймите - не интересно сидеть и накидывать тут предположения вроде "а что вообще не получается-то?".
Если продолжим в том же духе - я мимо.
Изменено: Дмитрий(The_Prist) Щербаков - 26 янв 2021 09:43:45
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Англоязычные форумы по VBA, ссылки на англоязычные форумы
 
Цитата
БМВ написал:
уровень экспертов там не выше чем есть тут
согласен. Посиживал одно время на нескольких довольно популярных. Разницы ноль.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Запустить макрос если получен Email в папке Outlook, Outlook как запустить макрос если в папку под названием "Задачи" пришло письмо
 
Цитата
Anton_Kozlov написал:
Нашел код в интернете
а мы нет. Нам тоже сначала поискать, чтобы Вам хоть в чем-то помочь или Вы им поделится можете?
Цитата
Anton_Kozlov написал:
как обычно не получается
а что именно? Или это как и код макроса угадать надо?

Ну и самое главное: Excel-то здесь при чем?
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
адрес полученный методом .address из VBA не воспринимается как ссылка в формулах EXCEL
 
Цитата
Vitalee написал:
разве у функции ЯЧЕЙКА есть третий аргумент?
ну ё-маё...уже поправил. Нету третьего. Я просто ошибся - это к UDF относится. Можно же понять хотя бы по коду-то....Писал ДО файла. И на коленке. Да и у Вас там неудобно в сообщении выложено - разделители аргументов то запятые, то точки...Вот и перепутал, а заметил не сразу.
Изменено: Дмитрий(The_Prist) Щербаков - 26 янв 2021 09:07:18
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Конфликт макросов
 
Так. Мой код Вы пробовать так и не хотите - так зачем помощи просите? У Вас в коде ошибки обращения.
Например:
Код
ImaKnig1.Activate
Sheets("Спецификация").Range("B5").Select
Что здесь написано? Активировать книгу ImaKnig1. А потом сразу выделить ячейку на листе "Спецификация". А как это произойдет, если книга активируется на листе "Начало"? Надо сначала уж тогда лист активировать.
Далее. Если уж даже выделили - у Вас при выделении срабатывает код на событие Calcualte. Который сбрасывает буфер обмена, что делает вставку значений невомзожным.
Посмотрите уже внимательнее на мой код. У меня там отключение событий сделано ДО ЛЮБЫХ этих событий. Либо уж разберитесь какие события Вам нужны и копируйте после них. Да и копировать можно без перехода на книги - это я тоже показал. Что Вам мешает делать так?
Код
Application.EnableEvents = False 'отключаете обработку событий (чтоб не срабатывала вставка только значений)(Application.Undo)
  Workbooks.Open (ImaKnig2)
  Workbooks(ImaKnig3).Worksheets("Спецификация").Range("B5:G705").Copy
'  ImaKnig1.Activate
'  Sheets("Спецификация").Range("B5").Select
  ImaKnig1.Sheets("Спецификация").Range("B5").PasteSpecial Paste:=xlPasteValues
'  Range("B5").Select
  
  Application.CutCopyMode = False 'очистка буфера обмена
  Workbooks(ImaKnig3).Close (False)
  Application.EnableEvents = True 'включаете обработку событий
не будет и ошибок и действий меньше.
Настоятельно рекомендую ознакомиться:
Как обратиться к диапазону из VBA
Select и Activate - зачем нужны и нужны ли?

P.S. Если уж выкладываете коды и файлы, то хоть жизненно приближенными их делайте. А то файлы 1 и 2 содержат объединенные ячейки и в этих файлах Вы в них КОПИРУЕТЕ. Я же не просто так написал - я тоже опирался именно на эти файлы. Кто ж знал, что напишите Вы одно, а делаете другое?  :)  
Изменено: Дмитрий(The_Prist) Щербаков - 26 янв 2021 09:03:32
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
адрес полученный методом .address из VBA не воспринимается как ссылка в формулах EXCEL
 
Цитата
Vitalee написал:
ДВССЫЛ(ссылка_на_текст;[a1])и ЯЧЕЙКА(тип_сведений;[ссылка])
найдите два различия :) функция ЯЧЕЙКА требует не адрес ячейки, а саму ячейку, как объект.
Т.е. Ваша функция тогда должна выглядеть так:
Код
Function getAddress(sv As Integer, r As Range, sType As String)

For Each Item In r
If Item.Value = sv Then
If sType = "str" Then 'нужен только адрес
getAddress = Item.Address
Else
Set getAddress = Item
End If
Exit Function
End if
Next Item

End Function
а вызывать её так:
Код
= ДВССЫЛ(getAddress(1;A1:D15))
= ЯЧЕЙКА("адрес";getAddress(1;A1:D15;"obj"))
Изменено: Дмитрий(The_Prist) Щербаков - 26 янв 2021 09:05:31 (Не туда "obj" закинул)
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Почему TextBox преобразовывает "¶" в перенос строки, UserForm. TextBox transform Chr(182) = "¶" To Chr(13)&Chr(10) = vbCrLf (or vbNewLine platform specific)
 
Цитата
Jack Famous написал:
там целый отладочный тест для наглядности
не буду спорить, тебе виднее, как проблему со стороны читать не тому, кто этот отладочный тест придумал :) я лишь написал, что сходу не очень понятно куда именно вообще смотреть. По сути во всем твоем коде хватило бы одной строки для пояснения:
Код
Debug.Print "4.", Me.tb.Value = vbNewLine
во всем остальном, если честно, смысла что-то не углядел для определения проблемы...
Изменено: Дмитрий(The_Prist) Щербаков - 25 янв 2021 18:03:39
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Почему TextBox преобразовывает "¶" в перенос строки, UserForm. TextBox transform Chr(182) = "¶" To Chr(13)&Chr(10) = vbCrLf (or vbNewLine platform specific)
 
собственно, я вообще не понимаю в чем здесь баг или фича... А что ты ожидал увидеть? Твой символ, если его перевести в числовое представление:
Код
asc(ch) = 182
Т.е. это как бы и не перевод каретки и не перевод строки. Это символ из набора символов, который не является каким-то специальным в том представлении, чтобы TextBox его как-то иначе интерпретировал.
Или я что-то не так понял?
А, все. Без более точных пояснений плохо понятно, куда именно смотреть. Ты хоть пояснялки-то оставляй, не скупись на слова. Кто там знает куда именно смотреть-то... Думаю, sokol прав.
Цитата
sokol92 написал:
следствие установки свойства Multiline=False
Изменено: Дмитрий(The_Prist) Щербаков - 25 янв 2021 18:01:10
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
BA переход к следующему действию если файла нет, VBA ошибка если файл отсутствует в папке
 
Цитата
RADLE написал:
через ElseIF и Else у меня тоже не получилось
а зачем они здесь? Для каждого открываемого файла делаете отдельный IF как я показал и все. Тут не нужны Else. По крайней мере я такой необходимости не вижу.
Совет Вам: если не понимаете принцип работы If и т.п. - изучайте. Благо информации сейчас в интернете много. Тыкать и впихивать конструкции, работу которых не понимаете, не очень хорошая практика.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Конфликт макросов
 
Вы не заметили, что у Вас там ошибка возникает, т.к. вставить данные пытаетесь в объединенную ячейку? Копируйте без заголовков и не создавайте себе проблем:
Код
Application.Workbooks(ImaKnig3).Worksheets("Спецификация").Range("A5:J23").Copy
        ImaKnig1.Sheets("Спецификация").Range("A5").PasteSpecial xlPasteValues
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
BA переход к следующему действию если файла нет, VBA ошибка если файл отсутствует в папке
 
Очень неудобно в такой портянке разгребаться. Но по сути, самое простое и надежное, это проверять через Dir:
Код
IOK = Dir(odir)
If IOK <> "" then
'блок обработки этого самого IOK
end if
и по сути так со всеми проверяемыми файлами. На примере вот этого куска(не уверен, правда, что правильно все захватил)
Код
Workbooks.OpenText Filename:= _
        iPapka1, Origin:=xlWindows, _
        StartRow:=1, DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, _
        ConsecutiveDelimiter:=False, Tab:=True, Semicolon:=False, Comma:=False _
        , Space:=False, Other:=False, FieldInfo:=Array(1, 1)
         
INK = Dir(iPapka)
INK1 = Dir(iPapka1)
INK2 = Dir(iPapka2)
INK3 = Dir(iPapka3)
INK4 = Dir(iPapka4)
             
Range("A3:K100").Select
Selection.AutoFilter
Selection.AutoFilter Field:=3, Criteria1:=blanks, Operator:=xlAnd
 
Range("A4:K100").SpecialCells(xlCellTypeVisible).EntireRow.Delete
 
 ActiveSheet.Range("$A$3:$K$41").AutoFilter Field:=3, Operator:= _
        xlFilterValues, Criteria2:=Array(2, fDate)
         
ActiveSheet.Range("$C$4:$C$100").Select
Selection.Copy
 
Windows(ITK).Activate
Sheets(SSheet2).Select
Cells(LastRow + 1, 1).Offset(0, 10).Select
'Cells(LastRow, 1).Offset(1, 0).Select
ActiveSheet.Paste
Windows(INK1).Activate
 
ActiveSheet.Range("$F$4:$I$100").Select
Selection.Copy
Windows(ITK).Activate
Sheets(SSheet2).Select
Cells(LastRow + 1, 1).Offset(0, 11).Select
'Cells(LastRow, 1).Offset(1, 0).Select
ActiveSheet.Paste
 
Windows(INK1).Activate
Windows(INK1).Close
его записать можно так:
Код
If Dir(iPapka1) <> "" then
Workbooks.OpenText Filename:= _
        iPapka1, Origin:=xlWindows, _
        StartRow:=1, DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, _
        ConsecutiveDelimiter:=False, Tab:=True, Semicolon:=False, Comma:=False _
        , Space:=False, Other:=False, FieldInfo:=Array(1, 1)
         
INK = Dir(iPapka)
INK1 = Dir(iPapka1)
INK2 = Dir(iPapka2)
INK3 = Dir(iPapka3)
INK4 = Dir(iPapka4)
             
Range("A3:K100").Select
Selection.AutoFilter
Selection.AutoFilter Field:=3, Criteria1:=blanks, Operator:=xlAnd
 
Range("A4:K100").SpecialCells(xlCellTypeVisible).EntireRow.Delete
 
 ActiveSheet.Range("$A$3:$K$41").AutoFilter Field:=3, Operator:= _
        xlFilterValues, Criteria2:=Array(2, fDate)
         
ActiveSheet.Range("$C$4:$C$100").Select
Selection.Copy
 
Windows(ITK).Activate
Sheets(SSheet2).Select
Cells(LastRow + 1, 1).Offset(0, 10).Select
'Cells(LastRow, 1).Offset(1, 0).Select
ActiveSheet.Paste
Windows(INK1).Activate
 
ActiveSheet.Range("$F$4:$I$100").Select
Selection.Copy
Windows(ITK).Activate
Sheets(SSheet2).Select
Cells(LastRow + 1, 1).Offset(0, 11).Select
'Cells(LastRow, 1).Offset(1, 0).Select
ActiveSheet.Paste
 
Windows(INK1).Activate
Windows(INK1).Close
end if
Самая сложность здесь, это непонимание происходящего в Вашем коде. А сидеть и разбираться - куча времени, если не знать что там должно происходить. Есть подозрение, что все можно сделать компактнее и правильнее, но....
Потому как если операции всегда одинаковые, то тут массивы с именами файлов и циклы напрашиваются...
Изменено: Дмитрий(The_Prist) Щербаков - 25 янв 2021 17:18:49
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Узнать имя активного окна, q = ActiveWindow.Name не работает
 
Цитата
звездочка яркая написал:
Ну откуда вы это знаете?
А Вы когда вписываете в редакторе ActiveWindow и ставите точку - у Вас список выпадает? Если да - то использовать можно только то, что в этом списке есть. Иначе ошибка будет, т.к. ни одна программа не умеет обращаться к свойствам и методам, которые еще не реализованы :)
Если список не выпадает - идете в редакторе VBA в Tools -Options -вкладка General и ставите галочку напротив Auto List Members. После этого появление списка при проставлении точки будет работать.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Как сохранить/открыть скачанный файл в Internet Explorer, Вы хотите открыть или сохранить файл?
 
Цитата
Anton_Kozlov написал:
легко скачать файл из интернета?
легко это не бывает, т.к. сначала надо выудить корректную ссылку на этот файл. А уж скачать без проблем: Как скачать файл из интернета по ссылке
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Перенос значений всех столбцов в один столбец
 
artelow, Power Query у Вас встроена уже. Все инструменты для работы с ней расположены на вкладке Данные -группа кнопок Получить и Преобразовать
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Поиск по всей книге
 
Так а зачем тогда ДВЕ темы создавать по одному вопросу? Это ведь тоже Ваша тема? - Перенос кнопки с макросом из одного документа в другой

Ну и по сабжу: неужели в интернете нет совсем никаких инструкций о том, как коды из одного файла в другой переносить? Это к слову о "не могу". Вы хоть пытались перенести? Там три движения мышью надо сделать и кнопку скопировать из одного файла в другой. Ну и форму поиска переименовать для начала, хотя бы в UserForm3, чтобы конфликта не было. В общем сложностей по факту нет и для этой задачи даже знать VBA не надо.
Алгоритм:
0. Переходите в проект VBA(Alt+F11). Отображаете окно проектов(Ctrl+R). Находите там открытые файл 1 и 2 (VBAProject(1.xlsm) и VBAProject(2.xlsm)
1. в файле 1 (VBAProject(1.xlsm) находите папку Forms, раскрываете её и переименовываете там форму UserForm1 в ufFind(F4 -двойной щелчок левой кнопкой мыши на UserForm1 -для свойства (Name) вписываете ufFind)
2. После этого выделяете её(форму ufFind) левой кнопкой мыши и удерживая эту левую кнопку мыши переносите в проект файла 2 (он будет там же жирным выделен VBAProject(2.xlsm)
3. Копируете кнопку из файла 1
4. В модуле Module1 у Вас есть такой код:
Код
Sub Кнопка1_Щелчок()
UserForm1.Show
End Sub
дополняете его еще одной процедурой, чтобы получилось так:
Код
Sub Кнопка1_Щелчок()
UserForm1.Show
End Sub
'вызов формы поиска
Sub CallFind()
ufFind.Show
End Sub
5. Правая кнопка мыши на скопированной в файл 2 кнопке -Назначить макрос. Выбираете CallFind.
6. ВСЕ.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Поиск по всей книге
 
А где там поиск хотя бы по одному листу? Там только внесение данных, ни про какой поиск даже намека нет. Или под словом помогите надо понимать "сделайте поиск с нуля"? :)
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Выпадающий список из нескольких диапазонов, Выпадающий список из нескольких диапазонов. Объединение нескольких списков в один. Объединение диапазонов в один
 
Цитата
skais675 написал:
нужно объединить диапазоны типа двух таких
тут главный вопрос в том, можно ли это делать на отдельном листе. Т.е. объединить нужное на отдельном листе и уже из него брать неразрывный диапазон для списка. Если нет - то вариантов нет вообще.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Конфликт макросов
 
Цитата
apawa написал:
то бывает ошибка 400
ну вообще в общем случае ошибка 400 это невозможность отобразить в модальном режиме форму, т.к. на данный момент уже запущена другая форма в модальном режиме. Можете привести текст ошибки? В моем коде тоже самое?
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Страницы: 1 2 3 4 5 6 7 8 9 10 11 ... 393 След.
Наверх