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

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

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

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

Outlook

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

Q&A

解決済

2回答

2364閲覧

vbaでの Range オブジェクトを使用しない複数条件検索方法

nobita_nobi

総合スコア16

VBA

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

Outlook

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

0グッド

0クリップ

投稿2019/09/01 06:36

編集2019/09/01 07:47

質問させていただきます。
現在、メールを自動転送するプログラムを書いていて、
転送先のメールアドレス(名前、部署etc..) などをエクセルで管理し、
outlook側から読み込もうとしています。

Excel vbaだと以下の宣言ができるのですが、OutlookだとRangeがないためか、宣言できません。
宣言する方法はあるのでしょうか?

vba

1Dim c As Range ←ここで定義のエラーが発生します。 2Dim mail_add As String 3 4For Each c In Range("A2:G7") 5 If c.Value = "XX" Then  ' 条件1 6 If c.Offset(0, 2).Value = "hoge" Then '条件2  7 mail_add = c.Offset(0, 5) 8 End If 9 End If 10Next

もしくは、Rangeオブジェクトを使用しない複数条件での
検索方法について、アドバイスいただけると幸いです。


1.OutlookからExcel読み込む ←これはOK
2.複数条件(名前、部署)の検索
3.ヒットした行のメールアドレスを変数に格納する


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

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

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

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

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

meg_

2019/09/01 07:26

「1.OutlookからExcel読み込む ←これはOK」 上記をどうのように実装したのでしょうか? 上記が実装できるのなら2も出来ると思うのですが、違うのでしょうか?
nobita_nobi

2019/09/01 07:39

すいません、質問の仕方が悪かったです。 Rangeオブジェクトを使わずに、列の複数条件を検索する方法はあるでしょうか? outlookだとRangeがないため、質問に記載したコードでは複数条件検索ができませんでした。 Excel読み込み自体は以下で実装しました。 Dim oApp As Object Set oApp = CreateObject("Excel.Application") oApp.Workbooks.Open ("C:\Users¥xxxx")
guest

回答2

0

  1. Range型を宣言する方法
  2. Range型を明示しない方法

の2パターンがあります。

Range型を宣言する方法

メニューバーの「ツール」の「参照設定」から
Microsoft Excel XX.X Object Library(XX.XはOfficeのバージョンによって変わる)を参照します。

参照することでExcelにおけるRangeの定義が読み込まれるため、Range型の変数を宣言出来ます。

この時の注意として、同じ名前の型がある場合(e.g. Application)、型の判別がしにくくなるため、
型の前にライブラリ名を付けると良いでしょう(e.g. As Excel.Application)

vba

1Dim oApp As Excel.Application 2Set oApp = CreateObject("Excel.Application") 3Dim wb As Excel.Workbook 4Set wb = oApp.Workbooks.Open("C:\Users\xxxx") 5 6'状況によって要修正 7Dim ws As Excel.Worksheet 8Set ws = wb.ActiveSheet 9 10Dim c As Excel.Range '←ここで定義のエラーが発生します。 11Dim mail_add As String 12 13For Each c In ws.Range("A2:G7") '参照設定がある場合`Range("A2:G7")`と書いてもエラーは起きないが、意図しない結果になりやすい 14 If c.Value = "XX" Then ' 条件1 15 If c.Offset(0, 2).Value = "hoge" Then '条件2 16 mail_add = c.Offset(0, 5).Value 17 End If 18 End If 19Next

参照設定を設定し、型を明示して処理を書くことを「事前バインディング」・「アーリーバインディング」と呼びます。

Range型を明示しない方法

Excel関連の型を全てObjectで宣言すればそれでOKです。

vba

1Dim oApp As Object 'As Excel.Application 2Set oApp = CreateObject("Excel.Application") 3Dim wb As Object 'As Excel.Workbook 4Set wb = oApp.Workbooks.Open("C:\Users\xxxx") 5 6'状況によって要修正 7Dim ws As Object 'As Excel.Worksheet 8Set ws = wb.ActiveSheet 9 10Dim c As Object 'As Excel.Range '←ここで定義のエラーが発生します。 11Dim mail_add As String 12 13For Each c In ws.Range("A2:G7") '参照設定がある場合`Range("A2:G7")`と書いてもエラーは起きないが、意図しない結果になりやすい 14 If c.Value = "XX" Then ' 条件1 15 If c.Offset(0, 2).Value = "hoge" Then '条件2 16 mail_add = c.Offset(0, 5).Value 17 End If 18 End If 19Next

型を明示せず、Object型変数などを使って処理を書くことを「実行時バインディング」・「レイトバインディング」と呼びます。

投稿2019/09/01 08:46

imihito

総合スコア2166

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

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

nobita_nobi

2019/09/01 08:54

ご回答ありがとうございます。 教えて頂いた方法の両方で実行することができました。とても参考になりました。 お手数お掛けしました。
guest

0

ベストアンサー

【追記】下記コードで2.xlsxのsheet1のA1セルの値を取得できます。

Python

1Sub test() 2 3 Dim oApp As Object 4 5 Set oApp = CreateObject("Excel.Application") 6 7 With oApp.Workbooks.Open("C:\Users\Documents\2.xlsx") 8 MsgBox .WorkSheets(1).Range("A1").Value 9 End With 10 11End Sub

エクセルでRangeとしているところを、アウトルックでは「oApp.Range」とすれば良いかと思います。

vba

1oApp.Range

※アウトルックにRangeオブジェクトはないのでエクセルApplicationのRangeオブジェクトと明示します。

投稿2019/09/01 08:02

編集2019/09/01 08:29
meg_

総合スコア10577

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

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

nobita_nobi

2019/09/01 08:09

ご回答ありがとうございます。 修正してみましたが、Dim c As oApp.Range でコンパイルエラーが発生しました。 ”ユーザ定義型は定義されていません”
meg_

2019/09/01 08:15

「Set oApp = CreateObject("Excel.Application")」の後でないと駄目ですね。※oAppが定義された後 宣言文なしでコーディングしても良いと思いますよ。
meg_

2019/09/01 08:20

シートのセルを操作するなら、普通にworkbooks.worksheets(XX).cells~で操作できるはずです。※試してません
nobita_nobi

2019/09/01 08:26

ありがとうございます。 Set oApp = CreateObject("Excel.Application")の後ですが駄目でした。 他の複数条件での検索方法を調べてみます。
nobita_nobi

2019/09/01 08:45

教えていただいた、oApp と Cells~でできました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問