マクロを簡潔にしたいので教えてください

このQ&Aのポイント
  • Excelマクロを短くする方法について教えてください。
  • 指定のセルに記入された値を基に、他のシートからデータを取得する方法を教えてください。
  • 指定のセルに入力された値を元に計算を行い、結果を表示する方法を教えてください。
回答を見る
  • ベストアンサー

マクロを簡潔にしたいので教えてください。

Sub 記入() Dim testno As String Dim testrow As Long Dim basedata(1 To 10) As String Dim weight(1 To 16) As Double Sheets("sh3").Select '(1) testno = Range("B23").Value 'No. Sheets("sh1").Select For i = 65535 To 6 Step -1 If CStr(Cells(i, 1)) = Trim(testno) Then testrow = i Exit For End If Next i If i = 5 Then MsgBox ("?") End End If For i = 1 To 10 basedata(i) = Cells(testrow, i + 1) Next i '(2) Sheets("sh2").Select For i = 65535 To 6 Step -1 If CStr(Cells(i, 1)) = Trim(testno) Then testrow = i Exit For End If Next i If i = 5 Then MsgBox ("?") End End If For i = 1 To 6 weight(i) = Cells(testrow, i + 1) Next i For i = 7 To 12 weight(i) = Cells(testrow, i + 2) Next i weight(13) = Application.WorksheetFunction.Max(weight(1), weight(2), weight(3), weight(4), weight(5), weight(6)) weight(14) = Application.WorksheetFunction.Min(weight(1), weight(2), weight(3), weight(4), weight(5), weight(6)) weight(15) = Application.WorksheetFunction.Max(weight(7), weight(8), weight(9), weight(10), weight(11), weight(12)) weight(16) = Application.WorksheetFunction.Min(weight(7), weight(8), weight(9), weight(10), weight(11), weight(12)) Sheets("sheet3").Select Cells(3, 1) = testno For i = 1 To 10 Cells(3, i + 1) = basedata(i) Next i For i = 1 To 16 Cells(3, i + 11) = weight(i) Next i Sheets("sh3").Select Erase basedata Erase weight '(1) testno = Range("B24").Value 'No. Sheets("sh1").Select For i = 65535 To 6 Step -1 If CStr(Cells(i, 1)) = Trim(testno) Then testrow = i Exit For End If Next i If i = 5 Then MsgBox ("?") End End If For i = 1 To 10 basedata(i) = Cells(testrow, i + 1) Next i '(2) Sheets("sh2").Select For i = 65535 To 6 Step -1 If CStr(Cells(i, 1)) = Trim(testno) Then testrow = i Exit For End If Next i If i = 5 Then MsgBox ("?") End End If For i = 1 To 6 weight(i) = Cells(testrow, i + 1) Next i For i = 7 To 12 weight(i) = Cells(testrow, i + 2) Next i weight(13) = Application.WorksheetFunction.Max(weight(1), weight(2), weight(3), weight(4), weight(5), weight(6)) weight(14) = Application.WorksheetFunction.Min(weight(1), weight(2), weight(3), weight(4), weight(5), weight(6)) weight(15) = Application.WorksheetFunction.Max(weight(7), weight(8), weight(9), weight(10), weight(11), weight(12)) weight(16) = Application.WorksheetFunction.Min(weight(7), weight(8), weight(9), weight(10), weight(11), weight(12)) Sheets("sh3").Select Cells(4, 1) = testno For i = 1 To 10 Cells(4, i + 1) = basedata(i) Next i For i = 1 To 16 Cells(4, i + 11) = weight(i) Next i Sheets("sh3").Select Erase basedata Erase weight この間同様文12個あり '(1) testno = Range("B37").Value If testno = "" Then End End If Sheets("sh1").Select For i = 65535 To 6 Step -1 If CStr(Cells(i, 1)) = Trim(testno) Then testrow = i Exit For End If Next i If i = 5 Then MsgBox ("?") End End If For i = 1 To 10 basedata(i) = Cells(testrow, i + 1) Next i '(2) Sheets("sh2").Select For i = 65535 To 6 Step -1 If CStr(Cells(i, 1)) = Trim(testno) Then testrow = i Exit For End If Next i If i = 5 Then MsgBox ("?") End End If For i = 1 To 6 weight(i) = Cells(testrow, i + 1) Next i For i = 7 To 12 weight(i) = Cells(testrow, i + 2) Next i weight(13) = Application.WorksheetFunction.Max(weight(1), weight(2), weight(3), weight(4), weight(5), weight(6)) weight(14) = Application.WorksheetFunction.Min(weight(1), weight(2), weight(3), weight(4), weight(5), weight(6)) weight(15) = Application.WorksheetFunction.Max(weight(7), weight(8), weight(9), weight(10), weight(11), weight(12)) weight(16) = Application.WorksheetFunction.Min(weight(7), weight(8), weight(9), weight(10), weight(11), weight(12)) Sheets("sh3").Select Cells(17, 1) = testno For i = 1 To 10 Cells(17, i + 1) = basedata(i) Next i For i = 1 To 16 Cells(17, i + 11) = weight(i) Next i End Sub

