Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(指定なし : 指定なし)
Re:(修正)行数や列数の増減に対応できるようにしたい
投稿日時: 18/05/13 16:44:43
投稿者: sy

まだ質問継続中と思いますが、また間違えて解決済にされてしまったのでしょうか。
http://www.moug.net/faq/viewtopic.php?t=77083
 

引用:
引用:
変数に一旦代入してからセルに一括転記するのなら以下のような記述になります。
    Dim 変数(8, 5) As Long
    Dim i As Long
    Dim k As Long
  
    For i = 0 To 8
        For k = 0 To 5
            変数(i, k) = Int(Rnd * 100)
        Next k
    Next i
    Sheets("Sheet1").Range("C3:H11").Value = 変数
に関してですが、Range("C3:H11")に同じ変数(i, k)が入ってしまうので、
各バラバラに数字を入れてあげるにはどのようにしたらよいのでしょうか?

ちょっと質問の意味が分かりませんでした?
C3:H11のセル範囲に全て同じ値が代入されてしまったと言う事でしょうか?
Sheets("Sheet1").Range("C3:H11").Value = 変数
最後セル範囲に一括代入する時は、変数の右の()は入れてはいけませんよ。
 
 
引用:
「Cells(3 + c, 10) = WorksheetFunction.Round(Cells(3 + c, 9) / h, 0)」の
最後の0は何を意味しているのですか?
最後の0はROUND関数の第二引数です。
少数何位になるように丸めると言う事を指定します。
0なら少数1位を四捨五入して、少数0位(要するに整数)に丸めています。
 
 
それとループで配列を使って、点数配置から集計までを一括で行うなら以下のようになります。
合計は乱数を求める時に一緒に累積加算しておけば、ループ終了時には合計が求まっていますよね。
平均は合計が求まれば、件数で割るだけです。
評価判定はselect caseを使えば以下のようにすっきりします。
件数の多い時は、「配列の第一要素数」と「外側のループ回数」と「一括代入セル範囲」の3カ所だけ増やせば対応できます。
    Dim 変数(8, 8) As Variant
    Dim i As Long
    Dim k As Long

    For i = 0 To 8
        For k = 0 To 5
            変数(i, k) = Int(Rnd * 100)
            '↓ここで合計を計算、各教科の点数を累積させる
            変数(i, 7) = 変数(i, 7) + 変数(i, k)
        Next k
        '↓ここで平均を計算、上のループで求めた合計を科目数で割る
        変数(i, 6) = WorksheetFunction.Round(変数(i, 7) / 6, 0)
        '↓ここで評価を判定
        Select Case 変数(i, 6)
            Case Is >= 70: 変数(i, 8) = "合格"
            Case Is >= 50: 変数(i, 8) = "再試験"
            Case Is >= 30: 変数(i, 8) = "留年"
            Case Else: 変数(i, 8) = "退学"
        End Select
    Next i
    Sheets("Sheet1").Range("C3:K11").Value = 変数

回答
投稿日時: 18/05/15 16:12:49
投稿者: santasan1224

お返事が遅くなりました。
大変申し訳ありません。
 

引用:
引用:
変数に一旦代入してからセルに一括転記するのなら以下のような記述になります。
    Dim 変数(8, 5) As Long
    Dim i As Long
    Dim k As Long
   
    For i = 0 To 8
        For k = 0 To 5
            変数(i, k) = Int(Rnd * 100)
        Next k
    Next i
    Sheets("Sheet1").Range("C3:H11").Value = 変数
に関してですが、Range("C3:H11")に同じ変数(i, k)が入ってしまうので、
各バラバラに数字を入れてあげるにはどのようにしたらよいのでしょうか?
 
ちょっと質問の意味が分かりませんでした?
C3:H11のセル範囲に全て同じ値が代入されてしまったと言う事でしょうか?
Sheets("Sheet1").Range("C3:H11").Value = 変数
最後セル範囲に一括代入する時は、変数の右の()は入れてはいけませんよ。

 
変数の右の()は入れてはいけないのですか?
 
 
 
 
引用:
引用:
「Cells(3 + c, 10) = WorksheetFunction.Round(Cells(3 + c, 9) / h, 0)」の
最後の0は何を意味しているのですか?
最後の0はROUND関数の第二引数です。
少数何位になるように丸めると言う事を指定します。
0なら少数1位を四捨五入して、少数0位(要するに整数)に丸めています。

 
最後の0は少数の位を丸めたりすることができるのですね。
一度使ってみます。
ありがとうございます。
 

