0

私はヨーロッパのインターンで、病院で働いています。私の毎日の仕事は、必要なときに看護師、医師、または外科医の代わりを見つけることです。これを行うために、特定の部門から、時間、部門、および必要な特定のタイプの人員を決定する4つの異なる属性を持つExcelスプレッドシートの形式でリクエストを受け取ります。

その情報から、要件に一致する人のために、Excelスプレッドシートにも基づいている固定データベースを調べます。

私が電子メール/SMSを送信した後、または部門長に電話して承認を得た後、ほとんどの場合、返信は「はい」です。

確認が取れたら、交換が必要な部署に交換の情報を送り、仕事は終わりです。私はこれらのリクエストを1日に約150回行います。このプログラムを作成できれば、他の3人を雇用してこの仕事をするため、病院の納税者のお金を大幅に節約できます。

したがって、私の質問: このプログラムを書くのに最適な言語は何ですか?

ファイルへのアクセスや電子メールの送信を容易にするスクリプト言語をお勧めしますか?それとも、このタスクには弱すぎるのでしょうか?

言語の要件は、次のことを行うことです。

  • Excelスプレッドシートにアクセスする
  • スプレッドシートを読み、セルの配列から値をコピーします
  • スプレッドシートで値を見つける
  • Excelスプレッドシート検索で取得した値をメールで送信しますか?
  • 電子メールを読み、値が=からYESの場合は、実行します...それ以外の場合は実行します...
  • 最後に、xxxxx情報を記載したメールをxxx人に送信します

Macを使用している場合は、AppleScriptのようなスクリプト言語とAutomatorを組み合わせて、Excelファイルにアクセスして読み取り、電子メール/SMSを送信していました。

よろしくお願いします。

4

1 に答える 1

1

以下のコードは、完全なソリューションからはほど遠いものです。その目的は、システムがどのように機能するかについて考え始めることです。

将来を見据えて、 HumanActionRequired.txtという名前のテキストファイルの必要性を想定しています。コードの10行目は、このファイルが作成されるフォルダーを指定する定数です。「C:\ DataArea\Play」をシステム上のフォルダの名前に置き換える必要があります。ファイルの名前を変更することをお勧めします。6行目を参照してください。

このファイルをエラーメッセージの宛先として想定していますが、ここでは、このファイルを使用してInBox内のメッセージの詳細を一覧表示しています。利用可能なプロパティのほんの一部を出力しましたが、何が可能かを考えてもらう必要があります。

以下のコードは、OutLook内のモジュールに属しています。

  1. Outlookを開きます。
  2. [ツール]、[マクロ]、[セキュリティ]を選択します。セキュリティレベルを中に設定する必要があります。後で、マクロの信頼できるステータスを取得することについてIT部門と話し合うことができますが、今のところはこれで十分です。
  3. [ツール]、[マクロおよびVisual Basic Editor]を選択するか、Alt+F11をクリックします。
  4. おそらく左側にプロジェクトエクスプローラーが表示されます(そうでない場合はControl + Rが表示されます)。Outlookマクロを作成したことがない場合は、右側の領域が灰色になります。
  5. [挿入]、[モジュール]を選択します。灰色の領域は白くなり、上のコード領域と下のイミディエイトウィンドウが表示されます。
  6. 以下のコードをコード領域にコピーします。

マクロLocateInterestingEmails()内にカーソルを置き、F5をクリックします。マクロがメールにアクセスしようとしているという警告が表示されます。[アクセスを許可する]にチェックマークを付けて制限時間を選択し、[はい]をクリックします。マクロは、受信トレイ内の電子メールの選択されたプロパティをファイルHumanActionRequired.txtに書き込みます。

Option Explicit
Sub LocateInterestingEmails()

  Dim ErrorDescription As String
  Dim ErrorNumber As Long
  Static ErrorCount As Integer
  Const FileCrnt As String = "HumanActionRequired.txt"
  Dim FolderTgt As MAPIFolder
  Dim InxAttachCrnt As Long
  Dim InxItemCrnt As Long
  Dim OutputFileNum As Long
  Const PathCrnt As String = "C:\DataArea\Play"

  ErrorCount = 0
  OutputFileNum = 0