noname#178407
noname#178407

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

  • ベストアンサー
  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.5

こんにちは。お邪魔します。 やり過ぎない程度に簡潔な形で全体を書いてみました。 一応、ダミーサンプルブックを作成して簡単に動作確認しています。 ご提示のコードが期待通りの結果を返す前提で、なるべく原形を残して 翻訳(ほぼ直訳)に徹しているつもりですが、期待通りでなかったら、 コードでなく言葉で、こちらが解る様に説明してください。 書く人の数だけ多様に書ける処理ですが、 私のは、最適化というほどのことはしていません。 ただ、投稿されたカテゴリが- MS Office -ですので、 VBAらしい書き方を意識しています。 Visual Basic for Applications 的であって、Visual Basic 的ではない書き方です。 なるべく、ご提示のコードを書いた人なら理解できるであろう書き方で、 簡潔になるよう心がけて書いています。 せっかく配列を使っているのに、、、と思える部分が 2カ所ありましたので、配列変数を使うメリットを強調する意味で 配列のまま関数の引数にしたり、配列のままセル範囲に出力したり、 という点を重点に書き換えています。 sh1、sh2、にてtestNoがヒットしない場合は、すべての処理を終了する という動作仕様で書かれているようなので、サブルーチンをFunctionにして 不正の場合にTrueを返して判別後 Exit Sub するように書きました。 メインプロシージャの記述から   For i = 3 To 17     If 記入sub(i) Then MsgBox ("?"): Exit Sub   Next i の部分の カウンタ i についてだけ説明を。   testNo = Trim(Cells(printRow + 20, "B")) これで Sheets("sh3") の Range("B23") から Range("B37") までを 順に、testNo として、 Sheets("sh3") の 3行めから17行めに結果を出力するように ループしていることになります。 VBAに詳しくなるまでは、End ステートメントの使用は避けた方が無難です。 正しく理解した上で使わないと何かとトラブルの元になりますし、 End ステートメントを使う必要は、かなり特殊で、普通は(VBAでは)使いません。 Exit Sub を使うようにしましょう。 必ず疑問が残るでしょから、初歩的なことはご自分で調べて確かめるなり、 応用的なことはこちらに質問するなりして、自分のものにするように努めてください。 シート名は"sh1"..? "Sheet1"..?◆シート名◆3カ所、必要なら修正してください。 実行するのは、Sub 記入main() です。 Sub 記入main() ' Re8072449   Dim i As Long   Sheets("sh3").Select ' ◆シート名◆   Range("A3:AA17").ClearContents ' 前回作成したデータを消去する?   Application.ScreenUpdating = True ' ←少しでも速く処理したい場合。お好みで   For i = 3 To 17     If 記入sub(i) Then MsgBox "?": Exit Sub   Next i End Sub Private Function 記入sub(ByVal printRow As Long) As Boolean   Dim baseData(0 To 10) As String ' baseData(0) は testNo 用に予め確保   Dim testNo As String   Dim weightA(1 To 6) As Double ' 配列変数 weight を3つに分ける   Dim weightB(7 To 12) As Double   Dim weightC(13 To 16) As Double   Dim testRow As Long   Dim i As Long   testNo = Trim(Cells(printRow + 20, "B"))   With Sheets("sh1") ' ◆シート名◆     For testRow = .Cells(65536, 1).End(xlUp).Row To 6 Step -1       If CStr(.Cells(testRow, 1)) = testNo Then Exit For     Next testRow     If testRow < 6 Then 記入sub = True: Exit Function     For i = 1 To 10       baseData(i) = .Cells(testRow, i + 1)     Next i   End With   With Sheets("sh2") ' ◆シート名◆     For testRow = .Cells(65536, 1).End(xlUp).Row To 6 Step -1       If CStr(.Cells(testRow, 1)) = testNo Then Exit For     Next testRow     If testRow < 6 Then 記入sub = True: Exit Function     For i = 1 To 6       weightA(i) = .Cells(testRow, i + 1)     Next i     For i = 7 To 12       weightB(i) = .Cells(testRow, i + 2)     Next i   End With   baseData(0) = testNo   weightC(13) = Application.Max(weightA)   weightC(14) = Application.Min(weightA)   weightC(15) = Application.Max(weightB)   weightC(16) = Application.Min(weightB)   Cells(printRow, 1).Resize(, 11).Value = baseData ' Sheets("sh3") Select済   Cells(printRow, 12).Resize(, 6).Value = weightA   Cells(printRow, 18).Resize(, 6).Value = weightB   Cells(printRow, 24).Resize(, 4).Value = weightC   Erase baseData, weightA, weightB, weightC ' ←プロシージャの最終行なら省略可 End Function

