タイトルがわかりづらくてすみません。
具体的には、次のような表とマクロがあった場合

  A    B
1  1   1
2     2
3      3
4      4
5      5

Sub test()
Dim a, g As Integer
Dim f As String
a = 1
Do
f = Cells(a, 2).Value
g = Len(Cells(1, 1).Value)
Cells(1, 1).Value = IIf(Cells(1, 1).Value <> "", Cells(1, 1).Value & "+" & f, f)
Cells(1, 1).Characters(start:=g + 2, Length:=Len(f)).Font.ColorIndex = 3
a = a + 1
Loop Until Cells(a, 2).Value = ""
End Sub

セルA1には「1+2+3+4+5」という結果が入りますが、最後の「5」だけが赤文字になります。
そうではなくて、新たに加えた「2+3+4+5」の部分すべてを赤文字にするにはどうすればよいでしょうか。
つまり、ループの最初の結果をそのまま保持したいということです。

未熟者なのと、もっと大きなマクロの一部を質問用に抜き出したものなので、たどたどしい文法になっていますが、その辺は目をつぶってください。
どうかよろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

とりあえず現状のコードを活かすとすると下記のようにするだけで動きますよ



Sub test()
Dim a, g As Integer
Dim f As String
a = 1
g = Len(Cells(1, 1).Value)

Do
f = Cells(a, 2).Value
Cells(1, 1).Value = IIf(Cells(1, 1).Value <> "", Cells(1, 1).Value & "+" & f, f)
a = a + 1
Loop Until Cells(a, 2).Value = ""

Cells(1, 1).Characters(Start:=g + 2, Length:=Len(Cells(1, 1)) - (g + 1)).Font.ColorIndex = 3
End Sub
    • good
    • 0
この回答へのお礼

なるほど。
赤文字部分の長さに注目すればよかったんですね。

ありがとうございました。

お礼日時:2009/05/12 11:05

話す場所が間違っているとは思いますがコメントさせていただきます。



IIFは個人的には好きではありません。さすがに数十倍は遅くなったことはありませんが。

例えば以下のようなコードがあった場合、上の方のIf文では問題なく処理できますが、下のIIF文ではエラーになってしまいます。

Sub testn()

Dim st As String

st = ""
'これはOK
If Len(st) > 0 Then
st = Mid(st, 1, Len(st) - 1)
Else
st = ""
End If
'こっちはNG
st = IIf(Len(st) > 0, Mid(st, 1, Len(st) - 1), "")

End Sub

これがエラーを分岐で避けることができなくなる現象だと思います。

以下のようなコードがあった場合、デバッガで1ステップずつ実行すると
testmとtestlが両方とも実行されているのがわかります。

st = IIf(Len(st) > 0, testm, testl)

Function testm() As String
testm = "a"
End Function
Function testl() As String
testl = "b"
End Function

右辺の式を全て評価してから結果を返すのがIIFなんだなぁと個人的に解釈しています。
だから普通のIF文なら回避できる箇所でエラーしてしまうのだろうと。

一見すっきり書けるように見えるIIF関数ですが、不要な処理を実行してしまう事になるので私はループの中ではあまり使いませんね。
    • good
    • 0
この回答へのお礼

何度もありがとうございます。
Iif関数は使わないようにします。

お礼日時:2009/05/12 11:13

こんばんは。



以下のわたしのマクロは、あまり、みなさんとかわり映えしません。少し、思ったことがあるので、書かせていただきました。

最近、他人のマクロで目立つ現象なのですが、ほんの数年前には、IIf 関数は、VBAでは使うなという暗黙のルールがありました。お疑いの方は、インターネット検索してみるとよいです。これは、Microsoft Help サイトにも書かれていたのですが、最近、調べたら、あまり詳しく書かれていなくなっていました。もともと、Access では、クエリでは使うのですが、VBAでは、あまり使われるものではありません。

IIf(Cells(1, 1).Value <> "", Cells(1, 1).Value & "+" & f, f)

この内部は、オブジェクトになりますので、マクロ自体を数十倍も遅くしたり、エラーを分岐で避けることができないなどの欠点がありますから、なるべく使わないようにする、というのが、以前には、言われていました。

