• ベストアンサー

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

noname#61366
noname#61366

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

  • ベストアンサー
回答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

  • エクセル(IF関数)について

    IF関数について教えてください WINDOWS7を使っています。 エクセル2010で使ったIF関数が、2003や2007では機能しません。 そんなことがあるのでしょうか? MOD、 VALUE、 LEFT、 RIGHT等 簡単な組み合わせなのですが・・・。 もちろん同じように入力しています。 よろしくお願いします。

  • IF関数で結果が♯VARUE!のとき...

    EXCEL2000で、IF関数を使用しています。 条件式で,結果が♯VARUE!の時は、正を返したいのですが、うまくいきません。 教えて下さい。 実際に組んでいる式です。 =IF(FIND(" ",I6)=0,LEFT(I6,LEN(I6)),LEFT(I6,FIND(" ",I6,1)-1)) スペースがあればスペース前の文字列を返し、スペースがなければ全文字返すという式を組んでいます。 スペースがなければということで、FINDが0ならとしたのですが、上手くいかないため、エラーならば、という条件に変えようとしている次第です。 宜しくお願い致します。

  • ユーザ定義関数がうまく動きません。

    ユーザ定義関数がうまく動きません。 2月のA1セル値が1になっていたりします。 どこがおかしいのかわかりません。解決方法を教えていただけませんでしょうか。 よろしくお願いします。 【シートの設定】 シート名は1月・・・12月です。 各シートの A1セルは「=sheetname()」 B1セルは「月のチェックシート」 が入っています。 【VBAの設定】 Function SheetName() As String 'Application.Volatile If Len(ActiveSheet.Name) = 3 Then SheetName = Left(ActiveSheet.Name, 2) Else SheetName = Left(ActiveSheet.Name, 1) End If End Function

  • Left関数とRight関数を合わせたような

    こんにちは いつもお世話になっています。 A列に文字列があります。 文字の長さは不定ですが、左から3文字、右から4文字は共通して不要なので削除したいです。right,leftの両関数を合わせたような関数を教えてください。 二列で分けて処理するのではなく一回の関数で処理希望です。 =LEFT(A2,LEN(A2)-4)&RIGHT(A2,LEN(A2)-3) こんなので失敗しています。 よろしくお願いします エクセル2007

  • エクセル・IF関数・レフト/ライト関数について

    よろしくお願いいたします。 例えば ある文字の 右から5行目(最後の一文字はいらない)までの文字を 読み込みたいという時の事ですが・・・・ たとえば セルA1 の 日野自動車 (7205) という文字の 7205 だけを読み込みたいのです。 =RIGHT(A1,5) という関数を使うと 表示されるは 7205)と なります。最後の ) がいらないのです。(SAM計算ができなくなるため)   表示    日野自動車 (7205) 式        ↓=RIGHT(I1,5) 表示       7205) 式        ↓=LEFT(I2,4) 表示       7205 このやり方なら できましたが・・・・ IF関数をしこむ セルが2つになってしまうなどで 困ってしまったのです。セル 一つにIF関数をしこめば大丈夫な式はありますでしょうか? すみませんが よろしくお願いいたします。  

  • Excelユーザー定義関数が書き込まれているセルアドレス

    Excelのユーザー定義関数で、自分自身が書き込まれているセルのアドレスって取得出来るのでしょうか? 例えば、 Function test(MyString As String) As String test = "入力された文字は、「" & MyString & "」です" End Function とユーザー定義関数を作り A1のセルに =test("てすと") と書くと 入力された文字は、「てすと」ですと出てきます。 そこで、ユーザー定義関数のなかで、ユーザー定義関数を呼び出した式が入力されている(上記の例ですと、「A1」)アドレスを取得する方法ってありますか? どなたか、詳しい方いらっしゃいましたら教えてください。

  • 【VBA】ユーザ定義関数が動かない

    【VBA】ユーザ定義関数が動かない 下記のようなプログラムをVBEの標準モジュールに記述して、 ワークシートの適当なセルに「=tc("aa","bb")」と入力してEnterを押した所 セルの表示が「=tc("aa","bb")」となってしまい狙った効果が得られません。 本当は、「aabb」と表示させたいのですが、なぜうまくいかないのでしょうか。 ご教授願います。 ◆関数の仕様  引数1と引数2に入力された文字列を連結して返り値として返す。 ◆コード Function tc(str1 As Range, str2 As Range) As String Dim Str As String Str = str1.Value & str2.Valuett tt = Str End Function

  • IF関数

    A列とB列に数字が入力されており、An>=Bn(nは任意の整数)のとき、Cn(C列)にXという文字を入力、An<Bnの場合は、Cnは空欄にしたいのです。 IF関数を使ってCnに =IF(An>=Bn,X,) と入れてみましたが、An>=Bnの時は、♯Name?というエラーメッセージがでて、An<Bnの場合は0が入力されます。 どこが間違っているでしょうか。

  • エクセルの文字列・数値【長文です】

    昨日、LEFT関数の使い方を教えていただきましたが、これですとLEFT関数を用いたところが【文字列】として認識されました。【数値】として認識させる方法を教えてください。 初心者で申し訳ございません。 昨日の質問・いただいた回答は以下の通りでした。 ≪質問≫ [123456/あいうえお/abc][234567/かきくけこ/efg]のようなデータがいくつかあって(例えばA列に)、B列に[123456][234567]、C列に[あいうえお][かきくけこ]、D列に[abc][efg]と表記できるような【関数】を教えてください。 ≪いただいた回答≫ A1にデータがあったとして。 B列 =LEFT(A1,SEARCH("/",A1,1)-1) C列 =LEFT(RIGHT(A1,LEN(A1)-SEARCH("/",A1,1)),SEARCH("/",RIGHT(A1,LEN(A1)-SEARCH("/",A1,1)),1)-1) D列 =RIGHT(RIGHT(A1,LEN(A1)-SEARCH("/",A1,1)),LEN(RIGHT(A1,LEN(A1)-SEARCH("/",A1,1)))-SEARCH("/",RIGHT(A1,LEN(A1)-SEARCH("/",A1,1))))

  • Excelのユーザー定義関数について。

    ネットで調べて「アルファベットのみを半角にする」というユーザー定義関数を発見し使用していますが、 この関数にある特定の文字を変換する条件を追加することはできますでしょうか。 例えば、リンゴ という文字がセル内にある場合、ミカン に変換されて表示されるという条件を下記のユーザー定義関数に加える事ができますか。 もしくは、新たに別のユーザー定義関数を作るしかないのでしょうか。アドバイスよろしくお願いします。m(_ _ )m Function ASC_A(str As String) As String Dim i As Integer For i = 1 To Len(str) If Mid(str, i, 1) Like "[a-zA-Z]" Then Mid(str, i, 1) = StrConv(Mid(str, i, 1), vbNarrow) End If Next ASC_A = str End Function

専門家に質問してみよう