[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『【VBA】変数宣言, 配列, 小数点の扱い方』(あみな)
VBA初心者です。長文になりますが、よろしくお願いします。 下記( 図1 )のように、A列に初期値( 直接入力した数値 )があります。
A3:A4 範囲、A7:A8 範囲 とそれぞれを単純に合計して B列に小計値を入れます。
それを、右側( 結果 )のように...ランキングを付与するのですが test_1 マクロを実行すると、結果( 図1 )となるのですが
B列の表示形式を整えるために、小数点第二位までを...形式( 0.00 )とした場合ですが 結果( 図2 )とするには、どうしたら上手く出来るでしょうか?
尚、test_2 は、現在思案中の失敗マクロとなります。( p_q) エ-ン お手数をお掛け致しますが、ご教授頂けると嬉しいです。
( 図1 )
|[A] |[B] |[C] | |[A] |[B] |[C] [1] |【初期値】|【小計値】|【 Rank 】| |【初期値】|【小計値】|【 Rank 】 [2] | | | | | | | [3] | 1.224| | | 『 結果 → 』| 1.224| 2.3| 2位 [4] | 1.076| | | | 1.076| | [5] | | | | | | | [6] | | | | | | | [7] | 1.646| | | | 1.646| 2.96| 1位 [8] | 1.314| | | | 1.314| | [9] | | | | | | | [10]| | | | | | | [11]| 0.956| | | | 0.956| 1.49| 4位 [12]| 0.529| | | | 0.529| | [13]| | | | | | | [14]| | | | | | | [15]| 1.091| | | | 1.091| 1.97| 3位 [16]| 0.874| | | | 0.874| | [17]| | | | | | | [18]| | | | | | | [19]| 0.525| | | | 0.525| 1.29| 5位 [20]| 0.765| | | | 0.765| |
( 図2 ) このようにしたいです。
|[A] |[B] |[C] [1] |【初期値】|【小計値】|【 Rank 】 [2] | | | [3] | 1.224| 2.30| 2位 [4] | 1.076| | [5] | | | [6] | | | [7] | 1.646| 2.96| 1位 [8] | 1.314| | [9] | | | [10]| | | [11]| 0.956| 1.49| 4位 [12]| 0.529| | [13]| | | [14]| | | [15]| 1.091| 1.97| 3位 [16]| 0.874| | [17]| | | [18]| | | [19]| 0.525| 1.29| 5位 [20]| 0.765| |
Sub test_1() '' セル値 : 2.3 は、正常に動作する
Dim ws As Worksheet Dim rngFind As Range Dim Num As Variant, pt(1 To 5) As Variant Dim q As Long, n As Long, rng_row As Long Dim round_off As Double, data(1 To 5) As Double Set ws = Sheets(1)
For q = 3 To 19 Step 4 Num = WorksheetFunction.Sum _ (ws.Range(ws.Cells(q, 1), ws.Cells(q, 1).Offset(1))) round_off = Application.WorksheetFunction.round(Num, 2) ws.Cells(q, 1).Offset(, 1) = round_off n = n + 1 data(n) = ws.Cells(q, 2) Next q
For q = LBound(data) To UBound(data) pt(q) = WorksheetFunction.Large(data, q) Set rngFind = ws.Columns(2).Find _ (What:=pt(q), LookIn:=xlValues, LookAt:=xlWhole) If Not rngFind Is Nothing Then rng_row = ws.Range(rngFind.Address(False, False)).Row ws.Cells(rng_row, 3) = q & "位" ws.Cells(rng_row, 3).HorizontalAlignment = xlRight Else: MsgBox "no value" End If Next
End Sub
Sub test_2() '' Stop を入れてローカルウインドウを確認するも、無理とわかるマクロ
Dim ws As Worksheet Dim rngFind As Range Dim pt(1 To 5) As Variant, Num As Variant Dim i As Long, q As Long, n As Long, rng_row As Long, k As Long Dim data(1 To 5) As Double, round_off As Double Set ws = Sheets(1)
For q = 3 To 19 Step 4 Num = WorksheetFunction.Sum _ (ws.Range(ws.Cells(q, 1), ws.Cells(q, 1).Offset(1))) round_off = Application.WorksheetFunction.round(Num, 2) ws.Cells(q, 1).Offset(, 1) = round_off ws.Cells(q, 1).Offset(, 1).NumberFormatLocal = "0.00" '' 小数点2桁表示 n = n + 1 If IsNumeric(ws.Cells(q, 2)) Then '' 数値判定 data(n) = CStr(ws.Cells(q, 2)) Else: ws.Cells(q, 3) = "not numeric" End If Next q
Stop For q = LBound(data) To UBound(data) pt(q) = WorksheetFunction.Large(data, q) Set rngFind = ws.Columns(2).Find _ (What:=pt(q), LookIn:=xlValues, LookAt:=xlWhole) If Not rngFind Is Nothing Then rng_row = ws.Range(rngFind.Address(False, False)).Row ws.Cells(rng_row, 3) = q & "位" ws.Cells(rng_row, 3).HorizontalAlignment = xlRight Else: MsgBox "no value" End If Next
End Sub
< 使用 アプリ:Excel2010、使用 OS:Windows10 >
Columns("B").NumberFormatLocal = "#,##0.00"
また、コードの方をつぶさに見ていないので壮大に勘違いしているかもしれませんが、配列つかったりしなくても単純に↓で解決しませんか?
Sub さんぷる() Dim i As Long
For i = 3 To Cells(Rows.Count, "A").End(xlUp).Row Step 4 Cells(i, "B").FormulaR1C1 = "=SUM(RC[-1]:R[1]C[-1])" Cells(i, "C").FormulaR1C1 = "=RANK(RC[-1],C[-1])" Next i
Columns("B").NumberFormatLocal = "#,##0.00" Columns("C").NumberFormatLocal = "#位" End Sub
(もこな2) 2022/10/20(木) 12:36:29
LookIn:=xlFormulas に変更するとよいのでは? 常連回答者のあみなさんとは別のかたですか? (γ) 2022/10/20(木) 12:50:36
もこなおね〜さま...ありがとうございます。 確認して検討中です。
(γ)さんありがとうございます。
常連回答者と言うほどではありませんが 日付け音痴の、あみなです。笑
LookIn:=xlFormulas に変更して今から してみます。 (あみな) 2022/10/20(木) 12:59:25
いえいえ常連回答者さんですよ。 (γ) 2022/10/20(木) 13:02:13
もこなおね〜さま
R1C1形式で、簡単にできちゃうのですね。 結果どうりできました。 R1C1形式も勉強不足なので、学習します。
でも今回は、配列を使用した...自己学習でしたので どうすればと…検討してましたが
(γ)さんの教えで
LookIn:=xlFormulas に変更したら一発解決でした。 そこに目が向きませんでしたorz ^^;
今後とも、ご教授をよろしくお願いします。 ありがとうございます。
(あみな) 2022/10/20(木) 13:37:33
単一セル毎に値を代入するパターンの場合なら、
文字列で代入する方法があります。
先頭0スタートや1.00をそのまま表示したい場合で
使えます。
ActiveCell.Value = Split("01234", "")
(tkit) 2022/10/20(木) 16:33:40
tkit さん…ありがとうございます。
Split(スプリット)って、
私、得意で... ボウリングで良く出すから知ってます。
えっ違う? 何? 英語 のスペル...一緒だお
VBA での Split の使い方ですか? 全然知りません。
Split関数で文字列を区切るつてのは イメージがありましたが…配列として操作できるってのは ほとんど活用したことがありません。
もっと勉強しなさいって?…あっ (*・∀・)ノ '`ィ ハイ!
丁度、今日、午前中に下記のサイトさんに訪問して ちょこっと勉強してました
※ExcelのセルにVBAで"001"をそのまま代入する方法 https://qiita.com/nukie_53/items/44b9793513571381991f
今から、著名な先生方の…HP見て勉強して来ます。
(あみな) 2022/10/20(木) 18:13:22
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.