[[20150704031617]] 『表の表記』(中学生) ページの最後に飛ぶ

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

 

『表の表記』(中学生)

お世話になります。

表の比を求めて、値によってセルの数値の位置、太字、斜体そしてフォントの大きさを
変える。という事をしたいのです。

表はA5からAG30の範囲で、A列÷B列 B列÷C列・・・AF列÷AG列といった具合で
各セルの値(割る方のセル)を位置などずらしておおよその比を判断するというものです。
只、値のないところは N/A の表記になってます。

処理としては 比が 2以上でフォントサイズを12に設定。
          2未満、1.75以上で、セル左詰、太字、斜体。
          1.75未満、1.5以上で、セル左詰、太字。
          1.5未満、1.25以上で、セル左詰。
          1.25未満は何もしません。

プログラムを書きたいのですが、知識不足と自分のPCがないので思う様に
出来ません。 また、プログラムオタクの友人が異国に行ってしまったので
聞ける人がいません。 ちなみに私はハードオタクです。

諸先輩方の知恵をお貸し頂けると大変助かります。

それと、異国の友人が言っていた事で気になった事が、for nextは
各列ごとに処理していないから気をつけろ!と言われました。
(おそらく、for nextで処理すると思ったもので・・・)

合わせて教えて頂けると嬉しいです。
宜しくお願いします。

< 使用 Excel:Excel2007、使用 OS:Windows7 >


条件付き書式 というもので対応してはいかがでしょうか。
(γ) 2015/07/04(土) 07:21

 私もγさん同様、条件付書式で対応するのがいいのではと思います。
 値が変われば瞬時に状態も変わりますので。

 ただ、残念なことに、条件付書式ではフォントサイズの設定やセル内の横位置の設定ができないですねぇ。

 なので、マクロ処理ということで。

 書いただけで、コンパイルレベルのチェックしかしていませんが。
 (これをChangeイベントあたりで処理すれば、値が変わった時に瞬時に書式もかわりますけど、とりあえず)

 Sub Sample()
    Dim r As Range
    Dim c As Range
    Dim myBold As Boolean
    Dim myItalic As Boolean
    Dim myHA As Long
    Dim mySize As Double
    Dim ck As Double

    Application.ScreenUpdating = False

    With Range("A5:G30")
        'いったんすべてのセルの状態を通常ベースにする
        .Font.Size = Application.StandardFontSize
        .Font.Italic = False
        .Font.Bold = False
        .HorizontalAlignment = xlCenter

        For Each r In .Cells.Rows
            For Each c In r.Cells
                If Not IsEmpty(c.Offset(, 1)) Then
                    ck = c.Value / c.Offset(, 1).Value
                    If ck >= 1.25 Then
                        mySize = Application.StandardFontSize
                        myItalic = False
                        myBold = False
                        myHA = xlCenter
                        Select Case ck
                            Case Is < 1.5
                                myHA = xlLeft
                            Case Is < 1.75
                                myHA = xlLeft
                                myBold = True
                            Case Is < 2
                                myHA = xlLeft
                                myBold = True
                                myItalic = True
                            Case Else
                                mySize = 12
                        End Select
                        With c
                            .Font.Size = mySize
                            .Font.Italic = myItalic
                            .Font.Bold = myBold
                            .HorizontalAlignment = myHA
                        End With
                    End If
                End If
            Next
        Next
    End With

 End Sub

(β) 2015/07/04(土) 07:48


β様、γ様
回答ありがとうございます。
中学のボランティア活動で近所の川の清掃をしていたので返事が遅れました。
すみませんでした。
β様プログラムまで書いて頂きありがとうございます。
プログラムを実行したところ 
 ck = c.Value / c.Offset(, 1).Value − 型が一致しませんと出ます。
どうしたら良いのですか?
教えてください。

(中学生) 2015/07/04(土) 13:09


 領域内のセルはすべて数字か空白だと思っているんですが、文字列なんかもあるということですか?
 あるいは、式なんかが入っていて、空白になっているところがあるとか?

 もし、そういったことがあるなら

                If Not IsEmpty(c.Offset(, 1)) Then
                    ck = c.Value / c.Offset(, 1).Value

 これを

                If Val(c.Offset(, 1).Value) <> 0 Then
                    ck = Val(c.Value)/ Val(c.Offset(, 1).Value)

 こうして試してみてください。