Restart:

  ' On Error GoTo CloseDown

  Set FolderTgt = CreateObject("Outlook.Application"). _
              GetNamespace("MAPI").GetDefaultFolder(olFolderInbox)

  OutputFileNum = FreeFile
  Open PathCrnt & "\" & FileCrnt For Append Lock Write As #OutputFileNum

  For InxItemCrnt = 1 To FolderTgt.Items.Count
    With FolderTgt.Items.Item(InxItemCrnt)

      If .Class = olMail Then
        Print #OutputFileNum, "-----------------------------"
        Print #OutputFileNum, "Subject: " & .Subject
        Print #OutputFileNum, "Sender: " & .SenderEmailAddress
        Print #OutputFileNum, "Recipient: " & .To
        Print #OutputFileNum, "Date sent: " & .SentOn
        If .Attachments.Count > 0 Then
          Print #OutputFileNum, "Attachments:"
          For InxAttachCrnt = 1 To .Attachments.Count
            Print #OutputFileNum, "  " & .Attachments(InxAttachCrnt).DisplayName
          Next
        End If
      End If
    End With
  Next

CloseDown:
  ErrorNumber = Err.Number
  ErrorDescription = Err.Description
  Err.Clear

  Set FolderTgt = Nothing

  If ErrorNumber <> 0 Then
    ' Here because of an error
    If OutputFileNum = 0 Then
      ' Output file not open
      OutputFileNum = FreeFile
      Open PathCrnt & "\" & FileCrnt For Append Lock Write As #OutputFileNum
    End If
    Print #OutputFileNum, "-----------------------------"
    Print #OutputFileNum, "Error at " & Now()
    Print #OutputFileNum, "Error number = " & ErrorNumber & _
                          "   description = " & ErrorDescription
  End If

  If OutputFileNum <> 0 Then
    ' File open
    Close OutputFileNum
    OutputFileNum = 0
  End If

End Sub

バージョン2

このバージョンには、最初のバージョンに加えて次のコードが含まれています。

  • 見つかったExcelの添付ファイルに関する情報を保存する既存のブックを開きます。
  • 拡張子が。の添付ファイルを識別し、xls?受信した日時と送信者の名前に基づいた名前でディスクに保存します。
  • 保存された各添付ファイルを開きます。保存された添付ファイル内のワークシートごとに、ファイル名、送信者名と電子メールアドレス、シート名、およびセルA1の値を含む行が既存のブックに作成されます。

このコードが直接役立つとは思いませんが、添付ファイルを保存し、ワークブックを開いて読み取りまたは書き込みを行う方法を示しています。これは、必要になると思います。

私が欠落していることがわかっている唯一のコードは次のとおりです。

  • 処理したメールを保存フォルダに移動します。
  • 返信メールを生成します。

ただし、プロセス全体を自動化する方法によっては、より多くのコードが必要になる場合があります。

以下のコードは、私が望むほどきれいではありません。あなたがそれを完全に理解するまで、私はこれ以上追加したくありません。また、送信する予定の電子メールと、プロセス全体の望ましい自動化について、より深く理解していただきたいと思います。

理解できないコードの部分について質問をしてください。