noname#178407
質問者

お礼

今起動させてもらいました。四苦八苦しながらテキストやネットを参考にしながら作成したもので、意味もわからず記入していたところがありました。本当に有難うございました。言葉で表せなかったことで皆様にご迷惑をお掛けしました。 こんなに遅い時間にもかかわらず回答いただき有難うございました。

その他の回答 (5)

  • hallo-2007
  • ベストアンサー率41% (888/2115)
回答No.6

さて、次はサブルーチンについて調べてみてください VBA Call とかで検索してみてください。 新しいモジュールで、以下をコピーしてみてください。 Dim testrow As Long Sub ボタン1_Click() testno = Range("B23").Value 'No. Sheets("sh1").Select Call 検索(testno) MsgBox Testrow End Sub Sub 検索(testno) Set res =Column("A:A").Find(What:=testno, After:=Range("A1"), LookAt:=xlWhole, SearchDirection:=xlPrevious) testrow = res.Row End Sub これを理解したら、だいぶ短いコードになるでしょう。 後は、先に紹介した最大値などの取得の仕方を見直してください。

noname#178407
質問者

お礼

何度も回答いただき有難うございました。無事解決いたしました。言葉での説明が足らないにもかかわらずご指導いただき感謝いたします。

  • hallo-2007
  • ベストアンサー率41% (888/2115)
回答No.4

NO2です。 Find関数の使い方が http://excelvba.pc-users.net/fol7/7_1.html にありますので、参考にしてください。 Sub 検索() testno = Range("B23").Value 'No. Sheets("sh1").Select Columns("A:A").Find(What:=testno, After:=Range("A1"), LookAt:=xlWhole, SearchDirection:=xlPrevious).Activate End Sub をコピーして実行してみてください。 ご希望のセルがアクティブになっていませんか?

