В Excel есть ли способ сделать верхнюю часть страницы редактируемой областью просмотра для деталей, которые отображаются в списке ниже? - PullRequest
0 голосов
/ 19 ноября 2018

Извините, но я не уверен, как это объяснить, так что, возможно, я смогу показать это с помощью картинки.

Id:       4
English:  Here is an area to enter a lot of data
Japanese: Japanese language meaning of the above


Id        English                Japanese
1         abc                    def
2         ghi                    jol
3         mno                    per
4         Here is an area to ..  Japanese Language meaning of the above
5         aaa                    bbb

В верхней части экрана мне нужна область редактирования, где я могу увидеть полный текст и ввести новый.В то время как ниже я хотел бы, чтобы много строк данных, и когда я нажимаю на любую часть строки, я хотел бы, чтобы она отображалась выше.

Я мог бы написать код решения, если бы нашел какой-то пример, который мог бы найти, но сейчас я даже не уверен, что искать или у формы такого типа есть конкретное имя.

Ответы [ 3 ]

0 голосов
/ 04 декабря 2018

Я использую Excel, и этот фрагмент кода отлично работает на моей стороне, не уверен, что это работает для Office 365.

Сначала заморозьте заголовок и строки над ним.

Затем, если ваши данные находятся на листе 1, то на листе 1 должны быть следующие два фрагмента кода, а также функции событий рабочего листа.

Private Sub Worksheet_SelectionChange(ByVal Target As Range)    'show data of the select cells

Dim activergn, insctrgn  ' active range and intersect range

Set activergn = Range("a7:c" & Range("a65536").End(xlUp).Row)   ' initial range, you could use "7:"& Range("a65536").End(xlUp).Row to achive "any part of the row"
Set insctrgn = Application.Intersect(Target, activergn)

If Not insctrgn Is Nothing Then 'if target range is in the datarange,then B3 & C3 show the value of target address

    Range("b1").Value = "$B$" & insctrgn.Row
    Range("b2").Value = Range("a" & insctrgn.Row).Value
    Range("b3").Value = Range("b" & insctrgn.Row).Value
    Range("b4").Value = Range("c" & insctrgn.Row).Value
    Exit Sub
End If

End Sub

Private Sub Worksheet_Change(ByVal Target As Range) 'when value in cell b3 change, update target cell

If Target.Address = Range("b3").Address Then 'if edit in cell B3, then update target cell to value of B3
    Range(Range("b1").Value).Value = Target.Value
    Exit Sub
End If


End Sub

enter image description here

0 голосов
/ 07 декабря 2018

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

Создание пользовательской формы

  • В VBE щелкните правой кнопкой мыши свой проект> Вставить> Форма пользователя
  • Добавьте 3 текстовых поля для представления столбцов данных и добавьте метки
    • В моем примере я добавил 4-е текстовое поле, чтобы указать номер строки. Вы можете использовать это текстовое поле, чтобы изменить строку #, не нажимая на лист при желании
  • Добавьте две командные кнопки, одна из которых будет обновлять лист в соответствии с любым текстом, который вы внесли, а другая - выйти из формы.
  • Назовите объекты чем-то значимым
    • Я назвал форму пользователя ufDataViewer
      • Это можно сделать в окне просмотра свойств в (Name)
        enter image description here
    • Назовите кнопку Обновить btnUpdate
    • Назовите кнопку Отмена на btnCancel
    • Назовите текстовое поле ID на tbID
    • Назовите поле № строки в tbRow
    • Назовите текстовое поле на английском языке tbEnglish
    • И, наконец, назовите окончательное текстовое поле tbJapanese

Пример созданной пользовательской формы: enter image description here

Обнаружение изменений выбора

В модуле кода рабочего листа вы можете использовать событие Worksheet_SelectionChange() для автоматического обновления текста в вашей пользовательской форме. В VBE выберите конкретный лист, который вы хотите наблюдать за этими изменениями, и добавьте следующий блок кода:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    With ufDataViewer
        .tbID.Value = Me.Cells(Target.Row, "A").Value
        .tbRow.Value = Target.Row
        .tbEnglish.Value = Me.Cells(Target.Row, "B").Value
        .tbJapanese.Value = Me.Cells(Target.Row, "C").Value
    End With
End Sub

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

Способ отображения формы

Нам нужно добавить код, чтобы показать форму пользователя. У нас есть несколько способов справиться с этим, и вы можете смешивать и сочетать любые из этих методов (Вам не нужно делать все это!) .

Показать пользовательскую форму при открытии рабочей книги

В обозревателе проектов VBE дважды щелкните ThisWorkbook и добавьте следующий блок кода:

