#excel #vba
#excel #vba
Вопрос:
Я следил за учебным пособием на Youtube для менеджера сотрудников, в нем используется множество функций, которые мне не нужны, поэтому я пытался выбрать нужные ему части. У меня нет опыта работы с VBA или кодированием, поэтому я изо всех сил пытаюсь понять, почему некоторые вещи не будут работать.
На скриншотах есть аннотации предполагаемых результатов.
Чем вы заранее
Пример и аннотации предполагаемого результата
Вот мои макросы для кнопок и обновления
Option Explicit
Public EventRow As Long
Public EventCol As Long
Public MapRng As String
Sub Event_SaveNew()
With Sheet6
'check req fields
If Sheet3.Range("g3").Value = Empty Or Sheet3.Range("g5").Value = Empty Then
MsgBox ("Event Name and Event Type are required fields for ANY Event")
Exit Sub
End If
EventRow = .Range("E2000").End(xlUp).Row 1 'first av row
.Cells(EventRow, 5).Value = Sheet3.Range("b7").Value 'new event id
For EventCol = 6 To 12
.Cells(EventRow, EventCol).Value = Sheet3.Range(.Cells(1, EventCol).Value).Value 'event feild
Next EventCol
End With
With Sheet3
.Range("B2").Value = False 'set new event to false
.Range("B4").Value = Sheet6.Cells(EventRow, 1).Value 'New event ID
Event_Refresh
'reload events
End With
End Sub
Sub Event_Refresh()
Dim LastEventRow As Long
Dim LastFiltRow As Long
With Sheet3
'load Events list into events sheet using adv filter and sort
.Range("f22:m2000").ClearContents 'clear existing events list
LastEventRow = Sheet6.Range("e2000").End(xlUp).Row 6
Sheet6.Range ("e4:L" amp; LastEventRow)
End With
End Sub
Sub Event_AddNew()
With Sheet3
.Range("B1").Value = True 'set event load to true
.Range("b2").Value = True 'set new event to true
.Range("J7,j5,g5,g3,f11:j17,g7,g8,j3").ClearContents
.Range("b1").Value = False 'set event load to false
.Range("G3").Select
End With
End Sub
Sub Event_Load()
Dim SelRow As Long
With Sheet3
SelRow = .Range("b9").Value
If .Range("B3").Value = Empty Then
MsgBox "Please select on an Event to display Event details"
Exit Sub
End If
.Range("b1").Value = True 'set empload to true
EventRow = .Range("b3").Value
End With
With Sheet6
For EventCol = 6 To 12
MapRng = Sheet6.Cells(1, EventCol).Value
.Range(MapRng).Value = Sheet6.Cells(EventRow, EventCol).Value 'add maped values
Next EventCol
End With
With Sheet3
.Range("B2").Value = False 'set new event to false
.Range("B1").Value = False 'set event load to false
End With
End Sub
Sub Event_Delete()
If MsgBox("Are you sure you want to DELETE this event?", vbYesNo, "Delete Event") = vbNo Then Exit Sub
With Sheet3
If .Range("B3").Value = Empty Then Exit Sub
EventRow = .Range("B3").Value 'event row
Sheet6.Range(EventRow amp; ":" amp; EventRow).EntireRow.Delete
Event_Refresh 'refresh events
End With
End Sub
Sub Event_CancelNew()
With Sheet3
.Range("b2").Value = False
Sheet3.Range("F22").Select
End With
End Sub
И вот код для страницы журнала событий
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim MapRng As Range
Dim FoundMapRng As Range
Dim CellAdd As String
Dim SellRow As Long
'exsisting event change update event tab
If Not Intersect(Target, Range("F3:L17")) Is Nothing And Range("B2").Value = False And Range("B1").Value = False And IsNumeric(Cells(Target.Row, Target.Column 25).Value) = True And Cells(Target.Row, Target.Column 25).Value <> Empty Then
Sheet6.Cells(Range("b3").Value, Cells(Target.Row, Target.Column 25).Value).Value = Target.Value
End If
'update below
CellAdd = Target.Address
SellRow = Range("b9").Value
Set MapRng = Sheet3.Range("EventDataMap")
Set FoundMapRng = MapRng.Find(CellAdd, , xlValues, xlWhole)
If Not FoundMapRng Is Nothing Then Cells(SellRow, FoundMapRng.Column).Value = Sheet6.Cells(Range("b3").Value, Cells(Target.Row, Target.Column 25).Value).Value
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Count > 1 Then Exit Sub
'on table selection
If Not Intersect(Target, Range("F22:M2000")) Is Nothing And Range("f" amp; Target.Row).Value <> Empty Then
Range("b9").Value = Target.Row 'add in selection row
Range("b4").Value = Range("f" amp; Target.Row).Value 'add event ID
Event_Load
End If
End Sub
Комментарии:
1. Что вы пытаетесь здесь сделать? ‘Sheet6.Range («e4:L» amp; LastEventRow)’
2. Насколько я знаю, это заполненные данные в списке событий, которые затем должны быть помещены на страницу журнала событий.
3. Вам нужно иметь что-то после, как у вас было раньше:
Sheet6.Range("e3:L" amp; LastEventRow).AdvancedFilter xlFilterCopy, , CopyToRange:=Sheet6.Range("R3:Y3"), Unique:=True
. Строка с функцией range ожидает, что вы что-то сделаете с диапазоном, т.Е. Фильтруете, копируете, выбираете и т. Д… Это тоже сработало бы :Sheet1.Range("e4:L" amp; LastEventRow).Select
. Но, как упоминает @freeflow, что вы хотите, чтобы строка делала? Фильтровать диапазон? диапазон копирования?4. Спасибо за помощь, я разобрался с этим сейчас, у меня есть возможность скопировать данные, а затем вставить их в лист журнала событий.
5. Но теперь у меня возникла новая проблема, связанная либо с сохранением, либо с обновлением макроса. Я собираюсь опубликовать новый вопрос с подробностями.