Многомерный ввод данных - PullRequest
       18

Многомерный ввод данных

0 голосов
/ 28 сентября 2018

В настоящее время я застрял в том, как реализовать процедуру для получения и хранения информации в VBA.

Цель:

  • Чтобы получить список агентов, которым нужно назначить задачу (и).
  • Получить список задач (номер заявки) для каждого агента
  • Форматирование информации в определенную структуру для ответа по электронной почте

В настоящее время у меня есть функция, которая может получить имя агента (isagent (sAgent)) и проверить его, получить номер билета(Incident ()) и проверяет его, а также функция для ответа на сообщение со строкой для форматирования сообщения (sBody).

Проблемы:

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

Например: вчерашний запрос: переназначить билет 123 человеку 1

Сегодняшняя просьба - переназначить билеты 123, 456 и 789 на человека 1. Переназначить 012 на человека 2, переназначить 345, 678, 901, 234 и 567 на человека 3

Формат:

Формат хранимых данных должен быть возвращен следующим образом:

Пример. Вчерашний запрос: 123 был переназначен на person1.Сегодняшний запрос: 123, 456 и 789 были переназначены на человека 1. 012 был переназначен на человека 2. 345, 678, 901, 234 и 567 были переназначены на человека 3

Код:

Этот раздел предназначен для формата тела сообщения, его можно объединить в одну строку (sBody).Переменные в настоящее время установлены как sIncs для номеров заявок, sXferAgent для агентов и sTense для времени предложения.

'Set Body Reply
    Dim sOpen, sBody, sAddendum, sClose As String 'Message Reply Format
    sOpen = "<span style=""font-size:11.0pt;font-family:&quot;Calibri&quot;,sans-serif;mso-bidi-font-family:" & vbCrLf & _
            "Arial"">Team, <o:p></o:p></span>" & vbCrLf

    sBody = "<p><span style=""font-size:11.0pt;font-family:&quot;Calibri&quot;,sans-serif;mso-bidi-font-family:" & vbCrLf & _
            "Arial"">" & sINCs & " " & sTense & " been created and assigned to " & sXferAgent & "<o:p></o:p></span></p>" & vbCrLf

    sClose = "<p><span style=""font-size:11.0pt;font-family:&quot;Calibri&quot;,sans-serif;mso-bidi-font-family:" & vbCrLf & _
            "Arial"">Thanks &amp; Regards,<o:p></o:p></span></p>" & vbCrLf & _
            "<p><br/></p>"

    olMsgReplyAll.HTMLBody = sOpen & sBody & sClose & sSig & olMsgReplyAll.HTMLBody

Чтобы получить форматы заявок и агентов, ниже я их называю:

Dim sInc As String
'Receive Incident Number as AlphaNumeric
sInc = Incident()
If sInc = "" Then
    Exit Sub
End If


'Receive Agent Name
sAgent = ValidateAgent
If sAgent = "" Then
    Exit Sub
End If

В настоящее время моя недоумка заключается в следующем:

Sub Handoff()
    'Get reassigned tickets in loop
    'Asks for how many agents, ticket count per agent, gathers agent name and tickets for agent
    'Functions in place for get agent name, and ticket number preformatted
    'storage container issues for above process
    'Formats data into separate lines with verbiage
    Dim colReassignments As New Collection       'container for all reassignments
    Dim colAgents As New Collection              'container for agents
    Dim colTickets As New Collection             'container for tickets
    Dim ReassignCount As Integer                 '# of tickets for the agent
    Dim ReassignAgent As Integer                 'Agents to reassign to
    Dim Reassignments() As String

    'Start inquiry
    ReassignAgent = InputBox("Input number of Agents tickets being reassigned to:", "Agent Counter")
    If ReassignAgent = vbNullString Then
        Exit Sub
    End If


    While ReassignAgent > 0
        colAgents.Add = ValidateAgent
        ReassignCount = InputBox("Input number of ticket being reassigned to agent:", "Ticket Counter")
        If ReassignCount = vbNullString Then
            Exit Sub
        End If


        For Each agent In colAgents
            For Each ticket In colTickets
                agent(x).ticket(y) = Incident()
                If agent(x).ticket(y) = "" Then
                    Exit Sub
                End If
                agent(x) = ValidateAgent
                If agent(x) = "" Then
                    Exit Sub
                End If
                ReassignCount = ReassignCount - 1
            Next ticket
        Next agent
    Wend

    'Sentence Formatting

    'Get Tense of reassignment
    If ReassignCount > 1 Then
        tense = "have"
    Else
        tense = "has"
    End If

    'Compile stored info
    'Format: "(Ticket#(s)) (tense) been reassigned to (Agent)" repeat lines as necessary

    'Process email
    'In another module