(β) 2015/07/04(土) 14:04


>あるいは、式なんかが入っていて、空白になっているところがあるとか?

 空白でなく、エラーになっている(#N/A)ということだと思われます

(マナ) 2015/07/04(土) 14:23


 To マナさん

 あぁ、そうですね。ご指摘深謝。

 To 中学生 さん

 エラー値セルの対応、加えて、心配なので、数値変換してチェックしたものを以下に。
 (ついでに、アップ済みの初期値設定の値で誤りがありましたので、それも直してあります)

 Sub Sample2()
    Dim r As Range
    Dim c As Range
    Dim myBold As Boolean
    Dim myItalic As Boolean
    Dim myHA As Long
    Dim mySize As Double
    Dim ck As Double

    Application.ScreenUpdating = False

    With Range("A5:G30")
        'いったんすべてのセルの状態を通常ベースにする
        .Font.Size = Application.StandardFontSize
        .Font.Italic = False
        .Font.Bold = False
        .HorizontalAlignment = xlGeneral

        For Each r In .Cells.Rows
            For Each c In r.Cells
                If Not IsError(c) And Not IsError(c.Offset(, 1)) Then
                    If Val(c.Offset(, 1).Value) <> 0 Then
                        ck = Val(c.Value) / Val(c.Offset(, 1).Value)
                        If ck >= 1.25 Then
                            mySize = Application.StandardFontSize
                            myItalic = False
                            myBold = False
                            myHA = xlGeneral
                            Select Case ck
                                Case Is < 1.5
                                    myHA = xlLeft
                                Case Is < 1.75
                                    myHA = xlLeft
                                    myBold = True
                                Case Is < 2
                                    myHA = xlLeft
                                    myBold = True
                                    myItalic = True
                                Case Else
                                    mySize = 12
                            End Select
                            With c
                                .Font.Size = mySize
                                .Font.Italic = myItalic
                                .Font.Bold = myBold
                                .HorizontalAlignment = myHA
                            End With
                        End If
                    End If
                End If
            Next
        Next
    End With

 End Sub

(β) 2015/07/04(土) 14:33


β様、マナ様
ありがとうございます。

β様 早速動かせてみましたけど処理が逆でした。

 ck = Val(c.Value) / Val(c.Offset(, 1).Value)を下記の

ck = Val(c.Offset(, 1).Value) / Val(c.Value)に変更してみました。
すると エラーで 0で除算しました。が表示されます。
この時のVal(c.Value)は N/A の表記でセルに入ってます。
どうしたら良いのでしょうか?

 
(中学生) 2015/07/04(土) 15:05


 If Val(c.Offset(, 1).Value) <> 0 Then  これを

 If Val(c.Offset.Value) <> 0 Then に。

(β) 2015/07/04(土) 15:41


β様
ありがとうございます。
プログラムは動くのですが、割られる数の方が処理されます。

A列(割られる数)÷ B列(割る数)=ck
割る数を処理したいのですがどの様にすれば良いのでしょうか?
(中学生) 2015/07/04(土) 16:08


 コードをよ〜く、おいかけるとわかると思うのですがね?

 コードでは まず 対象の領域からセルを抜出し、c という変数に格納しています。
 で、c.Offset(,1) は c の右隣りのセル。c.Offset(,-1) は c の左隣のセルです。
 どちらを、どちらで割るのか、それは、要件次第。
 A/B ではなく B/A だったので、そちらで、ck = Val(c.Offset(, 1).Value) / Val(c.Value) にしたわけですよね。
 ちゃんと、そこのところは、コードから理解されたんですよね。

 で、問題は、どこのセルに対して、書式をセットするかということですね。
 コードでは、

                            With c
                                .Font.Size = mySize
                                .Font.Italic = myItalic
                                .Font.Bold = myBold
                                .HorizontalAlignment = myHA
                            End With

 c つまり、A のセルに対して行っていますね。
 ここを、そうではなく、割るほうのセル B のセルにしたいということなら、この With c の c を
 何かに変えればいいと思いませんか。で、何に変えるべきかはおわかりですよね。

(β) 2015/07/04(土) 17:59


β様
最後までご指導ありがとうございました。
希望通りの動きで感動しました。
今までハードだけだったのでソフトの方もやりたいと思います。
受験勉強が終わって自由な時間が出来たら頑張ってみようと思います。

(中学生) 2015/07/04(土) 20:27


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.