Private Sub Workbook_Open()
    ufDataViewer.Show vbModeless
End Sub

Для следующих двух методов вам сначала необходимо создать процедуру в общедоступном модуле, которая будет показывать форму пользователя. В проводнике проекта щелкните правой кнопкой мыши свой проект и вставьте Module. Добавьте этот код к этому модулю:

Sub showUserform()
    ufDataViewer.Show vbModeless
End Sub

Использовать диалоговое окно макроса

Вы можете просто запустить вышеуказанный код, одновременно нажимая клавиши Alt F8 и выбирая showUserform и нажимая Выполнить .

Показ пользовательской формы с помощью кнопки команды рабочего листа

  1. Добавьте командную кнопку, перейдя к рабочему листу и перейдя к Developer Tab (Если это не видно, вот шаги для его активации .)

  2. Когда вы видите эту вкладку, нажмите Вставить и под Элементы управления формой , нажмите Button.

  3. Теперь вы можете перетащить кнопку на рабочий лист. Вы можете выбрать местоположение и размер этого элемента управления. После того, как вы закончите рисовать свою кнопку, появится диалоговое окно. Выберите название кода, который вы только что добавили: showUserForm

Кодирование пользовательской формы

Щелкните правой кнопкой мыши свою пользовательскую форму в Project Explorer и выберите View Code. Здесь мы собираемся назначить различные функции для вашей пользовательской формы. Во-первых, давайте добавим переменную области модуля, которая будет ссылаться на ваш рабочий лист. Вверху модуля кода введите следующие две строки:

Option Explicit

Private ws As Worksheet

Далее мы добавим некоторый код, который будет определять, что произойдет при инициализации вашей формы. Во-первых, мы хотим установить переменную ws, которая была только что создана выше, на лист, на котором вы будете использовать эту форму. Поскольку вы не указали имя листа в своем вопросе, мы будем использовать имя листа Sheet1 (не стесняйтесь обновлять имя ws здесь).

Мы также хотим продолжить и автоматически заполнить текстовые поля в пользовательской форме. Это будет выглядеть поразительно похоже на код, который мы ввели в модуле кода Sheet выше.

Private Sub UserForm_Initialize()
    Dim Target As Range
    Set ws = ThisWorkbook.Worksheets("Sheet1")
    ws.Activate
    Set Target = ActiveCell
    Me.tbID.Value = ws.Cells(Target.Row, "A").Value
    Me.tbRow.Value = Target.Row
    Me.tbEnglish.Value = ws.Cells(Target.Row, "B").Value
    Me.tbJapanese.Value = ws.Cells(Target.Row, "C").Value
End Sub

Обнаружение изменений в текстовом поле tbRow для автоматического заполнения пользовательской формы при изменении этого значения:

Private Sub tbRow_Change()
    If IsNumeric(tbRow.Value) Then
        Me.tbID.Value = ws.Cells(tbRow.Value, "A").Value
        Me.tbEnglish.Value = ws.Cells(tbRow.Value, "B").Value
        Me.tbJapanese.Value = ws.Cells(tbRow.Value, "C").Value
        ws.Cells(tbRow.Value, 1).Select 'Optional if you want to see row's raw data
    End If
End Sub

Фу, так что теперь мы разрешили вашей пользовательской форме автоматически заполняться либо путем изменения выбора, либо путем обновления текстового поля в самой пользовательской форме. Далее нам нужен метод для изменения значений ячеек на вашем листе. Мы сделаем это с помощью вашей кнопки «Обновить». Вот код:

Private Sub btnUpdate_Click()
    If IsNumeric(tbRow.Value) Then
        ws.Cells(tbRow.Value, 1) = tbID.Value
        ws.Cells(tbRow.Value, 2) = tbEnglish.Value
        ws.Cells(tbRow.Value, 3) = tbJapanese.Value
    Else
        MsgBox "Please enter a numeric value in the Row # textbox or reselect the row!"
    End If
End Sub

Наконец, когда нужен способ закрыть форму, как только вы закончите. Мы можем использовать событие click для вашей кнопки отмены, чтобы сделать это. Вот код этого события:

Private Sub btnCancel_Click()
    Unload Me
End Sub

Предварительный просмотр

enter image description here

0 голосов
/ 19 ноября 2018

Если вы используете Office 365, описанный вами сценарий будет более подходящим для списка SharePoint, где вы можете редактировать строку данных в форме.

Непонятно, как Office365 влияет на ваш вопрос, поскольку это модель лицензирования, а не версия программного обеспечения.

В Desktop Excel вы можете использовать объекты таблицы Excel в качестве источника данных и создавать формы VBA для ввода и отображения данных. Для этого есть множество примеров в Интернете и на этом сайте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...