[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『金種マクロ』(純丸)
以前、↓金種関数を作りましたが、一気に出すマクロを作ってみました。 [[20050423175641]]『金種関数』(純丸) 突っ込み、お待ちしております。 (純丸)(o^-')b
Option Explicit
Sub kinshu()
Dim myr As Range Dim myvalue As Long Dim hani As Range Dim uwagaki As String Dim shuturyoku As Range Dim maisu(8) As Long Dim kinshu As Variant Dim i As Integer
On Error Resume Next
kinshu = Array("10000", "5000", "1000", "500", "100", "50", "10", "5", "1")
Set hani = Application.InputBox(prompt:="金額範囲を入力して下さい", Title:="範囲指定", Type:=8)
再度:
Set shuturyoku = Application.InputBox(prompt:="出力先頭セルを入力して下さい", _
Default:=ActiveCell.Address, Title:="出力先指定", Type:=8)
If shuturyoku.Count <> 1 Then GoTo 再度
If Not shuturyoku.Resize(12, 3).Find("*") Is Nothing Then
shuturyoku.Resize(12, 3).Select
uwagaki = MsgBox("出力範囲にデータがあります。上書きしてよろしいですか?", vbYesNo, "上書き確認")
If uwagaki = vbNo Then
shuturyoku.Select
GoTo 再度
End If
End If
For Each myr In hani
myvalue = myr.Value
For i = 0 To 8
maisu(i) = maisu(i) + Int(myvalue / kinshu(i))
myvalue = myvalue Mod kinshu(i)
If myvalue <= 0 Then Exit For
Next i
Next myr
With shuturyoku
.Select
.Offset(0, 0).Value = "金 種"
.Offset(0, 1).Value = "枚 数"
.Offset(0, 2).Value = "金 額"
For i = 1 To 9
.Offset(i, 0).Value = kinshu(i - 1)
.Offset(i, 1).Value = maisu(i - 1)
.Offset(i, 2).FormulaR1C1 = "=(RC[-2]*RC[-1])"
Next i
.Offset(11, 2).FormulaR1C1 = "=SUM(R[-10]C:R[-1]C)"
End With
End Sub
何で中止できないの?
Dim shuturyoku As Range
On Error Resume Next
Do
Set shuturyoku = Nothing
Set shuturyoku = Application.InputBox(prompt:="出力先頭セルを入力して下さい", _
Default:=ActiveCell.Address, Title:="出力先指定", Type:=8)
If shuturyoku Is Nothing Then
MsgBox "中止"
Exit Sub
ElseIf shuturyoku.Count > 1 Then
MsgBox "XXXXXX"
Else
Exit Do
End If
Loop
BJ
確かに InputBox のキャンセルボタンの事を全然考えていませんでした。 と言うことで改良版です。BJさん、ありがとう。m(__)m (純丸)(o^-')b
Option Explicit
Sub kinshu()
Dim myr As Range Dim myvalue As Long Dim hani As Range Dim uwagaki As String Dim shuturyoku As Range Dim maisu(8) As Long Dim kinshu As Variant Dim i As Integer
On Error Resume Next
kinshu = Array("10000", "5000", "1000", "500", "100", "50", "10", "5", "1")
Set hani = Application.InputBox(prompt:="金額範囲を入力して下さい", Title:="範囲指定", Type:=8)
If hani Is Nothing Then
MsgBox "中止します"
Exit Sub
End If
再度:
Set shuturyoku = Nothing
Set shuturyoku = Application.InputBox(prompt:="出力先頭セルを入力して下さい", _
Default:=ActiveCell.Address, Title:="出力先指定", Type:=8)
If shuturyoku Is Nothing Then
MsgBox "中止します"
Exit Sub
End If
If shuturyoku.Count > 1 Then
MsgBox "一つのセルを選んで下さい"
GoTo 再度
End If
If Not shuturyoku.Resize(12, 3).Find("*") Is Nothing Then
shuturyoku.Resize(12, 3).Select
uwagaki = MsgBox("出力範囲にデータがあります。上書きしてよろしいですか?", vbYesNo, "上書き確認")
If uwagaki = vbNo Then
shuturyoku.Select
GoTo 再度
End If
End If
For Each myr In hani
myvalue = myr.Value
For i = 0 To 8
maisu(i) = maisu(i) + Int(myvalue / kinshu(i))
myvalue = myvalue Mod kinshu(i)
If myvalue <= 0 Then Exit For
Next i
Next myr
With shuturyoku
.Select
.Offset(0, 0).Value = "金 種"
.Offset(0, 1).Value = "枚 数"
.Offset(0, 2).Value = "金 額"
For i = 1 To 9
.Offset(i, 0).Value = kinshu(i - 1)
.Offset(i, 1).Value = maisu(i - 1)
.Offset(i, 2).FormulaR1C1 = "=(RC[-2]*RC[-1])"
Next i
.Offset(11, 2).FormulaR1C1 = "=SUM(R[-10]C:R[-1]C)"
End With
End Sub
こんばんわ。
shuturyoku.Resize(12, 3)....
を
shuturyoku.Cells(1,1).Resize(12, 3)....
とすれば、
If shuturyoku.Count > 1 Then
MsgBox "一つのセルを選んで下さい"
GoTo 再度
End If
は、要りません。
ついでに、
With shuturyoku
.Select
.Offset(0, 0).Value = "金 種"
.Offset(0, 1).Value = "枚 数"
.Offset(0, 2).Value = "金 額"
For i = 1 To 9
.Offset(i, 0).Value = kinshu(i - 1)
.Offset(i, 1).Value = maisu(i - 1)
.Offset(i, 2).FormulaR1C1 = "=(RC[-2]*RC[-1])"
Next i
.Offset(11, 2).FormulaR1C1 = "=SUM(R[-10]C:R[-1]C)"
End With
の部分は、以下のようになりますか?
With shuturyoku.Cells(1, 1)
.Resize(, 3) = Array("金 種", "枚 数", "金 額")
.Offset(1, 1).Resize(UBound(kinshu) + 1) = Application.Transpose(kinshu)
.Offset(1, 2).Resize(UBound(maisu) + 1) = Application.Transpose(maisu)
.Offset(1, 3).Resize(UBound(maisu) + 1).FormulaR1C1 = "=(RC[-2]*RC[-1])"
.Offset(11, 2).FormulaR1C1 = "=SUM(R[-10]C:R[-1]C)"
End With
(seiya)
seiyaさん、ありがとうございます。勉強になります。 >shuturyoku.Cells(1,1).Resize(12, 3).... とすれば、 の部分はよくわかりました。複数セルを入力しても、範囲の左上の セルを取得することによって問題なしとする訳ですね。
With 以下の部分ですが、配列についてはまだよくわかっておらず 一気に展開することには思い至りませんでした。 配列の要素数は9で固定なので、
With shuturyoku.Cells(1, 1)
.Resize(, 3) = Array("金 種", "枚 数", "金 額")
.Offset(1, 0).Resize(9) = Application.Transpose(kinshu)
.Offset(1, 1).Resize(9) = Application.Transpose(maisu)
.Offset(1, 2).Resize(9).FormulaR1C1 = "=(RC[-2]*RC[-1])"
.Offset(11, 2).FormulaR1C1 = "=SUM(R[-10]C:R[-1]C)"
End With
と、してみましたが、UBound を使わなければならない理由がありますか? (尚、ご提示いただいたコードでは、Offsetの列の指定が 1つずつずれていました。) (純丸)(o^-')b
おはようございます。
>UBound を使わなければならない理由がありますか?
ありません。kinshuの要素数を確認していなかったもので.....
>Offsetの列の指定が1つずつずれていました。
お許しを....
参考までに、配列を使用した場合の出力は出来る限り一気にしたほうが より高速になるようです。ご存知のように、オブジェクトにアクセスする 回数が多いほど遅くなるわけですので。 不要なSelectも同様です。(ほとんどのケースでSelectは必要ありません) (seiya)
おはようございます。配列の出力についてはよく理解出来ます。 もちろん Select についても承知していますが、今回は、出力後に 出力範囲の先頭セルをアクティブにした方がいいと思い、Select を 1行入れた次第です。 いろいろとありがとうございました。m(__)m (純丸)(o^-')b
純丸さん、おはようございます。 突っ込むことが出来ないので、σ(^o^;)なりに作ってみました。 ちょっと、無駄がありそうな気がしますが・・・
kisyu(a1) などと入力。 シートモジュールへ '-------------------------- Option Base 1 Private Sub Worksheet_Change(ByVal Target As Range) Dim kin As Long, kei As Long Dim MyA As Variant Dim MyAry(1 To 11, 1 To 2) As Variant Dim hani As Range, tbl As Range Dim data As Variant Dim sdrs As String Dim i As Long, r As Long
adrs = Target.Address
If Target.Count <> 1 Then: Exit Sub
If Left(Range(adrs), 7) <> "kinsyu(" Then: Exit Sub
data = Split(Range(adrs).Value, "(")(1)
If data = "" Then: Exit Sub
data = Left(data, Len(data) - 1)
Application.EnableEvents = False
Target = ""
If Not Range(adrs).Resize(12, 3).Find("*") Is Nothing Then
Range(adrs).Resize(12, 3).Select
If MsgBox("出力範囲にデータがあります。上書きしてよろしいですか?", vbYesNo, "上書き確認") = vbNo Then
MsgBox "中止しました"
Application.EnableEvents = True: Exit Sub
End If
Selection.ClearContents
End If
For Each tbl In Range(data)
kin = kin + tbl
Next tbl
MyA = Array("10000", "5000", "1000", "500", "100", "50", "10", "5", "1")
For r = 1 To 9
i = i + 1
MyAry(r, 1) = Int(kin / MyA(i))
MyAry(r, 2) = MyAry(r, 1) * MyA(i)
kin = kin - MyAry(r, 2)
kei = kei + MyAry(r, 2)
Next r
MyAry(11, 2) = kei
Cells(Range(adrs).Row + 1, Range(adrs).Column).Resize(9, 1) = Application.Transpose(MyA)
Range(adrs).Resize(, 3) = Array("金 種", "枚 数", "金 額")
Cells(Range(adrs).Row + 1, Range(adrs).Column + 1).Resize(11, 2) = MyAry
Application.EnableEvents = True
End Sub
(キリキ)(〃⌒o⌒)b
やっと検証出来ましたぁ。キリキさん提唱の Changeイベントですね。 使い道によってはイベントの方が使い勝手がいいかもです。 セルに一生懸命 kinshu(A1:A10) と入力しても何もおこらず、 ?と思っていたのですが、よく見たら kinsyu でした。 (^^; アセアセ (純丸)(o^-')b やっと会議終了
会議ご苦労様ですm(_ _)m
>よく見たら kinsyu でした。 ありゃりゃ、こちらも良く見たら 純丸さんのは、「kinshu」でしたね・・・ すんませんでした〜
(キリキ)(〃⌒o⌒)b
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.