• ベストアンサー

VBA for Excedで構文エラー(ユーザー関数でIFを使いたい)

以前、こちらで教えていただいた関数を頻回に使用する必要がでてきました。 関数は =IF(RIGHT(文字列,1)=CHAR(10),LEFT(文字列,LEN(文字列)-1),文字列) です。 最後に改行コードが入っていたらそれを削除したいので、関数用の列を追加し、右側の列に上記の関数を入れる仕組みです。 構文自体は難しくないのですが、手入力するには少々長い。 既に入力してあるファイルからコピーしてくるにはセルの指定(上記の"文字列")が元のファイルになってしまう。 でユーザー関数にしてみようと思って ------------------- Function DELKAIGYO(文字列 As Range) DELKAIGYO = IF(RIGHT(文字列,1)=CHAR(10),LEFT(文字列,LEN(文字列)-1),文字列) End Function ------------------- としてみたのですが、構文エラーとなってしまいます。 なぜでしょうか?? ユーザー関数にIF文は使用できないのでしょうか? またそういったことは何で調べればよいのでしょう? ネット上は探した(つもり)です。 環境:WinXP(SP2),Excel2002

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

もし、この関数が正しい値を戻すとしたら DELKAIGYO = IIf(Right(文字列, 1) = Chr(10), Left(文字列, Len(文字列) - 1), 文字列) です。

noname#61366
質問者

お礼

早速のご回答、ありがとうございます。 できました! 通常の関数とVBAの関数には微妙に違いがあるのですね。 もっと勉強したいと思います。 WEBのみで勉強しようと思うのが悪いのかなぁ...

その他の回答 (5)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.6

dolphina様 こんばんは。Wendy02です。 ワークシートの関数のほうが、遥かに難しいです。そして、ワークシートの関数の表現自体は、VBAに、100%移植できますが、かなり慣れてこないと、難しいものが出てきます。 >もっと勉強します... ひとつのきっかけや出会いが、いずれ、そこまで引きつけるものかもしれません。私は、昔分らなかった簡単なコードが、最近になって、意味がわかり、自分自身で組めるようになりました。でも、昔分らなかったコードの難易度は、すごく高いものだったと、初めて知りました。

noname#61366
質問者

お礼

ワークシートの関数のほうが、遥かに難しいです?? う,また言葉を間違えたのかな。 とりあえず,本を2冊買い足しました。 ありがとうございました。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.5

こんばんは。 Wendy02です。 >関数は =IF(RIGHT(文字列,1)=CHAR(10),LEFT(文字列,LEN(文字列)-1),文字列) です。 これは、良く知られた数式ですね。昨日、別のところで見ていたばかりです。 >手元の本にはIIFのことは載っていないので、サイトでどこか良いところはございませんでしょうか Access 関数では頻繁に見かけてもExcel VBAでは、一般的には、IIf は使うべきではないとされています。それは、VBAの処理速度を遅くさせることが原因だそうです。(これについては、私は、計ったことはありません。それは、それ以前に、めったに使われない関数だからです。) ご質問の最初のコードを手直ししてみました。 ちょっと替えれば、こんなに簡単に出来ますね。 ワークシートができれば、簡単ですよね。 Function DELKAIGYO(文字列 As String) If Right(文字列, 1) = Chr(10) Then  DELKAIGYO = Left(文字列, Len(文字列) - 1) Else  DELKAIGYO = 文字列 End If End Function 次は、私の考えたコードです。うまくいくとは限りませんが、なるべく近い形にしてみました。本来、正規表現を使いたいところですが、「いかにも」という感じに映るので、辞めました。 Return コードは、1つとは限らない。 また、末尾にないものは、削除しない。 という二つの条件に当てはまらないといけないと思います。 Function DelRetunCode(BaseString As String, Optional ReturnCode As String = vbLf) '末尾の改行コードを削除する。BaseString 文字列, '[ReturnCode]デフォルト =Char(10)  Dim myStr As String   myStr = BaseString   While InStrRev(myStr, ReturnCode) = Len(myStr)    myStr = Left$(myStr, Len(myStr) - 1)   Wend   DelRetunCode = myStr End Function なお、VBA のヘルプは、標準では入っていませんので、インストールしなければなりません。また、VBAのヘルプの内容には、ひじょうにムラがありますので、できれば、書籍などをお求めになると良いと思います。以前は、アスキー社で、VBAヘルプの補足版が出ていたのですが、既に絶版になってしまいました。

noname#61366
質問者

お礼

回答、ありがとうございます。 VBAのことを調べていると、よくWendy02さんのお名前を拝見します。 私は頭が固く、先日教えていただいた関数を簡単に入力する方法としてユーザー定義関数の方法を考えつくまでは良かったものの、 ユーザー定義関数も、シート上で使用する関数をVBAの文法に置き換えるしか思いつきませんでした。 このような表現方法があることを教えていただきましてありがとうございました。 (ちょうどさっき、複数改行が入ってしまっているデータに遭遇しました) しかし、後半のは意味が理解できない.... もっと勉強します... ちなみにVBAのヘルプはインストールしてあります。

  • o_chi_chi
  • ベストアンサー率45% (131/287)
回答No.4

関数逆引きの本(目的→関数)を購入して見ては。 ちなみにF1キーでのHELPはカーソルがあるだけで (反転しなくても)その単語を認識してくれます。

noname#61366
質問者

お礼

やはり関数の逆引きを買わねばダメでしょうか... 関数っていっぱいあるんですね? 調べてみます。ありがとうございます。

noname#22222
noname#22222
回答No.3

s_husky です。 サイトや入門書の類に頼るのはどーも!?と思います。 VBAエディターで iif と入力し、それを反転させて F1 キーを押して下さい。必要かつ十分なヘルプ文が表示されます。

noname#61366
質問者

補足

再度のご回答をありがとうございます。 でも、それってiifを知っていたらの話ですよね?? 私はIFしか知らなかったので、構文エラーで止まってしまいました。 ヘルプはよく利用するのですが... エクセル本体は関数をずらーーと見せてくれるので、地道に探すことはできるのですが、VBEはそこまで親切でないようなのでその関数自体を知るために、の勉強方法を教えていただけると嬉しいです。 すみません、今日は時間が... ありがとうございました!

noname#22222
noname#22222
回答No.2

うーん!エライ難しい関数ですね! Public Function DeleteLF(ByVal R As Range) As String   DeleteLF = Replace(R.Value, Chr$(10), "") End Function と Replace関数でChr$(10) を置換する方が簡単ですよ! 問いへの答えはNo1さんの通りです。 IF文とIIF関数は別物です。前者は文で、後者は関数です。

noname#61366
質問者

補足

アドバイスありがとうございました。 そのセルの中の最後の改行だけを削除したいので、ややこしい状態になっています。 ちょっとしたデータベース的な使い方をしていて、このデータをワードに差込むのですが、このセルのデータは番号付き箇条書きにするため、最後に改行が入っていると、余計な番号がついてしまうので.... 件数が少なければ見ながら1ページ1ページ作業するのですが、件数が4000近いもので.... ワークシート上で使っていたIFを関数だと思っていたのがそもそもの間違いだったのですね。 お詳しそうなので、もう1つお答えをいただけると嬉しいのですが... VBAの関数を勉強したいのですが、手元の本にはIIFのことは載っていないので、サイトでどこか良いところはございませんでしょうか?

関連するQ&A