Open CitronStudio opened 4 months ago
Power Queryでこの機能を実装するためには、以下の手順を実行します。
テーブル1をインポート:
テーブル2をインポート:
最新の日付を取得:
let
Source = テーブル2,
MaxDate = List.Max(Source[日付]) // 日付列の最大値を取得
in
MaxDate
条件付きでデータを追加:
let
Table1 = テーブル1,
Table2 = テーブル2,
MaxDate = List.Max(Table2[日付]), // テーブル2の最新日付を取得
NewData = Table.SelectRows(Table1, each [日付] > MaxDate), // 新しいデータを抽出
CombinedData = Table.Combine({Table2, NewData}) // テーブル2と新しいデータを結合
in
CombinedData
結果を保存:
この手順により、テーブル1の日付が更新されたときにのみテーブル2に新しい行を追加し、履歴を管理することができます。
具体的な手順を以下に示します:
これで、テーブル2が自動的に更新されるようになります。
Documents.Open
メソッドは、Word ドキュメントを開くために使用されます。このメソッドには、さまざまな引数(制御文字)を指定して、ドキュメントの開き方や処理方法を制御することができます。以下はその引数の一覧です:
True
に設定すると、ファイルを開くときに変換確認ダイアログボックスが表示されます。True
に設定すると、ファイルが読み取り専用として開かれます。True
に設定すると、ファイルが最近使用したファイルリストに追加されます。True
に設定すると、既に開いているファイルがある場合に再読み込みされます。wdOpenFormatAuto
)。True
に設定すると、ファイルが開かれたときにウィンドウが表示されます。True
に設定すると、ファイルを修復モードで開きます。True
に設定すると、エンコーディングダイアログボックスが表示されません。以下は Documents.Open
メソッドの例です:
Dim doc As Document
Set doc = Documents.Open(FileName:="C:\example.docx", ReadOnly:=True, PasswordDocument:="mypassword", Visible:=True)
この例では、example.docx
ファイルを読み取り専用として、パスワード「mypassword」で開き、ウィンドウが表示されます。
Documents.Open
メソッドの Format
引数には、ファイルを特定の形式で開くための定数を指定することができます。以下に、Format
引数で指定できるすべての値を示します:
これらの定数は、VBAコード内でファイルを開く際に特定の形式を指定するために使用されます。例えば、テキスト形式でファイルを開きたい場合は、以下のように指定します:
Dim doc As Document
Set doc = Documents.Open(FileName:="C:\example.txt", Format:=wdOpenFormatText)
この例では、example.txt
ファイルをテキスト形式で開きます。
Excel VBAで指定した機能を実装するためには、以下のようにコードを書くことができます。
以下の手順でVBAコードを実装します。
Sub SelectPDFFile()
Dim fd As FileDialog
Dim selectedFilePath As String
' ダイアログを表示
Set fd = Application.FileDialog(msoFileDialogFilePicker)
With fd
.Title = "PDFファイルを選択してください"
.Filters.Clear
.Filters.Add "PDFファイル", "*.pdf"
.AllowMultiSelect = False
If .Show = -1 Then
' ファイルが選択された場合
selectedFilePath = .SelectedItems(1)
' 選択されたファイルがPDFかどうかをチェック
If Right(selectedFilePath, 4) = ".pdf" Then
MsgBox "選択されたPDFファイルのパス: " & selectedFilePath
Else
MsgBox "選択されたファイルはPDFではありません。", vbCritical
End If
Else
MsgBox "ファイルが選択されませんでした。", vbExclamation
End If
End With
Set fd = Nothing
End Sub
FileDialog
オブジェクトを使用してファイル選択ダイアログを表示します。Filters
プロパティを使用して、PDFファイルのみを選択できるようにフィルタを設定します。.pdf
かどうかを確認します。.pdf
であれば、ファイルパスを表示し、そうでなければエラーメッセージを表示します。このコードをVBAエディタにコピーして、適当なモジュールに貼り付けて実行してください。
以下は修正されたExcelVBAのコードです。
Option Explicit
Sub OpenPDFAndSaveAsMHT_Update()
Dim pdfPath As String
Dim mhtPath As String
Dim wordApp As Object
Dim wordDoc As Object
Dim startTime As Single
Dim fd As FileDialog
Dim selectedFilePath As String
Dim wb As Workbook
Dim MHTwb As Workbook
Dim ws As Worksheet
' 画面更新・再計算OFF
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
' シートのクリア
Set wb = ThisWorkbook
wb.Worksheets(1).Cells.Clear
' ダイアログを表示
Set fd = Application.FileDialog(msoFileDialogFilePicker)
With fd
.Title = "PDFファイルを選択してください"
.Filters.Clear
.Filters.Add "PDFファイル", "*.pdf"
.AllowMultiSelect = False
If .Show = -1 Then ' ファイルが選択された場合
selectedFilePath = .SelectedItems(1)
' 選択されたファイルがPDFかどうかをチェック
If Right(selectedFilePath, 4) = ".pdf" Then
' PDFのパスを指定します
pdfPath = selectedFilePath
Else
MsgBox "選択されたファイルはPDFではありません。", vbCritical
Set fd = Nothing
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.Calculate
Exit Sub
End If
Else
MsgBox "ファイルが選択されませんでした。", vbExclamation
Set fd = Nothing
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.Calculate
Exit Sub
End If
End With
' 保存するMHTファイルのパスを指定します
mhtPath = Replace(pdfPath, ".pdf", ".mht")
' Wordアプリケーションを起動します
On Error Resume Next
Set wordApp = GetObject(Class:="Word.Application")
If wordApp Is Nothing Then
Set wordApp = CreateObject(Class:="Word.Application")
End If
On Error GoTo 0
' Wordアプリケーションを表示します
wordApp.Visible = True
' PDFをWordで開きます
Set wordDoc = wordApp.Documents.Open(Filename:=pdfPath, ConfirmConversions:=False, ReadOnly:=False, _
AddToRecentFiles:=False, Format:=wdOpenFormatAuto)
' ドキュメントが開き、かつ変換が完了するまで待機(最大20秒)
startTime = Timer
Do While wordDoc Is Nothing And wordDoc.ReadOnly And Timer < startTime + 20
DoEvents
Loop
' 開いたPDFをMHT形式で保存します
If wordDoc Is Nothing Then
MsgBox "PDFの読み込みに失敗しました。"
Else
wordDoc.SaveAs2 Filename:=mhtPath, FileFormat:=wdFormatWebArchive
End If
' ドキュメントを閉じます
wordDoc.Close SaveChanges:=False
' Wordアプリケーションを閉じます
wordApp.Quit
' MHTファイルをExcelで開きます
Set MHTwb = Workbooks.Open(Filename:=mhtPath)
Do While MHTwb Is Nothing
DoEvents
Loop
' MHTファイルの内容をシートにコピーします
MHTwb.Activate
Cells.Select
Selection.Copy
wb.Activate
wb.Worksheets(1).Cells.Select
ActiveSheet.Paste
wb.Worksheets(1).Cells(1).Select
' MHTファイルを閉じます
Application.CutCopyMode = False
MHTwb.Close
' 開放
Set fd = Nothing
Set wordDoc = Nothing
Set wordApp = Nothing
Set MHTwb = Nothing
' 画面更新・計算ON
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.Calculate
End Sub
このコードは、PDFファイルをWordで開き、MHT形式で保存し、その内容をExcelシートにコピーするものです。動作確認を行い、問題があれば教えてください。
以下に、指定された動作を実行するExcel VBAコードを提供します。このコードは、フォルダーを指定して、そのフォルダー内にあるすべての.msgファイルを.txtファイルに変換します。
Option Explicit
' Microsoft Outlook Libraryの参照を追加する必要があります。
' VBAエディタで「ツール」 -> 「参照設定」 -> 「Microsoft Outlook XX.0 Object Library」にチェックを入れる
Sub ConvertMsgToTxt()
Dim folderPath As String
Dim msgFile As String
Dim outFile As String
Dim outlookApp As Object
Dim msg As Object
Dim fso As Object
Dim file As Object
' フォルダーのパスを指定
folderPath = "C:\Your\Folder\Path\" ' ここを変更してください
' Outlookアプリケーションを起動
Set outlookApp = CreateObject("Outlook.Application")
' ファイルシステムオブジェクトを作成
Set fso = CreateObject("Scripting.FileSystemObject")
' フォルダー内の.msgファイルを検索
msgFile = Dir(folderPath & "*.msg")
' 各.msgファイルを.txtファイルに変換
Do While msgFile <> ""
Set msg = outlookApp.CreateItemFromTemplate(folderPath & msgFile)
outFile = folderPath & Replace(msgFile, ".msg", ".txt")
' .msgファイルの内容を.txtファイルとして保存
Set file = fso.CreateTextFile(outFile, True)
file.WriteLine "Subject: " & msg.Subject
file.WriteLine "Body: " & msg.Body
file.Close
' 次の.msgファイルへ
msgFile = Dir
Loop
' 終了メッセージ
MsgBox "すべての.msgファイルが.txtファイルに変換されました。", vbInformation
End Sub
folderPath
の値)。このコードをExcel VBAモジュールにコピーして実行すると、指定したフォルダー内のすべての.msgファイルが.txtファイルに変換されます。
以下に、指定された動作を実行するExcel VBAコードを提供します。このコードは、マクロを実行するとフォルダ選択ダイアログが表示され、選択したフォルダのパスをメッセージボックスで表示します。
Option Explicit
Sub SelectFolderAndShowPath()
Dim folderPath As String
Dim folderDialog As FileDialog
' フォルダ選択ダイアログを作成
Set folderDialog = Application.FileDialog(msoFileDialogFolderPicker)
' ダイアログのタイトルを設定
folderDialog.Title = "フォルダを選択してください"
' ダイアログを表示し、ユーザーがフォルダを選択した場合の処理
If folderDialog.Show = -1 Then
folderPath = folderDialog.SelectedItems(1)
' 選択したフォルダのパスをメッセージボックスで表示
MsgBox "選択されたフォルダのパス: " & folderPath, vbInformation
Else
MsgBox "フォルダが選択されませんでした。", vbExclamation
End If
End Sub
Application.FileDialog
を使用してフォルダ選択ダイアログを表示します。このコードをExcel VBAモジュールにコピーして実行すると、フォルダ選択ダイアログが表示され、選択したフォルダのパスがメッセージボックスに表示されます。
msgFile = Dir(folderPath & "*.msg")
が正しく動作しない理由として、いくつかの可能性が考えられます。
.msg
ファイルが存在しない。以下のコードは、フォルダをダイアログで選択し、選択されたフォルダ内の.msg
ファイルを.txt
ファイルに変換する修正バージョンです。
Option Explicit
Sub ConvertMsgToTxt()
Dim folderPath As String
Dim msgFile As String
Dim outFile As String
Dim outlookApp As Object
Dim msg As Object
Dim fso As Object
Dim file As Object
Dim folderDialog As FileDialog
' フォルダ選択ダイアログを作成
Set folderDialog = Application.FileDialog(msoFileDialogFolderPicker)
' ダイアログのタイトルを設定
folderDialog.Title = "フォルダを選択してください"
' ダイアログを表示し、ユーザーがフォルダを選択した場合の処理
If folderDialog.Show = -1 Then
folderPath = folderDialog.SelectedItems(1)
' 選択されたフォルダのパスをメッセージボックスで表示
MsgBox "選択されたフォルダのパス: " & folderPath, vbInformation
' Outlookアプリケーションを起動
Set outlookApp = CreateObject("Outlook.Application")
' ファイルシステムオブジェクトを作成
Set fso = CreateObject("Scripting.FileSystemObject")
' フォルダーのパスの末尾にバックスラッシュを追加
If Right(folderPath, 1) <> "\" Then
folderPath = folderPath & "\"
End If
' フォルダー内の.msgファイルを検索
msgFile = Dir(folderPath & "*.msg")
' 各.msgファイルを.txtファイルに変換
Do While msgFile <> ""
Set msg = outlookApp.CreateItemFromTemplate(folderPath & msgFile)
outFile = folderPath & Replace(msgFile, ".msg", ".txt")
' .msgファイルの内容を.txtファイルとして保存
Set file = fso.CreateTextFile(outFile, True)
file.WriteLine "Subject: " & msg.Subject
file.WriteLine "Body: " & msg.Body
file.Close
' 次の.msgファイルへ
msgFile = Dir
Loop
' 終了メッセージ
MsgBox "すべての.msgファイルが.txtファイルに変換されました。", vbInformation
Else
MsgBox "フォルダが選択されませんでした。", vbExclamation
End If
End Sub
msgFile = Dir(folderPath & "*.msg")
の前に、選択されたフォルダのパスをメッセージボックスで表示することで、パスが正しいか確認できます。この修正版のコードを試してみてください。これで、.msgファイルが正しく見つかるはずです。
MSGファイルに含まれる内容が複雑(例えば、表、画像、その他の形式)な場合、単純なテキスト変換では問題が生じることがあります。MSGファイルの内容を適切に処理するために、以下の点を考慮したコードに変更します:
以下のコードは、MSGファイルの内容をHTML形式で保存し、.txtファイルとして保存する改良版です。
Option Explicit
Sub ConvertMsgToTxt()
Dim folderPath As String
Dim msgFile As String
Dim outFile As String
Dim outlookApp As Object
Dim msg As Object
Dim fso As Object
Dim file As Object
Dim folderDialog As FileDialog
' フォルダ選択ダイアログを作成
Set folderDialog = Application.FileDialog(msoFileDialogFolderPicker)
' ダイアログのタイトルを設定
folderDialog.Title = "フォルダを選択してください"
' ダイアログを表示し、ユーザーがフォルダを選択した場合の処理
If folderDialog.Show = -1 Then
folderPath = folderDialog.SelectedItems(1)
' 選択されたフォルダのパスをメッセージボックスで表示
MsgBox "選択されたフォルダのパス: " & folderPath, vbInformation
' Outlookアプリケーションを起動
Set outlookApp = CreateObject("Outlook.Application")
' ファイルシステムオブジェクトを作成
Set fso = CreateObject("Scripting.FileSystemObject")
' フォルダーのパスの末尾にバックスラッシュを追加
If Right(folderPath, 1) <> "\" Then
folderPath = folderPath & "\"
End If
' フォルダー内の.msgファイルを検索
msgFile = Dir(folderPath & "*.msg")
' 各.msgファイルを.txtファイルに変換
Do While msgFile <> ""
On Error Resume Next ' エラーハンドリング
Set msg = outlookApp.CreateItemFromTemplate(folderPath & msgFile)
outFile = folderPath & Replace(msgFile, ".msg", ".txt")
If Not msg Is Nothing Then
' .msgファイルの内容を.txtファイルとして保存
Set file = fso.CreateTextFile(outFile, True)
file.WriteLine "Subject: " & msg.Subject
file.WriteLine "Body: " & msg.BodyFormat & msg.HTMLBody ' HTML形式で保存
' クリーンアップ
file.Close
End If
' 次の.msgファイルへ
msgFile = Dir
On Error GoTo 0 ' エラーハンドリングを元に戻す
Loop
' 終了メッセージ
MsgBox "すべての.msgファイルが.txtファイルに変換されました。", vbInformation
Else
MsgBox "フォルダが選択されませんでした。", vbExclamation
End If
End Sub
msg.HTMLBody
を使用してMSGファイルのHTMLコンテンツを取得し、保存します。On Error Resume Next
を使用してエラーを無視し、次のファイルに進むようにします。このコードを使用することで、表を含むMSGファイルもエラーなく変換できる可能性が高くなります。
Excel VBAで、アクティブセルが属しているテーブル(ListObject)の名前を取得するには、以下のコードを使用できます。これにより、アクティブセルがテーブル内にある場合、そのテーブル名を取得できます。
Sub GetActiveCellTableName()
Dim tbl As ListObject
Dim rng As Range
On Error Resume Next ' エラー処理
' アクティブセルが属するテーブルを取得
Set tbl = ActiveCell.ListObject
' テーブルが見つかったか確認
If Not tbl Is Nothing Then
MsgBox "アクティブセルのテーブル名は: " & tbl.Name
Else
MsgBox "アクティブセルはテーブル内ではありません。"
End If
End Sub
このコードでは、ActiveCell.ListObject
を使用して、アクティブセルが含まれているテーブル(ListObject)を取得します。もしアクティブセルがテーブル内にない場合、エラーを無視して「アクティブセルはテーブル内ではありません」と表示します。
このマクロを実行すると、アクティブセルが所属しているテーブル名がメッセージボックスに表示されます。
Excelで、テーブルではない部分に入力された数値をパワークエリで読み込む方法はありますか?
はい、Excelのパワークエリでテーブルではない部分に入力された数値を読み込む方法があります。通常、パワークエリはテーブルとして設定された範囲を直接読み込みますが、セル範囲として指定している場合でも、次の方法で任意の範囲を読み込むことができます。
1. 名前付き範囲を作成する:
• まず、テーブル化されていないセル範囲を選択し、その範囲に名前を付けます(例:「データ範囲」など)。
• Excelの上部メニュー「数式」タブから「名前の管理」をクリックして、選択した範囲に任意の名前を付けます。
2. パワークエリで名前付き範囲を読み込む:
• 「データ」タブに移動し、「テーブルまたは範囲から」ではなく「その他のソース」→「名前付き範囲から」を選択します。
• 表示される名前付き範囲リストから、先ほど作成した名前付き範囲を選択します。
3. パワークエリエディタで処理する:
• パワークエリエディタが開き、指定した範囲のデータが読み込まれます。必要に応じてフィルタリングや計算などの処理を行うことができます。
これで、テーブルとして設定していない範囲のデータをパワークエリで取得し、活用することができます。
Excel VBAや、パワークエリの覚え書き