Как проверить и вставить текст в определенную позицию листа Excel на основе формата входного текстового значения? - PullRequest
1 голос
/ 31 января 2020

Я хотел бы проанализировать вставленный текст ячейки и использовать его для правильного заполнения данных ячейки на соответствующем листе. Например, основываясь на значении в ячейке B2 на листе 1.1, я хотел бы вставить текст в указанное место на листе 1.2. В тексте ячейки указывается место назначения данных в следующем формате:

<destination_sheet_name>:<destination_panel_id>:<destination_module_id>

enter image description here

В этом случае соответствующие данные на листе 1.2 должен выглядеть следующим образом и содержать местоположение данных с исходного листа: <source_sheet_name>:<source_panel_id>:<source_module_id>

enter image description here

Как вы думаете, возможно ли это без писать сценарий VBA? Можете ли вы предложить подход для достижения этой цели для непрофессионального пользователя Excel; -)?

1 Ответ

0 голосов
/ 12 февраля 2020
  1. Alt + F11
  2. Двойной щелчок по модулю Workbook на левой панели (обычно называется ThisWorkbook).
  3. Вставьте этот код. Я пытался комментировать важные части.
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
  Dim s() As String
  Dim shTarg As Worksheet
  Dim lngTargPanelRow As Long
  Dim lngTargModuleCol As Long
  Dim sSourcePanel As String
  Dim sSourceModule As String
  Dim c As Range

  On Error GoTo EndSub
  If Target.Count = 1 Then
    ' Checking if the new value in the cell  (ambiguously called Target) has 2 colons
    If Len(Target) - Len(Replace(Target, ":", "")) = 2 Then
      ' Making an array with elements which are separated by colons in the cell
      s() = Split(Target, ":")
      ' Associating the VBA object with the particular sheet by its name
      Set shTarg = Me.Sheets(s(0))
      ' Finding the target row
      Set c = shTarg.Range("$A:$A").Find(s(1))
      If c Is Nothing Then GoTo EndSub Else lngTargPanelRow = c.Row
      ' Finding the target column
      Set c = shTarg.Range("1:1").Find(Replace(s(2), "M", "Module "))
      If c Is Nothing Then GoTo EndSub Else lngTargModuleCol = c.Column
      ' Finding the source panel
      sSourcePanel = Sh.Cells(Target.Row, 1).Value
      ' Finding the source module
      sSourceModule = Sh.Cells(1, Target.Column).Value
      ' Shortening the source module name
      sSourceModule = Replace(sSourceModule, "Module ", "M")
      ' Putting the value into the target cell
      Application.EnableEvents = False
      shTarg.Cells(lngTargPanelRow, lngTargModuleCol) = Sh.Name & ":" & sSourcePanel & ":" & sSourceModule

    Else
EndSub:
      MsgBox "No changes were made in any other cell"
    End If

    If Err <> 0 Then MsgBox "Error " & Err & " - " & Err.Description
    Application.EnableEvents = True
  End If
End Sub
...