2013-10-26 16 views
11

私はVBA初心者です。私はExcelセルから呼び出すことができる関数を記述しようとしています。閉じられたブックを開き、セルの値を検索して返すことができます。ExcelセルからVBA関数を呼び出す方法

これまでのところ、私はこのようなマクロを作成する方法を知っている:

Sub OpenWorkbook() 
    Dim path As String 
    path = "C:\Users\UserName\Desktop\TestSample.xlsx" 

    Dim currentWb As Workbook 
    Set currentWb = ThisWorkbook 


    currentWb.Sheets("Sheet1").Range("A1") = OpenWorkbookToPullData(path, "B2") 
End Sub 


Function OpenWorkbookToPullData(path, cell) 

    Dim openWb As Workbook 
    Set openWb = Workbooks.Open(path, , True) 

    Dim openWs As Worksheet 
    Set openWs = openWb.Sheets("Sheet1") 

    OpenWorkbookToPullData = openWs.Range(cell) 

    openWb.Close (False) 

End Function 

マクロOpenWorkbook()は完全に正常動作しますが、私はExcelのセルから直接OpenWorkbookToPullData(...)を呼び出すようにしようとしていますとき、 、それは動作しません。ステートメント:

Set openWb = Workbooks.Open(path, , True) 

戻り値なし。

Excelセルから呼び出せるVBA関数に変換する方法を知っている人はいますか?

+3

http://www.wikihow.com/Create-a-User-Defined-Function-in-Microsoft-Excelが重要です。 – pnuts

+1

助けてくれてありがとう。 @pnuts私の問題は、VBAの一般的な機能を書く方法ではありませんが、ここでは特に具体的です。 OpenWorkbookToPullData(...)が呼び出され、私は入ることができますが、問題はWorkbooks.Open(...)が実行された行にあり、Nothingとして返されます。 OpenWorkbookToPullData(...)を呼び出すSub OpenWorkbook()は正常に動作します。 – user780069

+0

ありがとう@PortlandRunner ただし、マクロサブOpenWorkbook()が正常に機能するという意味で、関数自体が「機能する」。問題は実際にそこにある構文ではありません。 ExcelのセルからOpenWorkbookToPullData(...)を呼び出すと、Workbooks.Open(...)行はNothingを返します。サブルーチンから呼び出された場合は正常に動作します。 – user780069

答えて

1

あなたが遭遇した問題は、UDFはExcel環境を変更できないということです。呼び出し元のセルに値を返すことしかできません。

あなたが実際にVBAを必要としない与えられたサンプルについてはいくつかの選択肢

  1. があります。 See this answer

  2. をあなたは機能が動作しません、またそれが必要であるExecuteExcel4MacroまたはOLEDB

+0

@chrisneilson、ありがとう。 syntax = 'filepath'の問題は、ワークブックを開く必要があることです。約100のワークブックがあり、それぞれのセルから特定のセルが必要です。他の回避策がありますか?私はExecuteExcel4Macroを試しましたが、Excelのセルコールでも実行できないようです。 OLEDDBを使用した例がありますか? – user780069

+0

FYI、オプション#2を見ています。それは有望そうだ。それを変更する方法についてのヒントはありますか?私は何をしたいかをするためにそれを修正する方法をかなり確信していません... – user780069

+0

数式オプションでは、wbが開かれる必要はありません。だから私はそれを答えに含めました。 –

0

を使用することができます:

この式は、周りにかなり厄介な作業を使用し
='C:\Users\UserName\Desktop\[TestSample.xlsx]Sheet1'!$B$2

  • に動作します

    Sub OpenWorkbook() 
        Dim r1 As Range, r2 As Range, o As Workbook 
        Set r1 = ThisWorkbook.Sheets("Sheet1").Range("A1") 
        Set o = Workbooks.Open(Filename:="C:\TestFolder\ABC.xlsx") 
        Set r2 = ActiveWorkbook.Sheets("Sheet1").Range("B2") 
        [r1] = [r2] 
        o.Close 
    End Sub 
    
  • +0

    ありがとうございます。私はサブルーチンを書く方法を知っていますが、私は同じことをすることができる関数が必要です。 サブルーチンを書く場合は、パスやセルの位置などをハードコードする必要があります。私が持っている100個のExcelワークブックのそれぞれからいくつかのセルを引き出すことができるものを更新しようとしています。はるかに柔軟です。 – user780069

    +0

    私はあなたができるベストは、filespecs、シートネーム、およびセルのアドレスを配列に格納し、ループの中で私のようなコードを実行することだと思います....幸運! –

    25

    Here's the answer

    実行手順:

    1. を開き、Visual Basic Editorで。 Excelでは、MacであればAltキー + F11、Windows上の場合のFn +オプション + F11を打ちます。

    2. 新しいモジュールを挿入します。メニューから:挿入 - >モジュール。

    3. Public関数を作成します。例:

      Public Function findArea(ByVal width as Double, _ 
               ByVal height as Double) As Double 
          ' Return the area 
          findArea = width * height 
      End Function 
      
    4. 次に、あなたが他のあらゆる機能などの任意のセルにそれを使用する:=findArea(B12,C12)

    +0

    2番目のパラメータ(高さ)の値を入力すると、式に「一般的な問題」が表示され、セルに格納することを拒否します。残念ながら、それはドイツ語で報告しているので、ここでは例としてテキストを提供することはできません。 – Paul

    +0

    @Paulエラーメッセージなしで、バージョンと環境の詳細これを詳しく調べるのは難しい – FloatingRock

    +2

    通常、私はちょうど指示に従うよりもうまくいくと思っていました。ステップ2は重要です! – Adam

    関連する問題