エクセル2003のマクロでセルの値を変更する方法
- エクセル2003のマクロを使用して、セルの値を変更する方法について質問です。
- 質問者は、特定の条件に基づいてセルの値を変更するマクロを作成しましたが、予期しない結果が得られています。
- 質問者は、マクロのどこに問題があるのかわからないため、助けを求めています。
- ベストアンサー
エクセル2003でのマクロで質問です。
エクセル2003でのマクロで質問です。 セル(2,22)には"1"という値が入っています。 セル(2,13)には"20100521"という値が入っています。 セル(3,13)には"20100521"という値が入っています。 セル(4.13)には"20100525"という値が入っています。 セル(5,13)には"20100525"という値が入っています。 このようなときに セル(3,22)の値は"1" セル(4,22)の値は"2" セル(5,22)の値は"2" となるように以下のようなマクロを作成しました。 Dim i As Integer, j As Integer, date1 As String i = 2 j = 3 Do While Cells(i, 1).Value <> "" If Cells(i, 13) = Cells(j, 13) Then Cells(j, 22) = Cells(i, 22) Else Cells(j, 22) = Cells(i, 22) + 1 End If i = i + 1 j = j + 1 Loop しかし、結果は セル(3,22)の値は"2" セル(4,22)の値は"3" セル(5,22)の値は"4" となってしまいます。 どこに原因があるのかわかりません。 助けてください。 宜しくお願いします。
- sou-kana
- お礼率83% (10/12)
- その他MS Office製品
- 回答数6
- ありがとう数12
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
テストした結果、問題はありませんよ。 多分、どこか勘違いしているような気がします。 可能性があるのは、 1.日付の値が違う もし文字ならスペースがどこかに入っていて、等しくならない。 2.日付は M列 なのに 実際はL列やN列になっている。 この可能性が一番高いと思われます。 プログラムはもうちょっとシンプルで、また列名をわかりやすくした方が良いと思います。 例えば Sub TEST() Dim I As Integer I = 2 Do While Cells(I, "A").Value <> "" If Cells(I, "M") = Cells(I + 1, "M") Then Cells(I + 1, "V") = Cells(I, "V") Else Cells(I + 1, "V") = Cells(I, "V") + 1 End If I = I + 1 Loop End Sub またデバッグして、途中の変数値を確認すれば問題点はすぐにわかると思います。 色々大変ですが、がんばって下さい。
その他の回答 (5)
- layy
- ベストアンサー率23% (292/1222)
書式はありますか。目に見える値と比較している値が違うこともなくはない。 原因追求のため、 jをi+1に変えることにより、iを基準にした動きだけ見たらよくなる。 ループ判定にValueつけているのに他はつけていないのも直す。 セル値をCELLSで判定するのでなく一旦変数にしてみる。
お礼
iを基準にした動きだけにしたほうが、確かにわかりやすいですね。 ありがとうございました。
- layy
- ベストアンサー率23% (292/1222)
見る限りA列に値があればM列に日付があり、 この日付ごとのカウントをV列へ求める、と見受けられます。 結果からすると If Cells(i, 13) = Cells(j, 13) Then Cells(j, 22) = Cells(i, 22) + 1 Else Cells(j, 22) = Cells(i, 22) End If 条件式が=になっていれば、カウンタ+1を1つ下のセルへ 条件式が=になっていないならば、カウンタ(そのまま)を1つ下のセルへ の動きになっていませんか?。 やりたいことと+1する条件が逆になっている???。 If Cells(i, 13) = Cells(j, 13) Then がホントに一致する状態の値になっているか見直し。
お礼
そうなんですよ。おっしゃる通り、やりたいことと条件が逆になってるような感じです。 他の方からも頂いてるように、最初の条件が本当に一致する状態か確認したいと思います。 ありがとうございました。
- noyuo
- ベストアンサー率39% (33/84)
私もマクロを勉強したいので、話に入れてもらいます。 値を代入するので、 cells(x,y).value としてはどうですか? また、直前の行を参照するなら、jを(i+1)としては?(特に i と j は区別しにくいので、jを混在させない方が見やすくないですか? いかがでしょうか? 結果を教えてくださいね。
お礼
なるほど。試してみます。結果はまた、お伝えします。
補足
構文自体は最初のままのものと変わりない結果でした。どうやら前後のマクロが影響しているようです。
- Dahak
- ベストアンサー率50% (3/6)
マクロには問題がないようなので、シートのデータを確認してください。 また、Do While行とIf行の間に以下のデバッグ文を追加してイミディエイトウィンドウでセル値を確認してください。 Debug.Print Cells(i, 13) & "⇔" & Cells(j, 13)
お礼
試してみます。ありがとうございます。
補足
イミティエイトウィンドウには以下のように表示されました。 2010531⇔ これってどういう意味でしょうか?
- NNori
- ベストアンサー率22% (377/1669)
うーん、そうなってるならそうでしょうねぇ。 なにを数えて以下のようにしたいのかを書かないとさっぱり分かりません。 セル(3,22)の値は"1" セル(4,22)の値は"2" セル(5,22)の値は"2"
補足
同じ日付をひとつのグループとして捉え、日付の早いものから,1,2,3・・・となるようにしたいのですが。
関連するQ&A
- エクセルマクロを教えてください
下記のマクロを動かすことはできるのですが、 処理が実行されると、コマンドプロンプト画面が表示されてしまいます。 自分でも色々調べたのですが、どうしてもわからないです。 どこを修正したらコマンドプロンプトが表示されずに、 処理が実行されるのか教えてください。 動作環境 OS:Windows7 アプリ:Excel2003、2010 =================================== Sub ping送信 Dim objWSH As Object, oEx As Object Dim i As Integer Dim sCmd As String Dim sResult As String Set objWSH = CreateObject("WScript.Shell") For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row sCmd = "%ComSpec% /c ping -n 1 " & Cells(i, 1) Set oEx = objWSH.Exec(sCmd) Do While oEx.Status = 0 DoEvents Loop sResult = oEx.StdOut.ReadAll If InStr(sResult, "ラウンド トリップの概算時間") = 0 Then Cells(i, 1).Interior.ColorIndex = 3 Else Cells(i, 1).Interior.ColorIndex = 4 End If Next ===================================
- ベストアンサー
- Excel(エクセル)
- エクセルVBAの繰り返し処理の質問
C列にある項目とG列にある項目を比較して、 一致し、H列にある数字が10以上ならば、B列にフラグ1を立てる という処理を行いたいんですが、 下記ぐらいまでしか作れず、うまくいきません・・・ Sub フラグを立てる処理() Dim i As Integer Dim j As Integer Dim k As Integer i = 1 j = 1 Do j = j + 1 Do i = i + 1 If Cells(j, 8) > 9 Then Cells(i - 1, 4) = 1 End If Loop Until Cells(i, 3) <> Cells(j, 7) Or Cells(i, 3) = "" Loop Until Cells(j, 7) = "" End Sub わかる方がいらっしゃいましたら、お願いします。
- 締切済み
- Visual Basic
- 判定してセルを塗りつぶすマクロについて
判定してセルを塗りつぶすマクロについて教えて下さい。 現在下記のようなマクロがあります。 Sub オニオン判定() Dim i As Integer, j As Integer, r As Integer Dim k As Double Range(Cells(17, 9), Cells(26, 14)).Interior.ColorIndex = 0 Range(Cells(30, 9), Cells(39, 14)).Interior.ColorIndex = 0 k = Cells(5, 2) 'B5セルの値 For j = 9 To 14 For i = 17 To 26 For r = 30 To 39 If Abs(Cells(i, j).Value - Cells(r, j).Value) <= 0.05 Then Cells(r, j).Interior.Color = vbYellow Cells(i, j).Interior.Color = vbYellow End If Next Next Next End Sub 対象のIf Abs(Cells(i, j).Value - Cells(r, j).Value) <= 0.05 Then で、それぞれ見比べて、0.05以上のずれがあるとセルが塗りつぶされないというマクロなのですが これを、If Abs(Cells(i, j).Value - Cells(r, j).Value) = 0 Thenという条件も追加して その時はセルを青に塗りつぶし、逆に0.05以上のずれがあるセルは赤に塗りつぶす。 みたいなマクロを書きたいです。 If Abs(Cells(i, j).Value - Cells(r, j).Value) = 0 Thenは一度追加してみましたが 上手く機能しませんでした。 やりたい事 ・数値が動いているけど、0.05以内の時は黄色 ・数値変動が0の場合は青 ・数値変動が0.05以上の場合は赤 です。 宜しくお願いします。
- ベストアンサー
- Excel(エクセル)
- エクセルマクロに関する質問
最近、エクセルマクロを始めてたのですが、下記のような状態で困っています。 プログラムを実行した際に、Cells((I1 + I5), I6)のセルに計算式がはいって欲しいのですが、 現状では計算結果が入るだけになってしまっています。 また、単純に文字列に変換してしまうだけだと、変数が邪魔になって式になってくれません。 誰かお分かりになる方がいましたら、教えてください。 Dim I1 As Integer Dim I2 As Integer Dim I3 As Integer Dim I4 As Integer Dim I5 As Integer Dim I6 As Integer Dim I7 As Integer Dim I8 As Integer Cells((I1 + I5), I6) = Cells((I1 + I5) - 2, I6) + Cells((I1 + I5), I6 - 2) - Cells(I1 + I5, I6 - 1)
- ベストアンサー
- その他(プログラミング・開発)
- エクセルVBA初心者です。
エクセルVBA初心者です。 a1 3 5 a2 2 7 a3 1 7 a4 3 1 上で例えると、求めたい値は3*5+2*7+1*7+3*1=39です。 a1という文字を検索し、そして(a1の隣のセル)*(a1の隣の隣のセル) 次に (a2の隣のセル)*(a2の隣の隣のセル) と言う風にくりかえし、 最後に今まで乗算してでた値を合計してセルに結果を入力させるマクロなのですが、 エラーが何度も出て修正してはいるのですが、もうお手上げ状態です。 #以下がそのマクロです。 Sub マクロ() Dim fCell As Range, fAdr As String Dim a() As Double Dim i As Integer, j As Integer i = 0 j = 0 Set fCel = Cells.Find(What:="a1", LookAt:=xlWhole) If Not fCell Is Nothing Then Do While fCell.Offset(j, 0).Address <> fCell.End(Direction:=Down).Address j = j + 1 Loop ReDim a(j) As Double fAdr = fCell.Address For i = 0 To (j - 1) a(i) = fCell.Offset(0, 2).Value = fCell.Offset(0, 1).Value * fCell.Offset(0, 2).Value a(5) = a(5) + a(i) Next i fCell.Offset(j + 1, 1).Value = a(5) Else End If End Sub 本当に初心的なことだと思いますが、どうかよろしくお願いします。
- ベストアンサー
- 会計ソフト
- エクセルのマクロで複数セル指定は?
以前(7月22日 質問No.936181)の質問でご回答を頂いたマクロなんですが、 Private Sub Worksheet_Change(ByVal Target As Range) Dim MyData As String Dim i As Integer Dim ImaNanji As String Dim SakkiNanji As String Dim ImaNanpun As String Dim SakkiNanpun As String SakkiNanpun = Cells(2, 3).Value ImaNanji = Cells(1, 3).Value ImaNanpun = Mid(ImaNanji, Len(ImaNanji) - 4, 2) If ImaNanpun <> SakkiNanpun Then Application.EnableEvents = False For i = 10 To 2 Step -1 MyData = Cells(i - 1, 2).Value Cells(i, 2).Value = MyData Next i MyData = Cells(1, 1).Value Cells(1, 2).Value = MyData Cells(2, 3).Value = ImaNanpun Application.EnableEvents = True End If End Sub A1のデータをB1からB10に一分おきにつぎつぎに書き込むというものなんですが、ひとつのセルではなく複数のセル(例えばA1からA30の30個のセル)をいっぺんに書き込むようにしたいのですが可能でしょうか? よろしくお願いします。
- ベストアンサー
- オフィス系ソフト
- マクロで色が同じになるように設定したい
こんにちは。 現在マクロに挑戦中なのですが、一点分からず戸惑っています。 お分かりになる方教えてください。 下記のマクロを書きました。 Sheet2のセルに数字を入れることによってSheet1のセルの色が変わるようにしています。 25以上の数字は全て青(カラー番号5)表示にしたいのですが、どのように記したら良のか教えてください。 --------------------------------------------------------------- Private Sub Worksheet_Change(ByVal Target As Range) Dim iColors As Variant Dim i As Integer Dim j As Integer iColors = Array(36, 20, 24, 37, 40, 39, 17, 22, 45, 43, 28, 6, 4, 41, 18, 47, 50, 46, 10, 7, 3, 21, 9, 5) For Each c In Target If c.Value <> "" Then If IsNumeric(c.Value) Then i = c.Value If i > 0 And i < 25 Then j = iColors(i - 1) Else j = 2 End If End If End If i = c.Row If i > 2 And j > 0 Then Worksheets("Sheet1").Range("B3:K6").Cells(i - 3).Interior.ColorIndex = j End If Next c End Sub --------------------------------------------------------------- お分かりになる方、宜しくお願い致します。
- ベストアンサー
- オフィス系ソフト
- エクセルマクロで教えてください
マクロ初心者です。アドバイスをお願いします。以下のマクロですとB列の100行目までの塗りつぶしのセルのカウントは出来るのですが、シート上の全てをカウントしたいのです。1TO 100の100の部分をどう変更したら良いのか教えてください。 Sub セルの色数1() Dim I As Integer Dim Count As Integer Count = 0 For I = 1 To 100 If Cells(I, 2).Interior.ColorIndex <> xlNone Then Count = Count + 1 Next I Range("C1").Value = Count End Sub
- 締切済み
- その他(業務ソフトウェア)
- VBAでの質問
お世話になります。 下記の記述で、「←」の矢印の記述で、 Cells.(5,2)がブランクでなければ、 「→」から進めたいのですが、 どの様に記述すれば宜しいでしょうか ご教示お願いします。 Sub 表記入() Dim Data As Range Dim i As Integer Dim j As Integer Dim k As Integer Set Data = Sheets("集計").Range("A2").CurrentRegion j = 16 k = 0 With Sheets("表") For i = 3 To Data.Rows.Count If Data.Cells(i, 51) <> "" Then .Cells(5, 2) = Data.Cells(i, 3) ← .Cells(5, 7) = Data.Cells(i, 4) → .Cells(j, 2) = Data.Cells(i, 10) .Cells(j, 6) = Data.Cells(i, 11) & Data.Cells(i, 12) .Cells(j, 14) = Data.Cells(i, 51) Else End If k = k + 1 If k = 10 Then j = j + 18 k = 0 Else j = j + 1 End If End If Next i End With End Sub
- ベストアンサー
- Visual Basic
- 行ごとに判定するマクロについて教えて下さい
行ごとに判定するマクロについて教えて下さい。 下記のようなマクロで、添付ファイルのように、行ごとで E列からN列で違った数値がないか、入力されていないセルがないかを調べ 4つすべてのセルが同じ数値でない場合は塗りつぶしはされず O列にOKを表示しないようなマクロを組みたいのですが 現在のマクロだと、行ごとではなく、E3~N102セルまでの中で 同じ数値がないかを判断してしまっているため K11セルやK15セルのように数値が入力されていないにも関わらずO列の部分にOKが出てしまいます。 他の行に同じ数値が入っているのは関係なしにして 11行目なら11行目だけで 15行目なら15行目だけで、というように行ごに判定していくには どのようにすればいいでしょうか? Sub 判定マクロ回転() Dim i As Integer, j As Integer Range(Cells(3, 15), Cells(102, 15)).ClearContents For i = 3 To 102 For j = 5 To 14 Cells(i, j).Interior.ColorIndex = 0 If WorksheetFunction.CountIf(Range("E3:N102"), Cells(i, j)) > 3 Then If Cells(i, j).Row Mod 2 = 1 Then Cells(i, j).Interior.ColorIndex = 6 Cells(i, 15) = "OK" Else If Cells(i, j).Row Mod 2 = 0 Then Cells(i, j).Interior.ColorIndex = 40 Cells(i, 15) = "OK" End If End If End If Next j Next i If WorksheetFunction.CountIf(Range("O3:O102"), "OK") > 99 Then MsgBox "データチェックOK(^O^)b" End If End Sub
- ベストアンサー
- Excel(エクセル)
お礼
テスト結果、正常に作動しました。 どうやら、この構文の前後が影響しているようです。 この部分は問題ないことがわかりました。 ありがとうございました。