End Sub

Любые предложения или пожелания приветствуются.Возможно, я слишком усложняю проблему.

Обновлено с учетом дополнительных модулей:

    'Function to get ticket number
Public Function Incident()
    Dim strPattern As String: strPattern = "^(?:INC|NC|C)?([0-9]{1,8}$)"
    Dim strReplaceINC As String: strReplaceINC = "$1"
    Dim regEx As New RegExp
    Dim strInput As String
    Dim IncResult As Boolean

    Do
        If strPattern <> "" Then

            strInput = InputBox("Input Incident Number", "Ticket Number")

            If strInput = vbNullString Then
                Exit Function
            End If

            IncResult = False

            With regEx
                .Global = True
                .MultiLine = True
                .IgnoreCase = True
                .Pattern = strPattern
            End With

            If regEx.Test(strInput) Then
                sInc = regEx.Replace(strInput, strReplaceINC)
                sInc = "INC" & Format(sInc, "00000000")
                IncResult = True
            Else
                MsgBox ("Please input a valid ticket number format")
                IncResult = False
            End If
        End If

    Loop While IncResult = False
    Incident = sInc
End Function

'Function to select Agent
Public Function IsAgent(stxt As String) As Boolean
        Dim aAgent As Variant, oItem As Variant, bans As Boolean
        aAgent = Array("Bob", "Chuck", "David", "Fred", "John", "Kirk", "Paul", "Sean")
        bans = False
        For Each oItem In aAgent
            If LCase(oItem) = LCase(Trim(stxt)) Then
                bans = True
                Exit For
            End If
        Next
        IsAgent = bans
    End Function

'Function to Validate Agent
Public Function ValidateAgent()

    'Dim sAgent As String 'Assigned Agent
    Do
        sAgent = InputBox("Please enter a the assigned agent's name:", "Pick an Assignee's Name")
        If sAgent = vbNullString Then
            Exit Function
        End If
        If sAgent <> "" Then
            If GlobalVars.IsAgent(sAgent) = True Then
                sAgent = sAgent
            Else
                MsgBox ("Incorrect Name, pick a new one!")
            End If
        End If

    Loop While GlobalVars.IsAgent(sAgent) = False
    ValidateAgent = sAgent
End Function

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Итак, после многих проб и ошибок я создал что-то функциональное.Я закончил тем, что создал словарь для ввода имени агента, а затем вложил коллекцию для ввода их заявок (переназначенных).Часть кода относится к глобальным переменным, но это основной модуль для этой функции.

Option Compare Text
Public Sub Handoff_Req()
Dim objSelection As Outlook.Selection
Dim objItem As Object
Set objOL = Outlook.Application
Dim olMsg As Outlook.MailItem
Dim olMsgReplyAll As Outlook.MailItem
Dim IsPlainText As Boolean

'Define Product
sProduct = "HANDOFF"

'Receive Incident Number as AlphaNumeric
sInc = Incident()
If sInc = "" Then
    Exit Sub
End If

'Receive Severity level
Sev = 4

'Get reassigned tickets in loop
Dim dictReassignments As Scripting.Dictionary
Dim kagent As Variant
Set dictReassignments = New Scripting.Dictionary 'container for agents
Dim colTickets As New Collection    'container for tickets
Dim AgentCounter As Variant
Dim TicketCounter As Variant
Dim TenseCounter As Integer
TenseCounter = 0

'Get number of agents to reassign to

Line1:    AgentCounter = InputBox("Input number of Agents that tickets are being reassigned to:", "Agent Reassignment Counter")
If Not IsNumeric(AgentCounter) Then
    MsgBox (AgentCounter & " is not a number, please try again.")
    GoTo Line1
Else
    AgentCounter = CInt(AgentCounter)
End If
If AgentCounter > 5 Then
        numa = MsgBox("Do you want to input more than " & TicketCounter & " tickets for " & kagent & "?", 4, "Correct ticket amount?")
        If numa = 6 Then 'Yes
            GoTo Line2 'Continue loop
        ElseIf numa = 7 Then 'No
            GoTo Line1 'Repeat agent counter question
        End If
    End If
Line2:  While AgentCounter > 0
    Set colTickets = New Collection
    kagent = ValidateReassignedAgent
    If kagent = "" Then
        Exit Sub
    End If