回答
投稿日時: 18/05/15 19:23:13
投稿者: mattuwan44

Option Explicit
 
Sub test1改()
    Worksheets("Sheet1").Range("B2:K11").Borders.LineStyle = xlContinuous
End Sub
 
Sub test2改()
    With Worksheets("Sheet1").Range("B2:K11")
        With Intersect(.Cells, .Offset(1, 1))
            .Rows(0).Value = Array("国語", "英語", "数学", "理科", "社会", "美術", "平均", "合計", "評価")
            .Columns(0).Value = WorksheetFunction.Transpose(Array("A", "B", "C", "D", "E", "F", "G", "H", "I"))
        End With
    End With
End Sub
 
Sub test3改()
    Dim c As Range
    Dim s As String
 
    With Worksheets("Sheet1").Range("B2").CurrentRegion
        With Intersect(.Cells, .Offset(1, 1))
            .Columns(7).Formula = "=average(B3:G3)"
            .Columns(8).Formula = "=sum(B3:G3)"
            .Resize(, 6).Formula = "=int(RAND()*100)"
            .Value = .Value
 
            For Each c In .Columns(7).Cells
                Select Case c.Value
                    Case Is > 70: s = "合格"
                    Case Is >= 50: s = "再試験"
                    Case Is >= 30: s = "留年"
                    Case Else: s = "退学"
                End Select
                c.Offset(, 2).Value = s
            Next
        End With
    End With
End Sub
 
リンク先の例題は実用性がなく、無理やり作った例題ですねー。。。。
 
基本、やりたいのはエクセルVBAですよね?
ならば、シート上に名前や教科は先に入力されているのがまずは前提ですよね?
それを無理やりマクロでテストデータを作ってるだけですよね?
そしてエクセルを使うんだから当然強力な関数群を無視して自作するなんてのはしないですよね?
評価の部分も数式で出来ると思いますが、1つのセルに数式を押し込むとややこしくなるのと、
VBAで書いた方が気が楽だったので、
そっちにしました。でも、一覧を作っておいてVlookup関数で参照出来ればさらにいいかな?
 
で、本題。
>行数や列数の増減に対応できるようにしたい
CurrentRegionプロパティを使えると便利です。
また、Endプロパティというのを使うのもよくあるテクニックです。
その辺りを覚えるといいと思います。
 
参考URL>>
http://www.eurus.dti.ne.jp/~Yoneyama/Excel/vba/vba_cell.html#currentregion

投稿日時: 18/05/15 20:48:12
投稿者: sy

santasan1224 さんの引用:

引用:
引用:
C3:H11のセル範囲に全て同じ値が代入されてしまったと言う事でしょうか?
Sheets("Sheet1").Range("C3:H11").Value = 変数
最後セル範囲に一括代入する時は、変数の右の()は入れてはいけませんよ。

 
変数の右の()は入れてはいけないのですか?

変数の中身を一括で代入したい時は入れてはいけません。
配列の変数は()をつけなければ、その変数が持つ全ての要素を表します。
 
今回は、Dim 変数(8, 5) As Long と、縦が0〜8までの9つ、横が0〜5までの6つの範囲を持つ配列の変数になっていますので、変数とだけ記述すれば、縦9:横6の配列全てを表します。
なのでサイズを合わせたセル範囲に一括で代入できます。
Sheets("Sheet1").Range("C3:H11").Value = 変数

 
ですが、変数(i, k)としてしまうと、この変数の持つ全要素中の、縦i番目、横k番目の、1つだけを指定する事になります。
 
その上のループでiとkはループカウンタの数値が加算されているので、この時点ではそれぞれ8と5になっている為、変数(i, k)は、変数(8, 5)と、要は一番右下の要素1つだけを表します。
 
なので
Sheets("Sheet1").Range("C3:H11").Value = 変数(i, k)
とすると、C3〜H11の範囲全てに、変数の一番右下の値1つだけを代入する事になります。

投稿日時: 18/05/24 23:02:30
投稿者: sy

閉じます。