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

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

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

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

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

Q&A

解決済

1回答

2224閲覧

VBAでOutlook2013のアドレス帳(既定の連絡先)を一括削除したい

ts_taro_yamada

総合スコア21

VBA

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

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

0グッド

0クリップ

投稿2019/06/14 16:03

お世話になります。

VBAでOutlook2013のアドレス帳(既定の連絡先)を一括削除する方法をご教授頂けないでしょうか。
そもそもVBAだけではObject操作することが難しい場合は、何か良い手段は無いでしょうか。

アドレス帳(既定の連絡先)のエクスポート、インポートはVBAで出来ることは確認できましたが、
実施したいこととして、エクスポートしたアドレス帳のファイル(PSTファイル)をインポートすると
重複して登録されてしまうので、一旦アドレス帳(既定の連絡先)を削除してからインポートしたいと考えています。
尚、連絡先は階層構造にはなっていません。既定である連絡先にアドレスを登録している状態です。

下記のインポートするVBA内にアドレス帳(既定の連絡先)を一括削除(クリア)するコードを組み込みたいと考えています。

Const PST_FILE = "test.pst"
Const olFolderContacts = 10
On Error Resume Next
Dim olkApp 'As Outlook.Application
Dim objPST 'As Store
Dim fldRoot 'As Folder
Dim fldSrc 'As Folder
Dim fldDst 'As Folder
Dim conSrc 'As ContactItem
Dim conDst 'As ContactItem
'
Set olkApp = CreateObject("Outlook.Application")
With olkApp.Session
Set fldDst = .GetDefaultFolder(olFolderContacts)
.AddStore PST_FILE
For Each objPST In .Stores
If objPST.FilePath = PST_FILE Then
Exit For
End If
Next
Set fldRoot = objPST.GetRootFolder()
Set fldSrc = fldRoot.Folders.Item("連絡先")
For Each conSrc In fldSrc.Items
Set conDst = conSrc.Copy()
conDst.Move fldDst
Next
.RemoveStore fldRoot
End With

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

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

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

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

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

guest

回答1

0

ベストアンサー

以下のような感じでしょうか。

vba

1With olkApp.Session 2 Set fldDst = .GetDefaultFolder(olFolderContacts) 3 4 Dim i As Long 5 For i = 1 To fldDst.Items.Count 6 fldDst.Items.Remove 1 7 Next i 8

ポイントとして、For Each を使わず中の要素の数の回数分1個目を消す、としているところです。


IndexValue
1A
2B
3C
4D
5E

上記の表のように要素が入っているとき、For Each で回して中の要素を消していくと、

1ループ目

IndexValue削除対象
1A
2B
3C
4D
5E

2ループ目

IndexValue削除対象
1B
2C
3D
4E

3ループ目

IndexValue削除対象
1B
2D
3E

と、どんどんずれてしまい、1回のループでは消しきることができません。

(このような問題はまま起こりえるため、言語によっては For Each ループ中の要素の追加・削除を禁止しているものもあります)

投稿2019/06/17 12:20

imihito

総合スコア2166

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

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

ts_taro_yamada

2019/06/19 10:23

ご回答ありがとうございました。解決できました。 最終的にVBSで動かしたかったため、下記のように修正し解決いたしました。 Set olkApp = CreateObject("Outlook.Application") With olkApp.Session Set fldDst = .GetDefaultFolder(olFolderContacts) For i = 1 To fldDst.Items.Count Step 1 fldDst.Items.Remove 1 Next
DavidGodfin

2022/12/06 06:57

特別なユーティリティを使用して、未使用の連絡先を検索し、マークを付けて削除する方が簡単かもしれません。Outlookの連絡先を操作するためのこれらのツールやその他のツールは、https://www.outlookfreeware.com/en/products/productivity の無料デモ版でご利用いただけます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問