Option Explicit
Sub LocateInterestingEmails()

  ' I use constants to indentify columns in worksbooks because if I move the
  ' column I only need to update the constant to update the code.  I said the
  ' same in a previous answer and some one responded that they preferred
  ' Enumerations.  I use Enumerations a lot but I still prefer to use constants
  ' for column numbers.
  Const ColSumFileNameSaved As String = "A"
  Const ColSumFileNameOriginal As String = "B"
  Const ColSumSenderName As String = "C"
  Const ColSumSenderEmail As String = "D"
  Const ColSumSheet As String = "E"
  Const ColSumCellA1 As String = "F"

  ' You must change the value of this constant to the name of a folder on your
  ' computer.  All file created by this macro are written to this folder.
  Const PathCrnt As String = "C:\DataArea\Play"

  ' I suggest you change the values of these constants to
  ' something that you find helpful.
  Const FileNameHAR As String = "HumanActionRequired.txt"
  Const FileNameSummary As String = "Paolo.xls"

  Dim CellValueA1 As Variant
  Dim ErrorDescription As String
  Dim ErrorNumber As Long
  Dim FileNameReqDisplay As String
  Dim FileNameReqSaved As String
  Dim FolderTgt As MAPIFolder
  Dim InxAttachCrnt As Long
  Dim InxItemCrnt As Long
  Dim InxSheet As Long
  Dim OutputFileNum As Long
  Dim Pos As Long
  Dim ReceivedTime As Date
  Dim RowSummary As Long
  Dim SenderName As String
  Dim SenderEmail As String
  Dim SheetName As String
  Dim XlApp As Excel.Application
  Dim XlWkBkRequest As Excel.Workbook
  Dim XlWkBkSummary As Excel.Workbook

  ' Ensure resource controls are null before macro does anything that can cause
  ' an error so error handler knows if the resource is to be released.
  OutputFileNum = 0
  Set XlApp = Nothing
  Set XlWkBkRequest = Nothing
  Set XlWkBkSummary = Nothing

  ' Open own copy of Excel
  Set XlApp = Application.CreateObject("Excel.Application")
  With XlApp
    .Visible = True         ' This slows your macro but helps during debugging
    ' Open workbook to which a summary of workbooks extracted will be written
    Set XlWkBkSummary = .Workbooks.Open(PathCrnt & "\" & FileNameSummary)
    With XlWkBkSummary.Worksheets("Summary")
      ' Set RowSummary to one more than the last currently used row
      RowSummary = .Cells(.Rows.Count, ColSumFileNameSaved).End(xlUp).Row + 1
    End With
  End With

Restart:

  ' I prefer to have my error handler switched off during development so the
  ' macro stops on the faulty statement.  If you remove the comment mark from
  ' the On Error statement then any error will cause the code to junp to label
  ' CloseDown which is at the bottom of this routine.

  ' On Error GoTo CloseDown

  ' Gain access to InBox
  Set FolderTgt = CreateObject("Outlook.Application"). _
              GetNamespace("MAPI").GetDefaultFolder(olFolderInbox)

  ' Open text file for output.  I envisage this file being used for error
  ' messages but for this version of the macro I write a summary of the
  ' contents of the InBox to it.
  OutputFileNum = FreeFile
  Open PathCrnt & "\" & FileNameHAR For Output Lock Write As #OutputFileNum

For InxItemCrnt = 1 To FolderTgt.Items.Count
  With FolderTgt.Items.Item(InxItemCrnt)

    If .Class = olMail Then
      ' Only interested in mail items.  Most of the other items will be
      ' meeting requests.
      Print #OutputFileNum, "-----------------------------"
      Print #OutputFileNum, "Subject: " & .Subject
      ' Currently we are within With FolderTgt.Items.Item(InxItemCrnt).
      ' Values from this mail item are to be written to a workbook
      ' for which another With will be required.  Copy values to
      ' variables for they are accessable.
      ' Note: XlApp.XlWkBkSummary.Worksheets("Summary")
      '         .Cells(RowSummary, ColSumFileNameOriginal).Value = _
      '       FolderTgt.Items.Item(InxItemCrnt).Attachments(InxAttachCrnt) _
      '       .DisplayName
      ' is legal but is not very clear.  Code is much clearer will full use
      ' of With stateents even if it means values must be copied to variable.
      SenderName = .SenderName
      SenderEmail = .SenderEmailAddress
      ReceivedTime = .ReceivedTime
      Print #OutputFileNum, "SenderName: " & SenderName
      Print #OutputFileNum, "SenderAddr: " & SenderEmail
      Print #OutputFileNum, "Received: " & ReceivedTime
      Print #OutputFileNum, "Date sent: " & .SentOn
      If .Attachments.Count > 0 Then
        Print #OutputFileNum, "Attachments:"
        For InxAttachCrnt = 1 To .Attachments.Count
          With .Attachments(InxAttachCrnt)
            ' I cannot find an example for which the
            ' DisplayName and FileName are different
            FileNameReqDisplay = .DisplayName
            Print #OutputFileNum, "  " & FileNameReqDisplay & "|" & .FileName
            Pos = InStrRev(FileNameReqDisplay, ".")
            ' With ... End With and If ... End If must be properly nested.
            ' Within the If below I want access to the attachment and to the
            ' workbook.  Hence the need to terminate the current With and then
            ' immediately start it again within the If ... End If block.
          End With
          If LCase(Mid(FileNameReqDisplay, Pos + 1, 3)) = "xls" Then
            With .Attachments(InxAttachCrnt)
              ' Save the attachment with a unique name.  Note this will only be
              ' unique if you do not save the same attachment again.
              FileNameReqSaved = _
                   Format(ReceivedTime, "yyyymmddhhmmss") & " " & SenderName
              .SaveAsFile PathCrnt & "\" & FileNameReqSaved
            End With
            ' Open the saved attachment
            Set XlWkBkRequest = _
                         XlApp.Workbooks.Open(PathCrnt & "\" & FileNameReqSaved)
            With XlWkBkRequest
              'Examine every worksheet in workbook
              For InxSheet = 1 To .Worksheets.Count
                With .Worksheets(InxSheet)
                  ' Save sheet name and a sample value
                  SheetName = .Name
                  CellValueA1 = .Cells(1, 1).Value
                End With
                ' Save information about this sheet and its workbook
                With XlWkBkSummary.Worksheets("Summary")
                  .Cells(RowSummary, ColSumFileNameSaved).Value = _
                                                            FileNameReqSaved
                  .Cells(RowSummary, ColSumFileNameOriginal).Value = _
                                                          FileNameReqDisplay
                  .Cells(RowSummary, ColSumSenderName).Value = SenderName
                  .Cells(RowSummary, ColSumSenderEmail).Value = SenderEmail
                  .Cells(RowSummary, ColSumSheet).Value = SheetName
                  .Cells(RowSummary, ColSumCellA1).Value = CellValueA1
                  RowSummary = RowSummary + 1
                End With  ' XlWkBkSummary.Worksheets("Summary")
              Next InxSheet
              .Close SaveChanges:=False
              Set XlWkBkRequest = Nothing
            End With  ' XlWkBkRequest
          End If
        Next
      End If
    End If
  End With
Next

CloseDown:
ErrorNumber = Err.Number
ErrorDescription = Err.Description
Err.Clear

Set FolderTgt = Nothing

If ErrorNumber <> 0 Then
  ' Have reached here because of an error
  If OutputFileNum = 0 Then
    ' Output file not open
    OutputFileNum = FreeFile
    Open PathCrnt & "\" & FileNameHAR For Append Lock Write As #OutputFileNum
  End If
  Print #OutputFileNum, "-----------------------------"
  Print #OutputFileNum, "Error at " & Now()
  Print #OutputFileNum, "Error number = " & ErrorNumber & _
                        "   description = " & ErrorDescription
End If

' Release resources

If OutputFileNum <> 0 Then
  ' File open
  Close OutputFileNum
  OutputFileNum = 0
End If

If Not (XlWkBkRequest Is Nothing) Then
  XlWkBkRequest.Close SaveChanges:=False
  Set XlWkBkRequest = Nothing
End If

If Not (XlWkBkSummary Is Nothing) Then
  XlWkBkSummary.Close SaveChanges:=True
  Set XlWkBkSummary = Nothing
End If

If Not (XlApp Is Nothing) Then
  XlApp.Quit
  Set XlApp = Nothing
End If

End Sub
于 2012-07-03T19:35:04.617 に答える