2016-09-08 5 views
0

短い話ですが、私は自分のカスタム関数が関数の一部として数式項目(それを引き起こしたもの!)を補うようにしようとしています。ユーザーは公式にそれを追加していない場合は基本的にそのextraBitは、ユーザーフォームのListBoxで定義されExcel:それ自体を修正するカスタム関数?

Private Function heythere(blah As String) 
    extraBit = "title" 
    ActiveCell.Formula = Replace(ActiveCell.Formula, ")", "," & """" & extraBit & """" & ")") 
End Function 

:ここでは、蒸留例です。多くのオプションがあり、エントリの最初の引数に基づいてListBoxに動的に読み込まれます。説明するのはちょっと難しいですが、extraBitが数式で提供されている場合は、ユーザーフォームが表示されず、結果が直接表示されることを意味します。だから私は、extraBitが定義された後でエントリを "修理"したいと思う。基本的に、上記の例では=heythere(a1)=heythere(a1,"title")になります。

これは可能ですか?私はエントリを上書きするために別のプライベートサブを作成しようとしましたが、無駄です。任意の提案を事前に感謝...


編集:

Private Function heythere2(blah As String, Optional extraBit As String) 
    If extraBit = "" Then 
     extraBit = "title" 
     ActiveCell.Formula = Replace(ActiveCell.Formula, ")", "," & """" & extraBit & """" & ")") 
    End If 
End Function 
+0

私はユースケースを理解していません。ちょうどheythereのオプションの2番目のパラメータを持たないのはなぜですか? – Comintern

+0

申し訳ありませんが、私は2番目のパラメータを削除しました...それを元に戻して、それがどのように働くかを少し詳しく説明してください... – David

+0

何か:もしあなたの数式を文字列として保存してください。そして、あなたの 'extraBit'でその文字列を更新する方法は何でも使用してください。次に、 'Cells(1,1).Formula = myString'を実行できますか?あなたの例では、それは動作していますか?それともエラーが出ていますか? – BruceWayne

答えて

2

問題:動作するように意図された方法を明確にするためには、実際のUDFは、オプションの二引数で、より多くのこのようなものですあなたは数式で何をしようとしているのか分からず、戻り値は有効ではありません。これにより、エラーが発生していることが示されます。これがUDFの場合、セルが変更されるたびにコードを再実行するたびに無限ループに入ります。あなたのアプローチを再考してください。

Public Function heythere(blah As String, Optional extraBit As String = "") 
    On Error Resume Next 
    Dim formulaText As String 
    formulaText = ActiveCell.Formula 
    If extraBit = "" Then 
     extraBit = "title" 
    End If 
    formulaText = Replace(formulaText, ")", "," & Chr(34) & extraBit & Chr(34) & ")") 
    ActiveCell.Formula = formulaText 

    If Err.Number <> 0 Then 
     MsgBox Err.Description 
    End If 
End Function 

だから今、私たちは私たちのワークシート変更イベント

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) 
    If InStr(1, Target.Formula, ",") > 0 Then 

    Else 
     On Error Resume Next 
     Dim formulaText As String 
     formulaText = Target.Formula 

     formulaText = Replace(formulaText, ")", "," & Chr(34) & Target.Value & Chr(34) & ")") 
     Target.Formula = formulaText 

     If Err.Number <> 0 Then 
      MsgBox Err.Description 
     End If 
    End If 
End Sub 

式が更新されたビオラを、使用して式を更新し、あなたの式のビットを変更し、ワークシートの変更イベント

'Lets set the text of the cell to the value of the extrabit 
Public Function heythere(blah As String, Optional extraBit As String = "") As String 
    If extraBit = "" Then 
     extraBit = "title" 
    End If 
    heythere = extraBit 
End Function 

を使用することができます。 IMOこれは依然として悪いアプローチです。あなたがそれに取り組む前に、セルにどのフォーミュラがあるかをチェックする必要があります。

+0

ありがとうございます - 名前でソーセリ:...-)これは素晴らしい、素晴らしい作品です。私はできるだけタイトにするためにチェック手順に取り組んでいます。ありがとうございました! – David

関連する問題