2015-09-18 2 views
1

После этого video У меня есть таблица, на которой есть поле «Редактировать историю», которое прокручивается вверх и вниз. Он использует окно прокрутки формы и список на вторичном листе для создания прокручиваемого списка. Проблема заключается в том, что вы не можете редактировать информацию в окне прокрутки (вы должны отредактировать ее на вторичном листе).Есть ли способ для редактирования списка прокручиваемого списка?

У меня есть VBA, который автоматически вводит имя человека в прокрутку, когда редактирует любую часть листа, а затем вводит «Примечание:» ниже этого. Я хочу, чтобы человек, чтобы иметь возможности редактировать «Примечание:» поле так, что они могут ввести причину их редактирование листа:

Edit History Box

Джон Смит и Джеймс Appleseed являются предыдущими пользователями этого листа. Когда Уэйн Смит приступает к редактированию листа, как только он вносит изменения, он добавляет «Уэйн Смит» и «Примечание:» к листу. (У меня уже есть эта часть, использующая VBA).

Из-за того, что реализован список прокрутки, на самом деле это всего лишь формулы в этом окне истории изменений. Если я дважды щелкните «Примечание:» чтобы попытаться изменить его, это то, что появляется:

Edit List - Unwanted Formula

Но то, что я хочу, чтобы это произошло, является возможность редактирования «Примечание:» коробка (без переключателя на вторичный лист, на котором фактически хранится список). По сути, я хочу создать текстовое поле с возможностью прокрутки, которое также доступно для редактирования, и работает с VBA.

Есть ли способ сделать это?

+0

Да, это можно сделать. Но формулы исчезнут полностью. С кодом VBA вы можете эмулировать точное поведение, видимое из формул ... а именно извлечь соответствующие данные из исходного текста и отобразить его в * поле * в ответ на прокрутку полосы прокрутки. –

ответ

1

Я собрал рабочий пример того, как это сделать.

Вы можете скачать книгу here.

Этот метод использует два листа в книге ... Sheet1 для списка и listboxdata для данных. Лист1 можно назвать чем угодно.

Возможно, было бы разумно скрыть лист listboxdata.

На Sheet1 вам нужна панель прокрутки Forms Control. Используйте поле «Имя» для его переименования: ScrollBar1. Назначьте ему процедуру Scroll().

Весь код для этого приложения должны быть размещены в модуле кода Лист1:

Option Explicit 

Private Const LISTBOX_SCROLLBAR = "scrollbar1" 
Private Const LISTBOX_DATASHEET = "listboxdata" 
Private Const LISTBOX_DATAHEADR = "a1" 
Private Const LISTBOX_SCROLLMAX = 50 
Private Const LISTBOX_SCROLLMIN = 1 

Private Sub Scroll() 
    Dim ListBoxRows&, n&, ndx&, v 
    On Error Resume Next 
    With Shapes(LISTBOX_SCROLLBAR) 
     SetProps ndx 
     ListBoxRows = .BottomRightCell.Row - .TopLeftCell.Row 
     v = ThisWorkbook.Sheets(LISTBOX_DATASHEET).Range(LISTBOX_DATAHEADR).Resize(ListBoxRows).Offset(ndx) 
     Application.EnableEvents = False 
     .TopLeftCell(, 0).Resize(ListBoxRows) = v 
    End With 
    Application.EnableEvents = True 
End Sub 

Private Sub Update(Target As Range) 
    With Shapes(LISTBOX_SCROLLBAR) 
     If Target.Column = .TopLeftCell(, 0).Column Then 
      If Target.Row >= .TopLeftCell.Row And Target.Row <= .BottomRightCell.Row Then 
       If Target.Count = 1 Then 
        ThisWorkbook.Sheets(LISTBOX_DATASHEET).Range(LISTBOX_DATAHEADR).Offset(.ControlFormat.Value + Target.Row - .TopLeftCell.Row) = Target 
       Else 
        Scroll 
       End If 
      End If 
     End If 
    End With 
End Sub 

Private Sub SetProps(Optional ndx&) 
    With Shapes(LISTBOX_SCROLLBAR).ControlFormat 
     .Min = LISTBOX_SCROLLMIN 
     .Max = LISTBOX_SCROLLMAX 
     ndx = .Value 
    End With 
End Sub 



Private Sub Worksheet_Change(ByVal Target As Range) 
    Update Target 
End Sub 

Private Sub Worksheet_Activate() 
    SetProps 
End Sub 

Вот и все.

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

+0

Работает отлично! Именно то, что я хотел, и это простое и функциональное решение. Спасибо. –

Смежные вопросы