Sub Test03()
  Dim org As Range
  Dim buf As String
  Dim i As Integer
  Dim j As Integer
  Dim o As Integer
  Set org = Range("A1")
  For i = 1 To Range("B65536").End(xlUp).Row
    If IsNumeric(Cells(i, 2).Value) Then
      buf = buf & "+" & Cells(i, 2).Value
    End If
  Next i
  o = Len(org.Text) + 1
  j = Len(buf)
  org.Value = org.Text & buf
  '新たに加えた部分すべてを赤文字
  org.Characters(Start:=o, Length:=j).Font.ColorIndex = 3
End Sub
    • good
    • 0
この回答へのお礼

確かに、IIf関数を使うと、解決不能(?)なエラーが出ることが時々あります。
考えてもわからないので、If関数に書き直していましたが、私の未熟さだけが原因ではなかったんですね(苦笑
これからはIif関数は使わないようにします。

どうもありがとうございました。

お礼日時:2009/05/12 11:11

質問のコードを生かすと


こんな感じかな?
Sub test01()
Dim a As Integer, g As Integer
Dim f As String
Dim i As Integer
a = 1
Do
f = Cells(a, 2).Value
Cells(1, 1) = IIf(Cells(1, 1).Value <> "", Cells(1, 1).Value & "+" & f, f)
g = Len(Cells(1, 1).Value)
For i = 3 To g Step 2
Cells(1, 1).Characters(Start:=i, Length:=Len(f)).Font.ColorIndex = 3
Next i
a = a + 1
Loop Until Cells(a, 2).Value = ""
End Sub

私が作るなら、こんな感じ
Sub test02()
Dim i As Integer, ii As Integer
Dim f As Integer
With Range("A1")
f = IIf(Len(.Value) = 0, 1, Len(.Value))
For i = 1 To Range("B65536").End(xlUp).Row
.Value = IIf(.Value = "", Cells(i, 2).Value, .Value & "+" & Cells(i, 2).Value)
Next i
ii = InStr(f, .Value, "+") + 1
For i = ii To Len(.Value)
If .Characters(Start:=i, Length:=1).Caption <> "+" Then
.Characters(Start:=i, Length:=1).Font.ColorIndex = 3
End If
Next i
End With
End Sub

B列のデータ桁や行数を変化させたり
連続で実行すると面白いかも
違いが分ると思います

参考まで
    • good
    • 0
この回答へのお礼

自作までしていただいてありがとうございます。
こちらも試してみたいと思います。

お世話になりました。

お礼日時:2009/05/12 11:08

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q元AKB48の中西里菜が「やまぐち りこ」と芸名を変えてAVデビューす

元AKB48の中西里菜が「やまぐち りこ」と芸名を変えてAVデビューすることになりましたが、彼女以外に元AKB48のメンバーで脱ぐ可能性のあるメンバーはいますか?

Aベストアンサー

成田梨紗、宇佐美友紀らが噂にあがっています。これから元AKB48メンバーのAVデビューが続出するって話もありますね。

参考URL:http://gi6t5rzr.blog122.fc2.com/blog-entry-3.html

Aベストアンサー

左側に1列挿入して、その列に「1,2,3,4,5,1,2,3・・・」と縦に数字を入れます。
縦計を取りたいセルで、
=SUMIF(A1:B20,1,B1:D20) 
のように入力すると、B1,B6,B11,B16のセル計が取れます。
同様に検索条件の「1」を「2」に変えると、
B2,B7,B12,B17のセル計が取れます。

この関数の意味は
=SUMIF(範囲、検索条件、合計範囲)です。

Q元AKB48の小嶋陽菜のファンだった方に質問です。 元AKB48の小嶋陽菜が「AKB48時代のこと、

元AKB48の小嶋陽菜のファンだった方に質問です。

元AKB48の小嶋陽菜が「AKB48時代のこと、もう全然記憶にないんです(笑)」と言ってますが、小嶋陽菜の元ファンの今の心境はどうですか?

Aベストアンサー

彼女なりのジョークかと思っています。

Q=IF(ISNA(VLOOKUP($A1,sheet2!$A$1:$B$12,2,FALSE)),"",VLOOKUP($A1,sheet2!$A$1:$B $

いつもお世話になってます。
以下の関数式について、お時間がありましたらどうぞご教示ください。

=IF(ISNA(VLOOKUP($A1,sheet2!$A$1:$B$12,2,FALSE)),"",VLOOKUP($A1,sheet2!$A$1:$B $12,2,FALSE))

「シート2の範囲指定した表にA1セルの値と同じ値の右隣になる値を返せ。ただし該当なき場合は空白とせよ。」

純粋になんでこのような構文になるのかが解りません。

1.ISNAってそもそもなんでしょう?
2.同じ式を繰り返すのはなぜ?
(模範式で、このように同じ式を繰り返す構文があまり無いように思えたのです。)

・参考となる他所のページがあれば教えて下さい。
・素人です。お手柔らかにお願いします。

(エクセル2003)

Aベストアンサー

1.ISNAってそもそもなんでしょう?
ISで始まる情報関数の一つで、#N/A!エラーのみを判定する関数
結果はTRUE(真),FALSE(偽)のいずれかになります。
エラー判定のIS関数には他に
ISERR:#N/A!を除くすべてのエラーを判定する関数
ISERROR:すべてのエラーを判定する関数
があります。

2.同じ式を繰り返すのはなぜ?
ISNAの判定する値がセルでなく数式の結果だからです。
A2=VLOOKUP($A1,sheet2!$A$1:$B$12,2,FALSE)
なら
A3=IF(ISNA(A2),"",A2)
ということになります。A2のように計算の為のセルを省略する為に
=IF(ISNA(数式),"",数式)のように同じ数式を2回繰り返しになってます。

Qアリスjapanの「やまぐちりこ」って、元AKBの中西里菜のことなんで

アリスjapanの「やまぐちりこ」って、元AKBの中西里菜のことなんですか?

Aベストアンサー

元AKB48の中西里菜が改名し、「やまぐちりこ」となりました。アリスjapanより8月にAVデビューします。こちらに詳しく書かれています。http://uci5wnc9.blog92.fc2.com/

Qエクセルで、=IF(A12="a",TRUE)は =A1="a"  ???

エクセルで、
=IF(A12="a",TRUE)

=A1="a"
と省略できるのですか?

やってみるとまったく同じようなのですが、いまいち不安です。

また、=IF(D4=TRUE,"OK!","No!")も、日頃=IF(D4,"OK!","No!")と略してますが、これも正しいんですよね?
気になったものですから確認させてください。

Aベストアンサー

こんにちは。maruru01です。

IF関数について、少し補足説明します。
IF関数は、No.1にもあるように、

=IF(条件式,真の場合,偽の場合)

という書式ですが、

=IF(条件式,真の場合)

と、偽の場合を省略することが出来ます。
ここで偽の場合は、FALSEという論理値を返します。
つまり、質問欄の1つ目の例に当たります。
なお、

=IF(条件式)

と、真の場合も省略することは出来ず、

=IF(条件式,,偽の場合)

と、空欄にすると、真の場合は数値の「0」を返すことになります。
ちなみに、偽の場合も、

=IF(条件式,真の場合,)

と、引数区切りのカンマだけ付けると、空欄と見なされて(省略とは異なる)数値の「0」を返します。

次に、条件式についてですが、
条件式は、

「左辺」+「比較演算子」+「右辺」

の書式になっているものを指します。
ここで、比較演算子とは、
「=、>、<、>=、<=、<>」
を指します。
条件式は、成立/不成立の結果、TRUE/FALSEという論理値を返します。
つまり、

=A1="a"

は、条件式の戻り値そのものを表示していることになります。
それに対して、IF関数の方は、条件式を判定した結果、真の場合と偽の場合をそれぞれ実行して表示しています。
その真の場合と偽の場合が、条件式の戻り値とちょうど一致しているということです。

さて、IF関数の第1引数は、通常は上記の条件式を指定しますが、実際はIF関数は第1引数を数値として判断しています。
その判定基準は、第1引数が、
0 → 偽の場合を実行
0以外 → 真の場合を実行
となります。
そして、第1引数が条件式の場合に限り、戻り値の論理値を、
TRUE → 1
FALSE → 0
と数値に変換して判定しているのです。
これが、質問欄の後半の2つの数式の挙動の違いの原因なのです。

=IF(D4=TRUE,"OK!","No!")

は、第1引数は「D4=TRUE」という条件式です。
この場合、戻り値は必ずTRUE/FALSE(=1/0)です。
(ただし、D4にエラーが入っている場合を除く)
一方、

=IF(D4,"OK!","No!")

の方は、第1引数は「D4」で、これはセルD4の値そのものです。
で、前述のように、IF関数は第1引数を数値として判定するので、このD4が数値(と論理値)以外の場合(文字列など)はエラーになります。
D4が数値(と論理値)の場合は、前述のように、「0」かそれ以外かで判定され、真/偽の場合のいづれかを実行して表示します。

このIF関数の第1引数が数値として判定されているということを利用した例が以下のようなものです。
例えば、A列に数値が1つでもあれば"OK"、1つもなければ(つまり0)"NG"を表示する場合、意味を考えれば、

=IF(COUNT(A:A)>0,"OK","NG")

ですが、これを、

=IF(COUNT(A:A),"OK","NG")

と、A列の数値の個数(COUNT関数の戻り値)そのもので判定することが出来るわけです。

以上、長くなりましたが、補足説明でした。

こんにちは。maruru01です。

IF関数について、少し補足説明します。
IF関数は、No.1にもあるように、

=IF(条件式,真の場合,偽の場合)

という書式ですが、

=IF(条件式,真の場合)

と、偽の場合を省略することが出来ます。
ここで偽の場合は、FALSEという論理値を返します。
つまり、質問欄の1つ目の例に当たります。
なお、

=IF(条件式)

と、真の場合も省略することは出来ず、

=IF(条件式,,偽の場合)

と、空欄にすると、真の場合は数値の「0」を返すことになります。
ちなみに、偽...続きを読む

QAkB元メンバーの中西里菜さんがAV女優になったって本当デスか?

AkB元メンバーの中西里菜さんがAV女優になったって本当デスか?
もしそうだったらショックデス(|||▽|||)
日本のアイドルってそもそもそいう風になるんデスか?

Aベストアンサー

はい、本当ですよ!
ちょっと前まで喘息とかで地元に帰るみたいな報道がありましたが、
それが一転この話ですからびっくりですよね~。

中西里菜ちゃんはアリスJAPANってとこからデビューするみたいですが、
元々AKB48でもかなり人気がありました。

「会いたかった」とかも歌ってましたよ!

アリスJAPANのほうで出してる宣材動画みたいなのがありました。
ショックだと思いますが一応みますか??

やっぱり売れなかったり、売れたとしても自分の手取りが少ないと考えるでしょう、きっと。
それか、何でも良いから一番になりたい!と考えてこういう結果になるアイドルもいると思いますよ。

Qエクセルで同じA列の中に、1,2,3,4,5,6,2,3,4,2,1,3,2,2,2,3,1という

エクセルで同じA列の中に、1,2,3,4,5,6,2,3,4,2,1,3,2,2,2,3,1,3,1というような順番で数字が並んでいます。

その数字の中で、1→3と3→1になるものがいくつあるか求めたいのですが、出す関数・マクロがわかりません。
教えていただけないでしょうか?

よろしくお願いします。

Aベストアンサー

こんばんは!

>A列の中に
とは行方向に数値が入っている!というコトでしょうか?

そうであれば
表示したいセルに
=COUNTIFS(A1:A1000,1,A2:A1001,3)+COUNTIFS(A1:A1000,3,A2:A1001,1)
としてみてください。

「1」の次の行が「3」の場合と
「3」の次の行が「1」の場合をプラスしています。m(_ _)m

Q新人AV女優 橘梨紗って元AKB研究生の…?

新人AV女優の橘梨紗って 元AKB第六回研究生(9期生)の高松恵理ちゃんですか?
ものすごく似てるってだけでもしかしたら本人じゃないとか…
真相はどうなのでしょうか?

ぱるるとか横山由依ちゃんと同期で頑張ってチームメンバーに昇格してほしかった子だけに
気になります…

Aベストアンサー

こんにちは。

ソフト・オン・デマンドというレーベルからデビューする
橘梨紗は元AKB48の高松恵理さんです。
AKB48のメンバーは事務所によっては雀の涙程の
給料をもらっているメンバーもいるそうですね。
中には生活保護を受けているメンバーもいるそうです。
あれだけの大人数で歌唱印税がちょこっと。
AKB48辞めてAV女優になるメンバーもいますよ。

Q=IF(A2="",A1,A2)

初心者ですいません。
このやり方で、今日の日付になったときに、A2の表示する方法が
あったら教えてください。

Aベストアンサー

と言う事は、A2が空白である事はあり得ない訳ですから
式としては、

=IF(A3=TODAY(),A2,A1) 今日の日付と同じだったら
もしくは
=IF(A3<=TODAY(),A2,A1) 今日の日付と同じだったら
今日の日付より、過去かもしくは同じだったら

です。


人気Q&Aランキング

おすすめ情報