noname#178407
質問者

お礼

こんばんは、すごくコンパクトに纏めて頂き驚いております。コピーして使わせていただきます。ありがとうございました。

  • Nouble
  • ベストアンサー率18% (330/1783)
回答No.3

取りあえず今から検討に入りますが 先に1つ 取りあえずは、まあ、要点としては 「整理整頓すれば見えるものが見えてくる」ですね。 1、 プライベートサブや、ファンクションや、クラスなどで 似たようなことは、引数を渡すだけのサブルーティン化を試みましょう。 どんなに簡単なものについても、これを行えるか検討しましょう。 2、 メモ書きのできるデバイス(紙など)に表して、 計算結果の因果関係など、依存関係を整理しましょう。 3、 サブルーティン呼び出しの羅列、依存関係の整理、を 終えられていれば、 引数のレパートリーや出現パターンが見えてきますから、 出現順など、 調整できるものは調整して、 できるだけ平滑なものにしましょう。 (平滑:適切な言葉が浮かばない 汗) また、この時 依存関係次第ですが、 同値、同意の引数出現回数が 出来るだけ変化しないようにも 検討してみましょう 4、 引数を分類し、各々をセットに纏め、 構造体変数、クラス、配列変数などで パックすることを目指しましょう。 5、 引数の出現順パターンが押さえられ、収納できたなら 順に読み出す事を前提とした、ループに纏め 処理を行えるようにしましょう。 ここまで出来たらかなり短くなる可能性があります。 なお、 データセットの収納、引き渡しは ものによっては array構文、 dictionary構文、 などを使うと、かなり明示的になりそうですよ? また、 クラスを使って実行中の外部ファイル組込み(インクルード)を 行う手もあるでしょうね。 (できる… よね? 確か 確証無い… けど) 因みに、 私のプライベート ルールでは、賛否も分かれるでしょうが 「複数行IF構文のThenは、折り返して前に持ってくる」 「登校時は半角スペース2つを全角1つに変えておく」 「程良きところで折り返す」 「const等で意味に対する数値の紐付け、グループ付け、を行って  可読性、区別性を 担保する」 「日本語で可読性(見える化)を高める」 などをすれば、もっと良い と、感じました。 まあ、要点としては 「整理整頓すれば見えるものが見えてくる」ですね。 取りあえず見てみますので、当てにせずお待ちを P・s・ 何だか上から目線口調になってしまいましたが、ご容赦下さい。 本意ではありません。

noname#178407
質問者

お礼

VBAマクロをやり始めたばかりなので、できる所の継ぎ接ぎしかできませんでした。教えていただけることがうれしいです。

  • hallo-2007
  • ベストアンサー率41% (888/2115)
回答No.2

