2017-03-15 4 views
0

Outlookで連絡先リストを整理するためのコードを書いています。OutlookのContactItemオブジェクトの2つの電話番号を交換する必要があります

私はさまざまな分野で「余分な」電話番号を保存していますが、今はそれらを移動したいと考えています。

具体的には、私がモバイルフィールドの非携帯番号と非モバイルフィールドの携帯番号を認識すると、それらを入れ替える必要があります。

ただし、以下のコードは機能しません。エラーは発生しませんが、スワップルーチンが復帰すると電話番号は変更されません。

私はByRefの使用が間違っているか、クラスプロパティを参照渡しできないか、クラスの文字列プロパティが奇妙な方法で振る舞い、私が推測できないと思います。

私は、誰かがそれを少なくとも行うことができないことを確認することができたとしても、私はそれをパズルしようとしている時間を無駄に停止しますPriortySwitch ARG1 ARG2 ARG3とコールPrioritySwitch(ARG1、ARG2、ARG3)の両方

を試してみましたでる。

Sub Whatever 
    Dim Ns As Outlook.NameSpace 
    Dim Contacts As Items 
    Dim Contact As ContactItem 

    Set Ns = Application.GetNamespace("MAPI") 

    'use the default folder 
    Set Contacts = Ns.GetDefaultFolder(olFolderContacts).Items.Restrict("[MessageClass]='IPM.Contact'") 

    'do whatever 
    On Error GoTo WTF 

    For Each Item In Contacts 
    If Item.Class = olContact Then 
     Set Contact = Item 
     With Contact 
     ' Call SetCategories(Contact) 
     '.MobileTelephoneNumber = FormatTel(.MobileTelephoneNumber) 
     '.AssistantTelephoneNumber = FormatTel(.AssistantTelephoneNumber) 
     '.Business2TelephoneNumber = FormatTel(.Business2TelephoneNumber) 
     '.BusinessFaxNumber = FormatTel(.BusinessFaxNumber) 
     '.BusinessTelephoneNumber = FormatTel(.BusinessTelephoneNumber) 
     '.CallbackTelephoneNumber = Format(.CallbackTelephoneNumber) 
     '.CarTelephoneNumber = FormatTel(.CarTelephoneNumber) 
     '.CompanyMainTelephoneNumber = FormatTel(.CompanyMainTelephoneNumber) 
     '.Home2TelephoneNumber = FormatTel(.Home2TelephoneNumber) 
     '.HomeFaxNumber = FormatTel(.HomeFaxNumber) 
     '.HomeTelephoneNumber = FormatTel(.HomeTelephoneNumber) 
     '.OtherFaxNumber = FormatTel(.OtherFaxNumber) 
     '.OtherTelephoneNumber = FormatTel(.OtherTelephoneNumber) 
     '.PagerNumber = FormatTel(.PagerNumber) 
     '.PrimaryTelephoneNumber = FormatTel(.PrimaryTelephoneNumber) 
     '.RadioTelephoneNumber = FormatTel(.RadioTelephoneNumber) 
     '.TTYTDDTelephoneNumber = FormatTel(.TTYTDDTelephoneNumber) 

     ' prioritise 
     PrioritySwitch .MobileTelephoneNumber, .BusinessTelephoneNumber, True 
     PrioritySwitch .MobileTelephoneNumber, .Business2TelephoneNumber, True 
     PrioritySwitch .MobileTelephoneNumber, .BusinessFaxNumber, True 
     PrioritySwitch .MobileTelephoneNumber, .CompanyMainTelephoneNumber, True 
     PrioritySwitch .MobileTelephoneNumber, .PrimaryTelephoneNumber, True 
     PrioritySwitch .MobileTelephoneNumber, .AssistantTelephoneNumber, True 
     PrioritySwitch .MobileTelephoneNumber, .CallbackTelephoneNumber, True 
     PrioritySwitch .MobileTelephoneNumber, .CarTelephoneNumber, True 
     PrioritySwitch .MobileTelephoneNumber, .CompanyMainTelephoneNumber, True 
     PrioritySwitch .MobileTelephoneNumber, .Home2TelephoneNumber, True 
     PrioritySwitch .MobileTelephoneNumber, .HomeTelephoneNumber, True 
     PrioritySwitch .MobileTelephoneNumber, .OtherTelephoneNumber, True 
     PrioritySwitch .MobileTelephoneNumber, .PagerNumber, True 
     PrioritySwitch .MobileTelephoneNumber, .HomeFaxNumber, True 
     PrioritySwitch .MobileTelephoneNumber, .OtherFaxNumber, True 

     If Not .Saved Then .Save 
     End With 
    End If 
    Next 
    Exit Sub 
    WTF: 
    Debug.Print Contact 
End Sub 

Sub PrioritySwitch(ByRef Tel1 As String, ByRef Tel2 As String, mobileOnly As Boolean) 
    Dim t1 As String 
    Dim switchTel As Boolean 

    switchTel = False 

    'Logic code goes here 
    switchTel = True 

    If switchTel Then 
    t1 = Tel1 
    Tel1 = Tel2 
    Tel2 = t1 
    End If 
End Sub 

答えて

0

あなたがこれを行う...

With Contact 
    '... 
    PrioritySwitch .MobileTelephoneNumber, .BusinessTelephoneNumber, True 

...あなたはContactオブジェクトのプロパティを呼んでいます。これは、電話番号を内部スタック変数に返します。その内部スタック変数は、ByRefPrioritySwitchSubに渡すものです。スタック変数が返ってくると、スタック変数は何にも割り当てられていないので単に破棄されます。これは

Dim stackVar1 As String 
stackVar1 = Contact.MobileTelephoneNumber 
Dim stackVar2 As String 
stackVar2 = Contact.BusinessTelephoneNumber 
PrioritySwitch stackVar1, stackVar2, True 
'...and then stackVar1 and stackVar2 disappear... 

ByRef ...と等価であるだけで魔法のようなプロパティにプロシージャをフックすることはできません - 彼らはVBAのクラスにどのようになるかENVISION、それは何が起こっているかにかなり近いので、 COMオブジェクトのプロパティを使用するとオンになります。

Public Property Let MobileTelephoneNumber(number As String) 
    'Frobs whatever Outlook does to store the number. 
End Property 

Public Property Get MobileTelephoneNumber() As String 
    'Frobs whatever Outlook does to retrieve the number. 
End Property 

あなたがCallByName機能を使用して、同様の何かを、そしてちょうどあなたのSubで直接プロパティを呼び出すことができ、言った:

Public Sub PrioritySwitch(target As ContactItem, propertyOne As String, _ 
          propertyTwo As String, mobileOnly As Boolean) 
    Tel1 = CallByName(target, propertyOne, VbGet) 
    Tel2 = CallByName(target, propertyTwo, VbGet) 

    '...code that sets switchTel 

    If switchTel Then 
     CallByName target, propertyOne, VbLet, Tel2 
     CallByName target, propertyTwo, VbLet, Tel1 
    End If 
End Sub 

次に、あなたの呼び出し元のコードが(もっとこのようになります。あなたがContactと関係がなければ、Withブロックなしで:

+0

ありがとうComintern、 – GreySpike

関連する問題