質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Outlook

Microsoft OutlookはMicrosoft Officeの一部として組み込まれている、のユーザー管理とメーラーの機能を持ち合わせたソフトウェアです。

Q&A

解決済

1回答

2167閲覧

エクセルのtodoリストをoutlookのtodoリストにマクロを使って反映させたい

cir

総合スコア19

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Outlook

Microsoft OutlookはMicrosoft Officeの一部として組み込まれている、のユーザー管理とメーラーの機能を持ち合わせたソフトウェアです。

0グッド

1クリップ

投稿2019/07/21 11:52

前提・実現したいこと

発生している問題・エラーメッセージ

outlookで以下のコードで実行を押しても、outlookのtodoリストに反映されません。
エラーメッセージはでていません。
気になるのは、outlookのマクロを実行すると、エクセルのタスクリストファイルが画面には表示されていないのに開いていることになり?、ファイルを開こうとしても読み取り専用でしか開くことができません。

該当のソースコード

VBA

1Sub TaskRegWithExcel() 2 3Dim objExcel As Excel.Application 4 5Dim wb As Workbook 6 7Dim ws As Worksheet 8 9Dim strFile As String 10 11Dim i As Long 12 13Dim objTask As TaskItem 14 15strFile = "C:/Users/Desktop/タスクリスト.xlsx" 16 17Set objExcel = New Excel.Application 18 19Set wb = objExcel.Workbooks.Open(strFile) 20 21Set ws = wb.Worksheets("タスク一覧") 22 23For i = 2 To maxRow 24 25    Set objTask = CreateItem(olTaskItem) 26 27    With objTask 28 29        .Subject = ws.Cells(i, 1).Value  'タスクのタイトル 30 31        .StartDate = ws.Cells(i, 2).Value       '開始日 32 33        .DueDate = ws.Cells(i, 3).Value         '期限 34 35        .ReminderSet = ws.Cells(i, 4).Value     'アラームを鳴らすかどうか 36 37        .ReminderTime = ws.Cells(i, 5).Value    'アラームを鳴らす時間 38 39        .Body = ws.Cells(i, 6).Value            'タスク内容 40 41        .Save 42 43    End With 44 45Next i 46 47End Sub 48

試したこと

For i = 2 To maxRow → For i = 2 To10
のようにすると
「インデントが有効の範囲にありません」といわれました(実際には50行ほどのタスクがあります)。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Forループの終わりであるmaxRowという変数がどこにも宣言されておらず、中身の定義もされていません。よって、Forループ自体が機能せずにエラーメッセージが出ていなかっただけでしょう。このようなミスをなくすためには、プログラムの最初の行に以下の1行を入力してください。

VBA

1Option Explicit

これをつけておけば、宣言されていない変数で実行しようとした時点でエラーになりますので、ミスをなくすことができるはずです。
Excelの最終行番号をmaxRowに代入してからForループを回してください。

質問者さんが試された通り、Forループの終わりを10などにしていれば正常に動くはずです。
該当のExcelデータがわかりませんので何とも言えませんが、入力するセルを間違えていないかチェックしたり、日付のセルに余計な文字が入っていたり(言い方を変えるとシリアル値ではないデータになっているとエラー)、TRUEかFALSEを入力するセルに余計な文字が入っていないかチェックしたり、そういった類の話になりそうに思います。
まずは本番のデータではなく、1行か2行の簡単なサンプルデータで間違いないタスクリストを作って試してみると動くでしょう。
ちなみに、エラーメッセージですが「インデント」ではなく「インデックス」だと思われます。

あと、開いたExcelを閉じるコードが記載されておりませんので、実行したら該当のExcelファイルは開きっぱなしです。
最後に以下のコードを追加して閉じてください。

VBA

1wb.Close

念のため、質問者さんのコードを書き換えた状態で載せておきます。

VBA

1Option Explicit 2 3Sub TaskRegWithExcel() 4 5 Dim objExcel As Excel.Application 6 Dim wb As Workbook 7 Dim ws As Worksheet 8 Dim strFile As String 9 Dim i As Long 10 Dim objTask As TaskItem 11 Dim maxRow 12 13 strFile = "C:\Users\Desktop/タスクリスト.xlsx" 14 15 Set objExcel = New Excel.Application 16 Set wb = objExcel.Workbooks.Open(strFile) 17 Set ws = wb.Worksheets("タスク一覧") 18 19 maxRow = ws.Cells(Rows.Count, 1).End(xlUp).Row '該当のExcelファイルの最終行を取得 20 21 For i = 2 To maxRow 22 Set objTask = CreateItem(olTaskItem) 23 With objTask 24 .Subject = ws.Cells(i, 1).Value 'タスクのタイトル 25 .StartDate = ws.Cells(i, 2).Value '開始日 26 .DueDate = ws.Cells(i, 3).Value '期限 27 .ReminderSet = ws.Cells(i, 4).Value 'アラームを鳴らすかどうか 28 .ReminderTime = ws.Cells(i, 5).Value 'アラームを鳴らす時間 29 .Body = ws.Cells(i, 6).Value 'タスク内容 30 .Save 31 End With 32 Next i 33 34 wb.Close 35 36End Sub

投稿2019/07/22 08:26

Secret

総合スコア220

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cir

2019/07/23 10:09

丁寧な回答ありがとうございます。 上記のコードを使ったところ、問題なく動かすことができました。 次回からは、サンプルデータで試すことを忘れずにやっていきたいと思います。 素人にもわかりやすい説明をありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問