エクセル2003のマクロでセルの値を変更する方法

このQ&Aのポイント
  • エクセル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" となってしまいます。 どこに原因があるのかわかりません。 助けてください。 宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • jcctaira
  • ベストアンサー率58% (119/204)
回答No.5

テストした結果、問題はありませんよ。 多分、どこか勘違いしているような気がします。 可能性があるのは、 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 またデバッグして、途中の変数値を確認すれば問題点はすぐにわかると思います。 色々大変ですが、がんばって下さい。

sou-kana
質問者

お礼

テスト結果、正常に作動しました。 どうやら、この構文の前後が影響しているようです。 この部分は問題ないことがわかりました。 ありがとうございました。

その他の回答 (5)

  • layy
  • ベストアンサー率23% (292/1222)
回答No.6

書式はありますか。目に見える値と比較している値が違うこともなくはない。 原因追求のため、 jをi+1に変えることにより、iを基準にした動きだけ見たらよくなる。 ループ判定にValueつけているのに他はつけていないのも直す。 セル値をCELLSで判定するのでなく一旦変数にしてみる。

sou-kana
質問者

お礼

iを基準にした動きだけにしたほうが、確かにわかりやすいですね。 ありがとうございました。

  • layy
  • ベストアンサー率23% (292/1222)
回答No.4

見る限り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 がホントに一致する状態の値になっているか見直し。

sou-kana
質問者

お礼

そうなんですよ。おっしゃる通り、やりたいことと条件が逆になってるような感じです。 他の方からも頂いてるように、最初の条件が本当に一致する状態か確認したいと思います。 ありがとうございました。

  • noyuo
  • ベストアンサー率39% (33/84)
回答No.3

私もマクロを勉強したいので、話に入れてもらいます。 値を代入するので、 cells(x,y).value としてはどうですか? また、直前の行を参照するなら、jを(i+1)としては?(特に i と j は区別しにくいので、jを混在させない方が見やすくないですか? いかがでしょうか? 結果を教えてくださいね。

sou-kana
質問者

お礼

なるほど。試してみます。結果はまた、お伝えします。

sou-kana
質問者

補足

構文自体は最初のままのものと変わりない結果でした。どうやら前後のマクロが影響しているようです。

  • Dahak
  • ベストアンサー率50% (3/6)
回答No.2

マクロには問題がないようなので、シートのデータを確認してください。 また、Do While行とIf行の間に以下のデバッグ文を追加してイミディエイトウィンドウでセル値を確認してください。 Debug.Print Cells(i, 13) & "⇔" & Cells(j, 13)

sou-kana
質問者

お礼

試してみます。ありがとうございます。

sou-kana
質問者

補足

イミティエイトウィンドウには以下のように表示されました。 2010531⇔ これってどういう意味でしょうか?

  • NNori
  • ベストアンサー率22% (377/1669)
回答No.1

うーん、そうなってるならそうでしょうねぇ。 なにを数えて以下のようにしたいのかを書かないとさっぱり分かりません。 セル(3,22)の値は"1" セル(4,22)の値は"2" セル(5,22)の値は"2"

sou-kana
質問者

補足

同じ日付をひとつのグループとして捉え、日付の早いものから,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 ===================================

  • エクセル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 わかる方がいらっしゃいましたら、お願いします。

  • 判定してセルを塗りつぶすマクロについて

    判定してセルを塗りつぶすマクロについて教えて下さい。 現在下記のようなマクロがあります。 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以上の場合は赤 です。 宜しくお願いします。

  • エクセルマクロに関する質問

    最近、エクセルマクロを始めてたのですが、下記のような状態で困っています。 プログラムを実行した際に、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

  • 行ごとに判定するマクロについて教えて下さい

    行ごとに判定するマクロについて教えて下さい。 下記のようなマクロで、添付ファイルのように、行ごとで 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

専門家に質問してみよう