Line3:  TicketCounter = InputBox("Input number of ticket(s) being reassigned to agent:", "Ticket Reassignment Counter")
    If Not IsNumeric(TicketCounter) Then
        MsgBox (TicketCounter & " is not a number, please try again.")
        GoTo Line3
    Else
        TicketCounter = CInt(TicketCounter)
    End If
    If TicketCounter > 10 Then
        numa = MsgBox("Do you want to input more than " & TicketCounter & " tickets for " & kagent & "?", 4, "Correct ticket amount?")
        If numa = 6 Then 'Yes
            GoTo Line4 'Continue loop
        ElseIf numa = 7 Then 'No
            GoTo Line3 'Repeat ticket counter question
        End If
    End If

Line4:  While TicketCounter > 0
        xInc = Reassignments()
        If xInc = "" Then
            MsgBox ("Please input a valid number")
        End If
            colTickets.Add xInc
        TicketCounter = TicketCounter - 1
    Wend
    dictReassignments.Add kagent, colTickets
    AgentCounter = AgentCounter - 1
Wend


'Check dictionary of agents
For Each agent In dictReassignments.Keys()
    'MsgBox (agent)
    sXferAgent = agent
    For Each ticket In dictReassignments(agent)
        'MsgBox (ticket)
        TenseCounter = TenseCounter + 1
        sINCs = ticket & ", " & sINCs
        sTense = "have"
    Next ticket
    'MsgBox (TenseCounter)
    If TenseCounter > 1 Then
        sTense = " have"
        sINCs = Left(sINCs, Len(sINCs) - 2)
        sINCs = StrReverse(Replace(StrReverse(sINCs), StrReverse(", "), StrReverse(", and "), , 1))
    Else
        sTense = "has"
        sINCs = Left(sINCs, Len(sINCs) - 2)
    End If
    sBody = "<p><span style=""font-size:11.0pt;font-family:&quot;Calibri&quot;,sans-serif;mso-bidi-font-family:" & vbCrLf & _
        "Arial"">" & sINCs & " " & sTense & " been reassigned to " & sXferAgent & " per hand-off process.<o:p></o:p></span></p>" & vbCrLf
    scombined = sBody & scombined
    TenseCounter = 0
    sINCs = Null
    sTense = Null
    sXferAgent = Null
Next agent

'Process Agents for email inclusion
For Each agent In dictReassignments.Keys()
    sXferAgent = agent
    exAgent = AddXferRecip(sXferAgent)
    sXferredAgents = exAgent & "; " & sXferredAgents
Next


'Find Logged in Agent
SDagent = LoggedIn
If SDagent = "" Then
    Exit Sub
End If

'Set Category Color
Color = GetColor(SDagent)
If Color = "" Then
    Exit Sub
End If

'Get the selected item
Select Case TypeName(objOL.ActiveWindow)
    Case "Explorer"
        Set objSelection = objOL.ActiveExplorer.Selection
        If objSelection.Count > 0 Then
            Set objItem = objSelection.Item(1)
        Else
            result = MsgBox("No item selected. " & _
                        "Please make a selection first.", _
                        vbCritical, "Reply All in HTML")
            Exit Sub
        End If

    Case "Inspector"
        Set objItem = objOL.ActiveInspector.CurrentItem
    Case Else
        result = MsgBox("Unsupported Window type." & _
                    vbNewLine & "Please make a selection" & _
                    " or open an item first.", _
                    vbCritical, "Reply All in HTML")
        Exit Sub
End Select


'Change the message format and reply
If objItem.Class = olMail Then
    Set olMsg = objItem
    If olMsg.BodyFormat = olFormatPlain Then
        IsPlainText = True
    End If
    olMsg.BodyFormat = olFormatHTML
    Set olMsgReplyAll = olMsg.ReplyAll
    If IsPlainText = True Then
        olMsg.BodyFormat = olFormatPlain
    End If


'Delete Automatic Signature
GlobalVars.DelSig olMsgReplyAll

