kobouzu_suのプロフィール

@kobouzu_su kobouzu_su
ありがとう数76
質問数0
回答数93
ベストアンサー数
24
ベストアンサー率
45%
お礼率
0%

with hopes always

  • 登録日2007/03/19
  • 負数のみを対象としたSUMPRODUCT関数

    エクセル2000です。 たとえば A1:A40 がCCCでないもののうちの B1:B40 の中での最大値をSUMPRODUCT関数で求める方法は以下の式だと思います。 =SUMPRODUCT(MAX((A1:A40<>"CCC")*(B1:B40))) ところが、B1:B40 の数値がすべて負の数だった場合、返って来る答えは常に 0 になるようです。 最初は原因がわからず、途方にくれていましたが、A1:A4の中で値がCCCのセル場合、そのセルが返す値は FALSE で、これを対応するB列に乗じた積を 0 としているのではないかと推測しました。 そこで、次の式のように FALSEの数+1番目に大きい数を指定したところ、やっと負の数のなかから最大値を返すようになったように思います。 =SUMPRODUCT(LARGE((A1:A40<>"CCC")*(B1:B40),COUNTIF(A1:A40,"CCC")+1)) この推測は合っているのでしょうか? 他にもっと簡単なやりかたがあるのでしょうか?

  • エクセルVBAのFunctionについて

    エクセル2000です。 以下は、時間を与えれば、それに相当する挨拶が返ってくるFunctionのつもりです。 一応期待通りの働きはしてくれます。 質問は、Functionから ”messe” として返ってくる文字列を、Function内部で生成している、”hmsg”、”mes”、”s”、”kao(i)” にわけて取得できないかということです。 もちろん Functionを複数つくったり、返ってくる文字列”messe”を、”。”の位置を取得してMID関数等で分ければ取得できるのはわかるのですが、そんな手間をかけず、たとえば、MsgBox hmsg のような感じで簡単に ”hmsg”、”mes”、”s”、”kao(i)” それぞれの文字列を取得する方法があったらご教示くださいませ。 Sub test01() MsgBox messe(TimeValue("17:46")) End Sub Function messe(t As Date) As String Dim t2 As Integer, t3 As Integer, m As Integer, i As Integer, n As Integer Dim kao Dim s As String t2 = Hour(t) t3 = Hour(TimeValue(t) + TimeValue("01:00")) m = Minute(t) kao = Split("o(^o^)/,(*^o^*),(*´∇`*),(= ̄▽ ̄=)V,(〃^∇^〃),(=´▽`)ゞ,(^∇^),(〃^∇^)o,ヾ(@⌒ー⌒@)ノ, (#^。^#),o(^-^)o,ヾ(=^▽^=)ノ, \(*^▽^*)/ ,( ̄ー ̄)v", ",") Select Case t2 Case Is < 11: hmsg = "おはようございます。" Case Is < 17: hmsg = "こんにちは。" Case Else: hmsg = "こんばんは。" End Select Select Case m Case Is < 15: mes = t2 & "時を回りましたね。 " Case Is < 30: mes = "もうすぐ " & t2 & "時半になりますね。 " Case Is < 45: mes = t2 & "時半を過ぎてますね。" Case Else: mes = "もうすぐ " & t3 & "時になるんですね。 " End Select Select Case t2 Case 0: s = "とうとう日付が変わりました。 " Case 1, 2, 3, 4: s = "からだに気をつけてね。 " Case 5, 6: s = "朝になっちゃいました。 " Case 7, 8, 9: s = "また一日が始まりましたね。 " Case 10: s = "お昼にはまだもうちょっと・・・。 " Case 11: s = "おなかが空いちゃいました。 " Case 12: s = "お昼ですよ~。 " Case 13: s = "食後は眠くなっちゃいます。 " Case 14: s = "そろそろおやつが欲しいかも。 " Case 15, 16: s = "午後は長いですね。 " Case 17: s = "お疲れさまです。 " Case 18: s = "残業、お疲れさまです。 " Case 19, 20: s = "そろそろ切り上げませんか。 " Case 21, 22: s = "こんな遅くまで大変ですね。 " Case 23: s = "日付が変わっちゃいますよ。 " Case Else: s = "がんばってね。 " End Select Randomize i = Int(Rnd() * 14) messe = hmsg & mes & s & kao(i) End Function

  • エクセルVBAのFunctionについて

    エクセル2000です。 以下は、時間を与えれば、それに相当する挨拶が返ってくるFunctionのつもりです。 一応期待通りの働きはしてくれます。 質問は、Functionから ”messe” として返ってくる文字列を、Function内部で生成している、”hmsg”、”mes”、”s”、”kao(i)” にわけて取得できないかということです。 もちろん Functionを複数つくったり、返ってくる文字列”messe”を、”。”の位置を取得してMID関数等で分ければ取得できるのはわかるのですが、そんな手間をかけず、たとえば、MsgBox hmsg のような感じで簡単に ”hmsg”、”mes”、”s”、”kao(i)” それぞれの文字列を取得する方法があったらご教示くださいませ。 Sub test01() MsgBox messe(TimeValue("17:46")) End Sub Function messe(t As Date) As String Dim t2 As Integer, t3 As Integer, m As Integer, i As Integer, n As Integer Dim kao Dim s As String t2 = Hour(t) t3 = Hour(TimeValue(t) + TimeValue("01:00")) m = Minute(t) kao = Split("o(^o^)/,(*^o^*),(*´∇`*),(= ̄▽ ̄=)V,(〃^∇^〃),(=´▽`)ゞ,(^∇^),(〃^∇^)o,ヾ(@⌒ー⌒@)ノ, (#^。^#),o(^-^)o,ヾ(=^▽^=)ノ, \(*^▽^*)/ ,( ̄ー ̄)v", ",") Select Case t2 Case Is < 11: hmsg = "おはようございます。" Case Is < 17: hmsg = "こんにちは。" Case Else: hmsg = "こんばんは。" End Select Select Case m Case Is < 15: mes = t2 & "時を回りましたね。 " Case Is < 30: mes = "もうすぐ " & t2 & "時半になりますね。 " Case Is < 45: mes = t2 & "時半を過ぎてますね。" Case Else: mes = "もうすぐ " & t3 & "時になるんですね。 " End Select Select Case t2 Case 0: s = "とうとう日付が変わりました。 " Case 1, 2, 3, 4: s = "からだに気をつけてね。 " Case 5, 6: s = "朝になっちゃいました。 " Case 7, 8, 9: s = "また一日が始まりましたね。 " Case 10: s = "お昼にはまだもうちょっと・・・。 " Case 11: s = "おなかが空いちゃいました。 " Case 12: s = "お昼ですよ~。 " Case 13: s = "食後は眠くなっちゃいます。 " Case 14: s = "そろそろおやつが欲しいかも。 " Case 15, 16: s = "午後は長いですね。 " Case 17: s = "お疲れさまです。 " Case 18: s = "残業、お疲れさまです。 " Case 19, 20: s = "そろそろ切り上げませんか。 " Case 21, 22: s = "こんな遅くまで大変ですね。 " Case 23: s = "日付が変わっちゃいますよ。 " Case Else: s = "がんばってね。 " End Select Randomize i = Int(Rnd() * 14) messe = hmsg & mes & s & kao(i) End Function

  • エクセルVBAでTargetのセルに設定された「名前の定義」の取得方法は?

    例えば、A1、B2、C3セルに「名前の定義」で、それぞれ入力A、入力B、入力C という名前がつけてあります。 それらのセルに入力があった場合、Select Caseで分岐させ作動するマクロをつくりました。 簡略化すると以下のようなもので、一応正しく作動します。 Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("入力A,入力B,入力C")) Is Nothing Then Exit Sub Select Case Target.Address(0, 0) Case "A1" MsgBox "A処理します。" Case "B2" MsgBox "B処理します。" Case "C3" MsgBox "C処理します。" End Select End Sub ただ、せっかくセルに名前を定義してあるのに、個々の入力セルの判定をTarget.Addressでしているのが不満です。 ( ̄~ ̄;) 定義された名前を使えないかと以下のようにやってみましたが実行時エラーで「サポートしてません」となってしまいます。 (T.T) Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("入力A,入力B,入力C")) Is Nothing Then Exit Sub Select Case Target.Names.Name 'ここでエラー Case "入力A" MsgBox "A処理します。" Case "入力B" MsgBox "B処理します。" Case "入力C" MsgBox "C処理します。" End Select End Sub どうやったら、Targetに設定されている名前を取得できるのでしょうか? (^∇^`)? 実際の例はもっと対象が多いので、Select Caseを使わない以下の方法は避けたいのです。 If文の羅列(これでも正しく作動はします。) Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("入力A,入力B,入力C")) Is Nothing Then Exit Sub If Not Intersect(Target, Range("入力A")) Is Nothing Then MsgBox "A処理します。" ElseIf Not Intersect(Target, Range("入力B")) Is Nothing Then MsgBox "B処理します。" Else MsgBox "C処理します。" End If End Sub なにとぞよろしくお願いします。 (o。_。)oペコッ

  • エクセルVBAでShapeRangeについて

    すみません、教えてください。 以下のマクロは正常に動きます。 Sub TEST() With ActiveSheet For Each s In .Shapes If s.AutoShapeType = msoShape5pointStar Then s.Delete Next .Cells.Interior.ColorIndex = 1 Set AA = .Shapes.AddShape(msoShape5pointStar, 55, 22, 25#, 25#) AA.Fill.Visible = msoTrue AA.Fill.Solid AA.Fill.ForeColor.SchemeColor = 13 AA.Fill.Transparency = 0# AA.line.Weight = 0.75 AA.line.DashStyle = msoLineSolid AA.line.Style = msoLineSingle AA.line.Transparency = 0# AA.line.Visible = msoTrue AA.line.ForeColor.SchemeColor = 64 ' AA.Copy '(1) ' .Paste '(1) ' Set AB = Selection '(1) ' .Range("A1").Select'(1) Set AB = AA.Duplicate '(2) AB.Top = 44 AB.Left = 110 ' AB.ShapeRange.Fill.ForeColor.SchemeColor = 10'(1)の2 AB.Fill.ForeColor.SchemeColor = 10 '(2)の2 End With End Sub ところが、 Set AB = AA.Duplicate '(2)の部分を、コメントアウトしている '(1)の記述に変えると、 AB.Fill.ForeColor.SchemeColor = 10 '(2)の2 の部分も ' AB.ShapeRange.Fill.ForeColor.SchemeColor = 10'(1)の2 に変えないとエラーになります。 ' AA.Copy '(1) ' .Paste '(1) ' Set AB = Selection '(1) も Set AB = AA.Duplicate '(2) も、同じことのように思えるのですが、この違いで、ShapeRangeというのを入れたり消したりしなければならないのはどうしてでしょうか? エクセルは2000です。