とりあえず気が付いたところです。 '(1) testno = Range("B23").Value 'No. Sheets("sh1").Select For i = 65535 To 6 Step -1 If CStr(Cells(i, 1)) = Trim(testno) Then testrow = i Exit For End If Next i If i = 5 Then MsgBox ("?") End End If これは、Range("B23")の値が シート sh1のA列ある。 その行が5行目以上の場合の行番号が知りたいということですよね。 Set res = Worksheets("Sh1").Columns("A:A").Find(what:=testno, LookIn:=xlValues, lookat:=xlPart) if res Is Nothing Then msgbox "ありませんでした" if res.Row<5 Then msgbox "ありましたが5行目より上" といった具合に、検索の機能を使って組みなおしてください。 とりあえず、これでだいぶ短くなると思いますし、動作も早くなるはず。 出来たら、そのコードをアップしてください。 たぶん、 For i = 1 To 6 weight(i) = Cells(testrow, i + 1) Next i weight(13) = Application.WorksheetFunction.Max(weight(1), weight(2), weight(3), weight(4), weight(5), weight(6)) も weight(13) = Application.WorksheetFunction.Max(Range("B" & i & ":G" & i) とかで済みそうですね。

noname#178407
質問者

お礼

VBAマクロをやり始めたばかりなので、できる所の継ぎ接ぎしかできませんでした。教えていただけることがうれしいです。

noname#178407
質問者

補足

説明不足でした、sheet1の5行目以下から検索するのIf i = 5 Then です。sheet1とsheet2から同一番号のデータを読込み、sheet2からは数値のmax,minを抜き出す処理をしています。sheet3に合算するマクロを組んだのですが、loop処理などの方法を知らずcopyで羅列してしまいました。

回答No.1

'Option Explicit Sub 記入() End Sub アトはEXCELを手に入れてからよ~くッ、考え直す、、、

noname#178407
質問者

お礼

ありがとうございます。excel VBAに慣れていませんので、改めて勉強してみます。

関連するQ&A

  • エクセル重複行統合マクロの意味

    Tom04さんの回答で 以下のとても素晴らしいマクロがあり、 使用させていただきたいのですが、 詳細がわかりません。 少々編集して自分の書類に反映させていただきたく、 マクロの内容を教えていただけませんか? Sub test() 'この行から Dim i, j, k, L As Long Application.ScreenUpdating = False For i = Cells(Rows.Count, 1).End(xlUp).Row To 2 Step -1 For j = 2 To Cells(1, Columns.Count).End(xlToLeft).Column + 1 For k = Cells(Rows.Count, j).End(xlUp).Row To 2 Step -1 If Cells(k, j) <> "" And WorksheetFunction.CountIf _ (Range(Cells(2, 1), Cells(k, 1)), Cells(k, 1)) > 1 Then L = WorksheetFunction.Match(Cells(k, 1), Columns(1), False) Cells(k, j).Cut Destination:=Cells(L, j) End If Next k Next j Next i For i = Cells(Rows.Count, 1).End(xlUp).Row To 2 Step -1 If WorksheetFunction.CountA(Rows(i)) = 1 Then Rows(i).ClearContents End If Next i Application.ScreenUpdating = True End Sub 'この行まで

  • VBAtest

    VBAおn以下の Sheets("OP").Select Dim atai As String atai = Cells(2, 2).Value Dim datedata(40) As String For j = 0 To 40 If Cells(j + 3, 2).Value = "" Then Else datedata(j) = Cells(j + 3, 2).Value End If Next Dim shihyou As String For i = 1 To 2 shihyou = Cells(2, i + 2).Cells.Value Sheets(shihyou).Select Dim tmp_c As Integer For r = 1 To 10 tmp_c = 0 For c = 1 To 10 If tmp_c = 0 Then If Sheets(shihyou).Cells(r, c).Value = atai Then tmp_c = c End If Else Dim vals(40) As String For k = 0 To 40 For l = 1 To r + 41 For m = 1 To tmp_c - 1 If Sheets(shihyou).Cells(l, m).Value = datedata(k) Then vals(k) = Sheets(shihyou).Cells(l, tmp_c).Value End If Next Next Next End If Next Next Sheets("OP").Select For k = 3 To 43 Cells(k, i + 2).Value = vals(k - 3) Next Next End Sub

  • 【Excelマクロ】もっと頭の良い書き方って無いかな?

    5行空白列があったらそこで処理を終わりたいんですが、もっといい書き方はないでしょうか? 下記が私の考えた頭の悪いやり方です。 Sub macro() Dim i As Integer For i = 1 To 1000 If Cells(i, 1) = "" Then  If Cells(i + 1, 1) = "" Then   If Cells(i + 2, 1) = "" Then    If Cells(i + 3, 1) = "" Then     If Cells(i + 4, 1) = "" Then      If Cells(i + 5, 1) = "" Then       MsgBox (i - 1 & "行目で終わりです")       Exit For      End If     End If    End If   End If  End If End If Next End Sub

  • マクロを有効にしないと表示されないようにする方法(続き)

    エクセルのマクロを有効にしないと表示しないようにする方法(続き) Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim i As Integer For i = 1 To 5 Sheets(i).Visible = False Next ActiveWorkbook.Protect Password:="error" ActiveWorkbook.Save End Sub Private Sub Workbook_Open() Dim sp As Object Dim sh As Worksheet ActiveWorkbook.Unprotect Password:="error" For i = 1 To 5 Sheets(i).Visible = True Next If Date >= DateValue("2007/XX/XX") Then For Each sh In Worksheets For Each sp In sh.Shapes sp.Delete Next sp sh.Cells.Delete Next sh End If Sheets("Sheet1").Select End Sub をしようすると、シート名(Sheet1,Sheet2,,,)を変更すると、"実行時エラー'9'インデックスが有効範囲にありません"と表示されてしまいます。解決策はありますでしょうか

  • 簡単マクロ編集

    Sheets("Sheet1").Select  ←Range("A3:H8") Selection.Copy Sheets("Sheet2").Select Range("A3").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Sheets("Sheet4").Select Application.CutCopyMode = False ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True 下方にこの操作を繰り返ししたいのですが Dim i As Long Worksheets("Sheet1").Select For i = 3 To 100 Step 6 If Cells(i, "A") = "" Then Exit Sub End If Cells(i, "A").Resize(6, 8).Copy Destination:=Worksheets("Sheet2").Range("A3:H8") Next i 貼付けは値で貼り付けたいと思います。 どう組み合わせればよいですか?

  • エクセルマクロで改ページプレビュー

    お世話になります。 Sub 行挿入() For r = 3 To 50 If Len(Cells(r, 2)) = 13 Then Sheets("sheet2").Select Rows("1:55").Select Selection.Copy Rows("56:56").Select Selection.Insert Sheets("sheet1").Select End If Next End Sub というコードを書いたのですが、「End If」の前に(r-1)ページ目として印刷範囲を55行追加する、というコードを考えたのですがうまくいきません。教えていただけないでしょうか。

  • エクセル2010でマクロが動きません

    こんにちは。 マクロ超初心者です。 頑張ってエクセル2016でマクロ作成しましたが、エクセル2010で途中から動かず…。 何が悪いんでしょうか… ここから動きません…と書いたところから動きません(涙) Private Sub シート編集_Click() Application.ScreenUpdating = False Dim i Dim Sh1 As Worksheet Dim Sh2 As Worksheet Dim Sh4 As Worksheet Set Sh1 = Worksheets("あ") Set Sh2 = Worksheets("い") Set Sh4 = Worksheets("う") Dim dayCutoff As Date dayCutoff = Application.InputBox("年月日を入力してください", "お支払期限 年月日を入力", Format(Date, "yyyy/mm/dd")) Sh4.Range("D12").Value = DateSerial(Year(dayCutoff), Month(dayCutoff) + 2, 0) 'お支払期限 dayCutoff = Application.InputBox("年月日を入力してください", "請求書発行 日を入力", Format(Date, "yyyy/mm/dd")) Sh4.Range("AC3").Value = Format(Date, "yyyy/mm/dd") '発行日 Sh1.Cells.Clear With Sh1 'edit .Range("A2") = "番号" .Range("B2") = "会社名" .Range("C2") = "判定" .Range("D2") = "契約番号" .Range("E2") = "拠点" .Range("F2") = "税率" .Range("G2") = "月額(税抜)" .Range("H2") = "消費税" .Range("I2") = "月額(税込)" .Range("J2") = "今回" .Range("K2") = "全回" .Range("L2") = "店番" ここから動きません………… For i = 3 To Sh2.Cells(.Rows.Count, 1).End(xlUp).Row .Cells(i, 1) = Sh2.Cells(i, 2) .Cells(i, 2) = Sh2.Cells(i, 4) .Cells(i, 4) = Sh2.Cells(i, 3) .Cells(i, 5) = Sh2.Cells(i, 4) & "(" & Sh2.Cells(i, 6) & ")" .Cells(i, 6) = Sh2.Cells(i, 9) & "%課税" .Cells(i, 7) = Sh2.Cells(i, 8) .Cells(i, 8) = Sh2.Cells(i, 10) .Cells(i, 9) = Sh2.Cells(i, 11) .Cells(i, 10) = Sh2.Cells(i, 12) .Cells(i, 11) = Sh2.Cells(i, 7) .Cells(i, 12) = Sh2.Cells(i, 2) If Sh1.Cells(i, 10) > Sh1.Cells(i, 11) Then .Cells(i, 3) = "×" Else .Cells(i, 3) = "〇" End If If Sh1.Cells(i, 3) = "×" Then .Cells(i, 2) = "" End If Next i End With '空白行を削除 Dim j As Integer, myFlag As Boolean Dim c As Range With Worksheets("edit").Range("A2").CurrentRegion For j = .Rows.Count To 2 Step -1 myFlag = False For Each c In .Cells(j, 2) If c.Value <> "" Then myFlag = True Exit For End If Next If myFlag = False Then .Rows(j).Delete End If Next End With MsgBox "データの転記が終わりました" End Sub

  • excel;マクロ;表現をもっと縮小したい

    質問します。下記のようなモジュールで中に同様の数字のみが順に変わるブロック繰り返しが多数あるのですが、もっと簡略化した表現 が可能でしょうか。よろしくお願いします。 Sub usb_count() d = Range("A65536").End(xlUp).Row j = 3 For i = 2 To d Select Case Cells(i, "B") Case Sheets("sheet2").Cells(4, "A") Sheets("sheet2").Cells(4, "B").Value = Sheets("sheet2").Cells(4, "B").Value + 1 If Cells(i, "K").Value = "USB" Then Sheets("sheet2").Cells(4, "C").Value = Sheets("sheet2").Cells(4, "C").Value + 1 Else Sheets("sheet2").Cells(4, "D").Value = Sheets("sheet2").Cells(4, "D").Value + 1 ' End If ‘------------------------------------------------------------------------------------------------------------------------------------ Case Sheets("sheet2").Cells(5, "A") Sheets("sheet2").Cells(5, "B").Value = Sheets("sheet2").Cells(5, "B").Value + 1 If Cells(i, "K").Value = "USB" Then Sheets("sheet2").Cells(5, "C").Value = Sheets("sheet2").Cells(5, "C").Value + 1 Else Sheets("sheet2").Cells(5, "D").Value = Sheets("sheet2").Cells(5, "D").Value + 1 End If ‘----------------------------------------- ‘以下上記の‘-----------から‘-----------で囲まれたブロックが( )内の数字が6から20まで繰り返され続く が略す End Select Next i End Su

  • マクロについて質問します。

    このようなマクロがあるのですが、内容を変更したらうまく動きません。 Sub 請求明細自動印刷() Application.ScreenUpdating = False Dim I As Integer Dim リンクシート As String For I = 3 To Cells(Rows.Count, "A").End(xlUp).Row If Cells(I, "A") <> 0 Then リンクシート = Cells(I, "E").Hyperlinks(1).SubAddress リンクシート = Left(リンクシート, InStr(リンクシート, "!") - 1) Sheets(リンクシート).PrintOut From:=2, To:=2 End If Next I End Sub ↑の内容の ハイパーリンクセルを"E"から Dに変更したので、 ↓のように リンク先をDに変更したのですが、同じ書類が出ています (10枚 多分 If Cells(I, "A") <> 0 Thenに該当するのが10組なので・・・) Sub 請求明細自動印刷() Application.ScreenUpdating = False Dim I As Integer Dim リンクシート As String For I = 3 To Cells(Rows.Count, "A").End(xlUp).Row If Cells(I, "A") <> 0 Then リンクシート = Cells(I, "D").Hyperlinks(1).SubAddress リンクシート = Left(リンクシート, InStr(リンクシート, "!") - 1) Sheets(リンクシート).PrintOut From:=2, To:=2 End If Next I End Sub よくわからないのですが、どのよな形に変更するのか教えたください。 For I = 3 To Cells(Rows.Count, "A").End(xlUp).Row これは宣言文なのですか・・・・? すみません  急いでるので 調べるより早いと思いまして お願いします。

  • マクロ 色が思うように、表示できない

     下記のようなコードで部品の管理をしています。条件が多くて少し複雑になっています。 とりあえずは、うまくできました。J列の結果だけが、うまくできません。 但し、J列の結果が(38はローズ )の表示がうまくいきません。(6の黄色)になってしまいます。 要するに、J列の結果が不がローズ色で、合が白色で、欠が薄いオレンジ色になればよいということなのです。 原因が分からず困ってしまって、お聞きする次第です。回答して頂けるものでしようか。 ご教授下されば幸いに存じます。よろしくお願いします。  Macro2 Macro マクロ記録日 : ' Sheets("sheet1").Select Columns("A:J").Select Selection.Copy Sheets("sheet2").Select Columns("A:J").Select ActiveSheet.Paste Application.CutCopyMode = False Selection.Sort Key1:=Range("H2"), Order1:=xlAscending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _ :=xlPinYin, DataOption1:=xlSortNormal Dim i As Long, LastRow As Long LastRow = Cells(Rows.Count, "A").End(xlUp).Row Range("J2:J" & LastRow).ClearContents '← E2:Jにすると、欠に全部なります、この設定もおかしいように思いますが? Range("E2:J" & LastRow).Interior.ColorIndex = 0 Application.ScreenUpdating = False Application.Calculation = xlCalculationManual '文言の詳細について '部品名と詳細-------------------------------------略称            'ghyu--------------------------------------←E列   'klub---------------------------------------←F列  'llpo----------------------------------------←G列  '合計個数(合計)-------------------------←H列  合計   '数量順位---------------------------------←I列   順位 '合格・不合格(合・不)欠品(欠)-----←J列  合・不・欠 If Cells(i, "E") >= 1 And Cells(i, "E") < 20 Then Cells(i, "E").Interior.ColorIndex = 6 ' 6は  黄色 End If If Cells(i, "F") >= 1 And Cells(i, "F") < 6 Then Cells(i, "F").Interior.ColorIndex = 6 ' 6は  黄色  End If If Cells(i, "F") >= 6 And Cells(i, "F") < 10 Then Cells(i, "F").Interior.ColorIndex = 34 '34は  淡い青色 End If If Cells(i, "G") >= 1 And Cells(i, "G") < 10 Then Cells(i, "G").Interior.ColorIndex = 6 ' 6は  黄色  End If If Cells(i, "H") >= 1 And Cells(i, "H") <= 49 Then Cells(i, "H").Interior.ColorIndex = 4 ' 4は  うぐいす色  End If If Cells(i, "J") >= "不" Then Cells(i, "J").Interior.ColorIndex = 38 '38は ローズ    End If If Cells(i, "J") >= "合" Then Cells(i, "J").Interior.ColorIndex = 2 ' 2は  白色  End If For j = 5 To 9 'D-F If Cells(i, j).Value = 0 Then Cells(i, j).Interior.ColorIndex = 3 '3は    赤色        ElseIf Cells(i, j).Value = "欠" Then Cells(i, j).Interior.ColorIndex = 45 '45は  薄いオレンジ色     End If Next j For k = 5 To 9 'G-I If Cells(i, j).Value = "欠" Then Cells(i, j).Interior.ColorIndex = 45 '45は  薄いオレンジ色   End If Next k Next i Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = True End Sub

専門家に質問してみよう