'Remove Non-Monitored or Invalid email addresses
Dim recipremove As Variant
Dim element As Variant
    recipremove = Array("IT Service Desk")

    For lngCnt = olMsgReplyAll.Recipients.Count To 1 Step -1
         Set olkrcp = olMsgReplyAll.Recipients.Item(lngCnt)
         For Each element In recipremove
         If olkrcp.Name = element Then
             If olkrcp.Type = olTo Or olCC Then
                 olMsgReplyAll.Recipients.Item(lngCnt).Delete
             End If
         End If
         Next element
     Next


   'Add recipients
    exAgent = AddXferRecip(sXferredAgents)

    'Set Recipients
    Dim olRecip As Recipient ' Add Recipient
    Set olRecip = olMsgReplyAll.Recipients.Add(sXferredAgents) 'add multiple agents assigned
    olRecip.Resolve

    'BCC to SharePoint for tracking
    Set olRecip = olMsgReplyAll.Recipients.Add("Email Address")
    olRecip.Type = olBCC
    olRecip.Resolve

    'Include SD Mgr if Sev 1
    If Sev = "1" Then
        Set olRecip = olMsgReplyAll.Recipients.Add("Email Address")
        olRecip.Type = olBCC
        olRecip.Resolve
    End If

    'Delete Duplicate addresses

    Dim i As Integer, j As Integer
    Dim olRecip1 As Recipient, olRecip2 As Recipient
    Dim colRecipients As Recipients
    Set colRecipients = olMsgReplyAll.Recipients
        For i = colRecipients.Count To 1 Step -1
        Set olRecip1 = colRecipients.Item(i)
            For j = (i - 1) To 1 Step -1
                Set olRecip2 = colRecipients.Item(j)
                If olRecip1.Name = olRecip2.Name Then
                    If olRecip1.Type = olTo Or olCC Then
                        olRecip1.Delete
                        Exit For
                    End If
                End If
            Next
        Next

    'Format Subject Line
    GlobalVars.SubjLine olMsgReplyAll

   'Set Signature
    sSig = SigAdd

    'Set Body Reply
    Dim sOpen As String, sAddendum As String, sClose As String 'Message Reply Format
    sOpen = "<span style=""font-size:11.0pt;font-family:&quot;Calibri&quot;,sans-serif;mso-bidi-font-family:" & vbCrLf & _
            "Arial"">Team, <o:p></o:p></span>" & vbCrLf

    sBody = scombined

    sClose = "<p><span style=""font-size:11.0pt;font-family:&quot;Calibri&quot;,sans-serif;mso-bidi-font-family:" & vbCrLf & _
            "Arial"">Thanks &amp; Regards,<o:p></o:p></span></p>" & vbCrLf & _
            "<p><br/></p>"

    olMsgReplyAll.HTMLBody = sOpen & sBody & sClose & sSig & olMsgReplyAll.HTMLBody

    'Get Attachments
    GlobalVars.CopyAttachments olMsg, olMsgReplyAll

    'Set Category Color
    olMsg.Categories = Color & ";Hand-off Notices"

    'Display Reply
    olMsg.Close (olSave)
    olMsgReplyAll.Display
    Dim oMail As Outlook.MailItem



'Selected item isn't a mail item
Else
    result = MsgBox("No message item selected. " & _
                "Please make a selection first.", _
                vbCritical, "Reply All in HTML")
    Exit Sub
End If

'Cleanup
Set objOL = Nothing
Set objItem = Nothing
Set objSelection = Nothing
Set olMsg = Nothing
Set olMsgReplyAll = Nothing

End Sub
0 голосов
/ 02 октября 2018

Пожалуйста, не размещайте так много кода в комментарии, потому что его трудно (невозможно?) Прочитать.К этому вопросу следует добавить.

Было грубое название для таких подпрограмм, как ValidateAgent, которое я забыл.Имя скрывает то, что делает подпрограмма для ввода проверенного агента.Что-то вроде GetValidatedAgent было бы гораздо лучшим именем

InputBox - это действительно неуклюжий способ ввода более одного значения.Если я правильно понимаю, пользователь вводит агента, затем подсчитывает, а затем подсчитывает билеты.Существует цикл, который позволяет вводить несколько агентов, каждый с собственным набором билетов.

Предположим, я ввел 3, а затем понял, что было 4 билета?Как бы я исправить свою ошибку?Предположим, я ввел Боба в качестве агента и начал вводить билеты, прежде чем понял, что вводил билеты Алисы.Как бы я исправил свою ошибку?

Я бы использовал форму.

Если бы было небольшое количество агентов и заявок на одного агента, я бы, вероятно, выбрал сетку текстовых полей.Например, пользователь вводит агента в столбец 1, а заявки - в столбцы 2-5.Я бы, наверное, 10 строк.Я бы проверил агентов и заявки, когда пользователь перешел в новое текстовое поле.Я не проверял бы непротиворечивость (например, нет заявки без агента и агента без заявки), пока пользователь не нажмет кнопку отправки.Я не разрешил бы выход, пока данные не были согласованы или пользователь не нажал кнопку отмены.С помощью этого макета пользователь мог видеть весь свой ввод на экране и мог исправить любой неисправный агент или заявку.

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

AgentA,Ticket1,Ticket2,Ticket3
AgentB,Ticket4
AgentB,Ticket5,Ticket6
  :      :      :      :

Я бы использовал Split для преобразования каждой строки в массив, когда я был готов ее обработать.

Iобсудит возможные макеты HTML, если вы подтвердите максимум около 10 агентов и около 5 билетов на агента.Если будет больше агентов или билетов, я предложу другой подход.

...