![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?a65a0e2)
BMIの結果から、痩せ・標準・やや肥満・肥満 の4つに判定したいのですが、下記のコードを実行しても反映されません。xlToRightをしているので自動的に右に進んでいくものだと思っていたのですが…。
'求められたBMIで判定をし該当セルに書き込む より下を確認して頂きたいです。
よろしくお願いします。
Sub report5()
Dim i As Integer, j As Integer, students As Integer
Dim lastRow As Integer, firstClm As Integer
Dim iStart As Integer, iEnd As Integer
Dim height(5) As Single, weight(5) As Integer
Dim heightStandard(5) As Double, BMI(5) As Double
lastRow = Cells(Rows.Count, "B").End(xlUp).Row
firstClm = Cells(lastRow, "A").End(xlToRight).Column
students = 5
' Debug.print lastRow & "/" & firstClm
iStart = lastRow - students + 1
iEnd = lastRow
For i = 1 To students
'身長と体重を配列の中に保存する
height(i) = Cells(i + 29, "C") / 100
weight(i) = Cells(i + 29, "D")
'標準体重とBMIを求めて配列の中に保存する
'標準体重kg=22*(身長m)^2
Cells(i + 29, "E") = 22 * (Cells(i + 29, "C") / 100) ^ 2
'標準体重とBMIを該当セルに書き込む
Cells(i + 29, "F") = Cells(i + 29, "D") / (Cells(i + 29, "C") / 100) ^ 2
'求められたBMIで判定をし該当セルに書き込む
If Cells(i + 29, "F") <= 18.5 Then
result = "痩せ"
ElseIf Cells(i + 29, "F") <= 25 Then
result = "標準"
ElseIf 25.1 <= Cells(i + 29, "F") And Cells(i + 29, "F") <= 30 Then
result = "やや肥満"
ElseIf 30.1 <= Cells(i + 29, "F") And Cells(i + 29, "F") < 50 Then
result = "肥満"
End If
Next i
End Sub
![「vbaの計算 if elseと範囲につい」の質問画像](http://oshiete.xgoo.jp/_/bucket/oshietegoo/images/media/1/543188799_6380f0c06d8b9/M.jpg)
A 回答 (6件)
- 最新から表示
- 回答順に表示
No.6
- 回答日時:
連投、しつこくなり申し訳ありません
余計な事ばかり書き、ご質問にきちんと回答していませんでした
>実行しても反映されません。
セルに書き出す処理がされていません(1行足せば処理できるはず)
result代入後に出力します
End If
Cells(i + 29, "G") = result
Next i
自身の回答#4を読み返し
(A列左に列を増やす場合やA列に値がある場合など正しく取得できない)などと指摘したにもかかわらず、示した参考コードは考慮されていません
For i = iStart To iEnd や Cells(i, "E")などを使いたい為と言っても
A列(ターゲット列)左に列を追加(削除)したりしたら機能しなくなりますから、自身の回答に矛盾します
カラムを"E""C"など定数ではなく
基準カラムからOffsetで相対的なセルを指定する必要があります
部分サンプル(一例)を書き直すと
firstClm = targetCell.Column
'1つ下の行
iStart = targetCell.Offset(1).Row
・
・
For i = iStart To iEnd
With Cells(i, firstClm)
.Offset(, 3) = 22 * (.Offset(, 1) / 100) ^ 2
.Offset(, 4) = .Offset(, 2) / (.Offset(, 1) / 100) ^ 2
Select Case .Offset(, 4).Value
ご質問を反故するような回答で申し訳ありませんでした
No.5
- 回答日時:
コードを書く時に名前としてしまいました・説明と不一致訂正します
What:="名 前" ×
What:="氏 名" ○
サイトの調整で連続半角スペースが削除されるようですので
実際のセルの値をコード内にコピペをすると間違いがないと思います
No.4
- 回答日時:
こんにちは
ご質問のコード、添付図(表組)の場合
>if else
ご質問のようなケースではSelect case で分岐した方が判り易いような気がします
また、Cells(i + 29, "F")のようにコード内で繰り返し記す必要がある場合は
変数などに代入したりWithなどで括ると良いかも知れないと思います
(Select caseならまとまる)
既に指摘されている(起点を特定する部分)ですが
最初に 定数 B を、End(xlToRight).Column使用している事から
限られた条件下でのみ機能しますがロジック的には破綻しているように思います
(A列左に列を増やす場合やA列に値がある場合など正しく取得できない)
限られた条件でのみならば、そもそも定数設定をすれば良い事になります
lastRow = Cells(Rows.Count, "B").End(xlUp).Row
B列最終行(値のある最大行№)を取得
firstClm = Cells(lastRow, "A").End(xlToRight).Column
A列lastRow行 で Ctrlキー+→キーを押した時のセル列№
students = 5
定数5
' Debug.print lastRow & "/" & firstClm
'図の場合
iStart = lastRow - students + 1
iStart =30=34-5+1
iEnd = lastRow
iEnd =34=34
ですかね
と言う事は ループは For i = iStart To iEnd で良い事になります
従って Cells(i + 29, "C") / 100 ではなく
Cells(i , "C") / 100 で良いと思います。
特定セルを取得する方法(一例)
Findを使いますので少しアイデアや工夫が必要ですが図の場合、
氏名の値をシート上で一意の値に変更します
例えば 氏 名 氏 半角スペース×3 名 などして検索すれば入力されているセルを取得できます
コード例 Find Select Case
Sub test0()
Dim i As Integer, students As Integer
Dim iStart As Integer, iEnd As Integer
Dim targetCell As Range
'名 前と入力されているセルを探す
Set targetCell = ActiveSheet.UsedRange.Find(What:="名 前", LookIn:=xlValues, LookAt:=xlWhole)
If Not targetCell Is Nothing Then
'あれば 見つかったセルを基準に
'1つ下の行
iStart = targetCell.Offset(1).Row
'一番下の値のある行
iEnd = Cells(Rows.Count, targetCell.Column).End(xlUp).Row
students = iEnd - iStart + 1
Else
'無ければ
MsgBox "名 前 が見つかりません"
Exit Sub '実行を中止
End If
'データ内を繰り返し処理
For i = iStart To iEnd
'身長と体重を配列の中に保存する
'#意味わからず
'height(i) = Cells(i, "C") / 100
'weight(i) = Cells(i, "D")
'標準体重とBMIを求めて配列の中に保存する
'標準体重kg=22*(身長m)^2
Cells(i, "E") = 22 * (Cells(i, "C") / 100) ^ 2
'標準体重とBMIを該当セルに書き込む
Cells(i, "F") = Cells(i, "D") / (Cells(i, "C") / 100) ^ 2
'求められたBMIで判定をし該当セルに書き込む
Dim result As String
Select Case Cells(i, "F").Value
Case Is <= 18.5
result = "痩せ"
Case 18.6 To 25
result = "標準"
Case 25.1 To 30
result = "やや肥満"
Case Else
result = "肥満"
End Select
'判定をG列に書き込み
Cells(i, "G") = result
Next i
End Sub
studentsは不要?
ほぼコピペなので
配列や出力に関してや計算内容については考えていません
例のコードを使用する場合の必要知識 調べる事
ActiveSheet.UsedRange.Find
If Not targetCell Is Nothing Then
Select Case
自動記録などで確かめるコード、
Ctrlキー+→キーを押した時のセル
シート上の挙動 (A列に値を入れる、途中に空セルを配置するなど)
No.3
- 回答日時:
どのセルに値を出力するのか指定してないね。
”result” という共通する変数に判定結果を代入しているだけですので、判定結果が表の上に反映されることは永遠にありません。
そもそも
lastRow = Cells(Rows.Count, "B").End(xlUp).Row
firstClm = Cells(lastRow, "A").End(xlToRight).Column
students = 5
' Debug.print lastRow & "/" & firstClm
iStart = lastRow - students + 1
iEnd = lastRow
が機能していない。
あと、
>xlToRightをしているので自動的に右に進んでいくものだと思っていたのですが…。
勘違いですよ。よく確認してください。
・・・余談・・・
配列変数にする必要ないと思うんだ。
No.2
- 回答日時:
>xlToRightをしているので自動的に右に進んでいくものだと思っていたのですが…。
進みませんよ。
単に右端のセルを取得するだけです。
今回はA列が空白なので実行するとデータのあるB列を選択するでしょうね。
実際A列のセルを選択して Ctrl キーと → を同時に押せば隣のB列のセルに移動します。
本当に一番右を取得したいなら、B列から始めないとダメでしょ。
今回のコードは
lastRow = Cells(Rows.Count, "B").End(xlUp).Row
firstClm = Cells(lastRow, "A").End(xlToRight).Column
iStart = lastRow - students + 1
iEnd = lastRow
についてはコード上使われていないようですし、配列に格納と言う割には結局セルアドレスを使用してます。
即ちご質問の件もセルの列を指定して書き込むとしたら、使う意味はありません。
ちなみにgooでもですが知恵袋でもBMIの質問は毎年ありますので、過去の質問を検索すると参考になる物が見つかるかも知れません。
⇒ここ5年程は他言語に変わってきているかもですから、ExcelVBAである事を見落とさないように。
No.1
- 回答日時:
「xlToRightをしているので自動的に右に進んでいくものだと思っていたのですが…。
」の「自動的に右に進んでいく」というのは, いったい「何が」自動的に右に進んでいく, ということ?i+29 の意味もわからん. 「29」ってどこから出てきた?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 数字が「0」の列を削除するため、下記のコードを実行しましたが、コンパイルエラーSubまたはFunct 3 2022/12/04 00:00
- Visual Basic(VBA) マクロ実行時、自動で背景色を変えたい。 C列にあるチェックボックスをチェックするとB列に「TRUE」 4 2022/11/08 11:14
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Visual Basic(VBA) ワークシート内を検索 1 2022/12/19 23:46
- Visual Basic(VBA) VBA 請求書自動作成 3 2022/04/24 01:58
- Excel(エクセル) エクセルVBAでオブジェクトが必要です 2 2022/09/10 16:37
- Excel(エクセル) VBAの指示の内容 昨日こちらでご教示頂いたのですが初心者な為、一つ一つの指示が何をやっているのかわ 2 2022/10/25 18:08
- Excel(エクセル) マクロで最終行から上に検索を逆にしたい 1 2022/05/17 18:27
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Excel(エクセル) VBAで組み合わせ算出やCOUNTIFSの処理を高速化したいです。 4 2022/04/07 02:38
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・「これはヤバかったな」という遅刻エピソード
- ・初めて自分の家と他人の家が違う、と意識した時
- ・いちばん失敗した人決定戦
- ・思い出すきっかけは 音楽?におい?景色?
- ・あなたなりのストレス発散方法を教えてください!
- ・もし10億円当たったら何に使いますか?
- ・何回やってもうまくいかないことは?
- ・今年はじめたいことは?
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
朝と夜の血圧の変化について。
-
日本人が不細工、スタイル悪い...
-
教えてください!「健康診断で...
-
めっちゃ貧乏だと痩せる(・・?
-
身長191cmで体重92kgは肥満です?
-
満員電車のデブ
-
「豊満な体」ってデブって意味...
-
女子高生です。 身長 162センチ...
-
りんご型の肥満にとても困って...
-
肥満体の者です。腕立て伏せ8回...
-
女子的には男子で177cmは丁度い...
-
久しぶり抱いたけど、痩せすぎ...
-
彼女の体ってスタイル良くても...
-
体型が理由で振られました。 31...
-
駅弁セックスできる体重ってど...
-
体型を気にしている彼女への一言
-
男性ってムッチリ体型が好きと...
-
付き合う彼(夫も含む)が皆太...
-
人の体型にチクチク言ってくる...
-
ぽっちゃり・デブでも、彼女に...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「豊満な体」ってデブって意味...
-
朝と夜の血圧の変化について。
-
教えてください!「健康診断で...
-
女子的には男子で177cmは丁度い...
-
日本人が不細工、スタイル悪い...
-
60歳になると3割の人が、自分の...
-
好きな人から元気?って言われ...
-
めっちゃ貧乏だと痩せる(・・?
-
3歳の娘の肥満体系が心配です。
-
アメリカの肥満問題は暴食の罪...
-
3歳の女の子です 身長92センチ ...
-
このカブトニオイガメは肥満個...
-
急性心不全の余命について
-
148cmで36kgはデブですか? 家...
-
肥満体の者です。腕立て伏せ8回...
-
おじさんは何故自分が汚くて太...
-
■医療費控除【血圧計の購入】
-
163cmで60kg女です。 これって...
-
かっこいい感じにダサい言葉を...
-
70代80代の年配の方に太った方...
おすすめ情報