[[20221020115329]] 『【VBA】変数宣言, 配列, 小数点の扱い方』(あみな) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『【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.