Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 08.08.2013
Сообщений: 5
1

Работа с ячейками

14.08.2013, 18:42. Показов 1840. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Как узнать какая ячейка выделена на определенном листе Excel в VBA?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.08.2013, 18:42
Ответы с готовыми решениями:

Работа с ячейками
Интересует такой вопрос, каким способом отлавливать изменения в ячейках? Допустим дано 3 ячейки,...

Работа с ячейками в Exell
Добрый день. Есть ексель файл, где формируются отчеты, в ячейки записываются данные за каждый час...

Работа со сгруппированными ячейками
Доброго времени суток. С первым днём весны всех! Помогите, плз, закрыть группу на листе из кода....

Работа со строками и ячейками в excel
Добрый день. Сломал голову уже((( Имеются множество ячеек в которые я подтягиваю данные из текста...

5
3218 / 967 / 223
Регистрация: 29.05.2010
Сообщений: 2,087
14.08.2013, 19:18 2
На активном листе:
Visual Basic
1
ActiveCell.Address
Для других листов надо просто активировать:
Visual Basic
1
Sheets(1).Activate
1
Заблокирован
14.08.2013, 19:19 3
Только активировав определенный лист и спросив
Visual Basic
1
debug.print ActiveCell.Address
Меня давно интересует данный вопрос, но другого ответа ещё не нашёл
0
1588 / 382 / 108
Регистрация: 13.11.2008
Сообщений: 796
14.08.2013, 23:12 4
Как сказать... Есть метод через одно место. Через схемы XML можно получить адреса выделенных ячеек и диапазонов. Но. Для этого книгу необходимо пересохранять в формат XML-таблицы.
0
6082 / 1326 / 195
Регистрация: 12.12.2012
Сообщений: 1,023
15.08.2013, 00:02 5
The_Prist, надо же, я о том же самом подумал...

Вот что у меня получилось - интересно, отработает ли у вас?

Узнаем адреса активных ячеек
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
'Процедура, позволяющая узнать активные ячейки файла Excel, не открывая самого файла.
'В примере проверяется файл ActiveCells.xlsx, лежащий в папке C:\Temp\.
Sub GetActiveCells()
    Const cmdWinRarBegin = "C:\Program Files\WinRAR\WinRAR.exe e -o+"
    Const xmlActiveCellParam = "selection activeCell="""
    Const excelFolder = "C:\Temp\"
    Const excelFile = "ActiveCells.xlsx"
    Dim s As String, sheetXML As String, cmdWinRarFull As String
    Dim rVal As Long, n As Long, k As Long
    Dim t As String, cellAddr As String
    cmdWinRarFull = cmdWinRarBegin & " """ & excelFolder & excelFile & """ """ & excelFolder & """ "
    rVal = Shell(cmdWinRarFull, vbHide)
    s = Dir(excelFolder)
    Do
        If Left(s, 5) = "sheet" And Right(s, 4) = ".xml" Then
            sheetXML = "Лист " & Left(s, Len(s) - 4) & " - активна ячейка "
            n = FreeFile
            Open excelFolder & s For Input As #n
            Input #n, t
            Input #n, t
            k = InStr(t, xmlActiveCellParam)
            If k Then
                cellAddr = Mid(t, k + Len(xmlActiveCellParam))
                cellAddr = Left(cellAddr, InStr(cellAddr, """") - 1)
                Debug.Print sheetXML & cellAddr
            Else
                Debug.Print sheetXML & "A1"
            End If
            Close #n
        End If
        s = Dir
    Loop Until s = ""
End Sub


С уважением,
Aksima
1
1588 / 382 / 108
Регистрация: 13.11.2008
Сообщений: 796
15.08.2013, 09:04 6
Aksima, да, Ваш код у меня отработал.
Я наваял такой код. Он не зависит от версии файла Excel и не требует наличия архиватора winRAR.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
Sub GetActiveRange_fromXML()
    Dim xmlDoc As Object, xmlRoot As Object, xmlRNode As Object
    Dim xmlPane_Node As Object, xmlPanes_Node As Object, xmlWsOpt_Node As Object, xmlWs_Node As Object, xmlWb_Node As Object
    Dim sSelAddr As String, lR As Long, lC As Long
    Dim avTmp(), avRes(), lCnt As Long
    Dim sFileName As String, sNewFileName As String, sExtens As String
    
    sFileName = ThisWorkbook.Path & "\Книга1.xls"
    sExtens = Mid(sFileName, InStrRev(sFileName, "."))
    sNewFileName = Replace(sFileName, sExtens, ".xml")
    Workbooks.Open sFileName
    ActiveWorkbook.SaveAs sNewFileName, xlXMLSpreadsheet
    ActiveWorkbook.Close 0
    Set xmlDoc = CreateObject("Microsoft.xmldom")
    xmlDoc.async = False
    If Not xmlDoc.Load(sNewFileName) Then
        MsgBox "Возникла ошибка при загрузке файла. Возможно, файл испорчен."
        Exit Sub
    End If
    'по общим сведениям документа
    For Each xmlRNode In xmlDoc.ChildNodes
       If xmlRNode.BaseName = "Workbook" Then
            'по книге
            For Each xmlWb_Node In xmlRNode.ChildNodes
                If xmlWb_Node.BaseName = "Worksheet" Then
                    lCnt = lCnt + 1
                    ReDim avTmp(0 To 3)
                    avTmp(0) = "Лист №" & lCnt 'номер листа
                    lR = 1: lC = 1: sSelAddr = ""
                    'по листу
                    For Each xmlWs_Node In xmlWb_Node.ChildNodes
                        If xmlWs_Node.BaseName = "WorksheetOptions" Then
                            'по настройкам листа
                            For Each xmlWsOpt_Node In xmlWs_Node.ChildNodes
                                If xmlWsOpt_Node.BaseName = "Panes" Then
                                    'по областям листа
                                    For Each xmlPanes_Node In xmlWsOpt_Node.ChildNodes
                                        If xmlPanes_Node.BaseName = "Pane" Then
                                            'по области выделения
                                            For Each xmlPane_Node In xmlPanes_Node.ChildNodes
                                                If xmlPane_Node.BaseName = "ActiveRow" Then
                                                    lR = Val(xmlPane_Node.nodeTypedValue) + 1
                                                End If
                                                If xmlPane_Node.BaseName = "ActiveCol" Then
                                                    lC = Val(xmlPane_Node.nodeTypedValue) + 1
                                                End If
                                                If xmlPane_Node.BaseName = "RangeSelection" Then
                                                    sSelAddr = xmlPane_Node.nodeTypedValue
                                                End If
                                            Next xmlPane_Node
                                        End If
                                    Next xmlPanes_Node
                                End If
                            Next xmlWsOpt_Node
                        End If
                    Next xmlWs_Node
                    If sSelAddr = "" Then sSelAddr = Cells(lR, lC).Address(, , xlR1C1)
                    avTmp(1) = lR: avTmp(2) = lC: avTmp(3) = sSelAddr
                    ReDim Preserve avRes(lCnt - 1)
                    avRes(lCnt - 1) = avTmp
                End If
            Next xmlWb_Node
        End If
    Next
 
    If lCnt Then
        Cells(1, 1).Resize(, UBound(avTmp) + 1).Value = Array("Номер листа", "Строка", "Столбец", "Адрес выделения")
        For lR = LBound(avRes) To UBound(avRes)
            Cells(lR + 2, 1).Resize(, UBound(avTmp) + 1).Value = avRes(lR)
        Next lR
    End If
End Sub
Хотя не вижу практической ценности для этих кодов.... :-)

Добавлено через 15 минут
Aksima, кстати, Ваш код я бы немного сократил(саму малость - просто убрал лишнюю строку):
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    s = Dir(excelFolder & "sheet*.xml")
    Do
            sheetXML = "Лист " & Left(s, Len(s) - 4) & " - активна ячейка "
            n = FreeFile
            Open excelFolder & s For Input As #n
            Input #n, t
            Input #n, t
            k = InStr(t, xmlActiveCellParam)
            If k Then
                cellAddr = Mid(t, k + Len(xmlActiveCellParam))
                cellAddr = Left(cellAddr, InStr(cellAddr, """") - 1)
                Debug.Print sheetXML & cellAddr
            Else
                Debug.Print sheetXML & "A1"
            End If
            Close #n
        s = Dir
    Loop Until s = ""
1
15.08.2013, 09:04
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.08.2013, 09:04
Помогаю со студенческими работами здесь

Работа процедуры с ячейками таблицы
Ребята помогите выполнить задачу! Откройте новую рабочую книгу. Введите следующие значения в...

Работа с ячейками таблицы Word
нужно из документа Excel скопировать текст в ячейки таблицы WORD Как вставить текст в ворд...

И опять работа только с видимыми ячейками
Доброго времени суток всем) Хочу после применения автофильтра занести в массив только видимые...

Работа с ячейками книг форамата Data/Time и TextBox'ами
Доброго времени суток. Вот, пришел момент, когда знания были забыты (имхо это было давно, когда...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru