Macroについて教えてください

このQ&Aのポイント
  • Macroについて教えてください。前回は1~5はグレー、6~10は茶色という形で管理していましたが、今回は進捗率での管理をしたく、80%以下は白、80~90%は赤、90~100%は青としたいと思っています。
  • Macroを実装し、進捗率での管理をしたいです。80%以下は白、80~90%は赤、90~100%は青にしたいです。
  • 今回は進捗率での管理をしたいため、Macroを修正したいです。80%以下は白、80~90%は赤、90~100%は青になるように設定したいです。
回答を見る
  • ベストアンサー

macroについて教えてください

こんにちは。以前こちらでPrivate SubについてMacroを教えていただきました。(あの後ログインパスワード等が不明になりお礼も出来ませんでしたが。。。回答頂いた方すみませんでした。) 下記がそのMacroですが、今回また少し変えることになり どのように変えていいのか分かりません。 前回は1~5はグレー、6~10は茶色・・・という形にしたのですが 今回は進捗率での管理をしたく、80%以下は白、80~90%は赤、90~100%は青としたいと思っています。 Private Sub Worksheet_Change(ByVal Target As Range) Dim iColors As Variant Dim rw As Long Dim CellCnt As Integer Dim col As Integer Dim col2 As Integer Dim i As Integer Dim j As Integer Dim k As Integer Dim c As Variant Dim ar() As Variant Dim Sh1 As Worksheet Set Sh1 = Worksheets("小児科Dr") col = Target.Cells(1).Column '制限された列 If Not (col = 4 Or col = 8 Or col = 12 Or col = 16) Then Exit Sub iColors = Array(16, 16, 16, 16, 16, 53, 53, 53, 53, 53, 54, 54, 54, 54, 54) CellCnt = Target.Count ReDim ar(CellCnt - 1) For Each c In Target If c.Value <> "" Then If IsNumeric(c.Value) Then i = c.Value If i >= 11 Then i = 10 End If If i > 0 And i < 11 Then j = iColors(i - 1) Else j = 2 End If ar(k) = j k = k + 1 End If End If Next c rw = Target.Row Select Case col Case 4: col2 = 2 Case 8: col2 = 8 Case 12: col2 = 14 Case 16: col2 = 20 'Sh1.Cells(rw + 2, 13).Resize(Int(Target.Count / 3), 3).Interior.ColorIndex = j End Select InsideColors Sh1, rw, col2, CellCnt, ar() Set Sh1 = Nothing End Sub Private Sub InsideColors(sh As Worksheet, _ rw As Long, _ col As Integer, _ cnt As Integer, _ ar As Variant) 'sh[シート],rw[行], col[列],cnt[セル個数],iColor[色指数] Dim i As Integer Dim j As Integer Dim n As Integer Dim k As Integer If cnt Mod 5 > 0 Then '範囲行数 i = (cnt + 5 - (cnt Mod 5)) / 5 Else i = cnt / 5 End If rw = Int((rw - 1) / 5) + 1 '行再設定 j = ((rw - 1) Mod 5) + 1 '列設定 For n = j To cnt sh.Cells(rw + 2, col).Resize(i, 5).Cells(n).Interior.ColorIndex = ar(k) k = k + 1 Next n End Sub 毎回他の人を頼ってしまい、申し訳ないのですがお願いします。 また、前回分からなかったので1~5を指定するときに5回同じカラー番号を書いたのですがこちらも良かったら手直し方法を教えていただければ助かります。 宜しくお願いします。

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

  • ベストアンサー
  • lul
  • ベストアンサー率41% (10/24)
回答No.5

こんにちは。 さっきのソースを少し変更しました。 これで対応できると思います。 Private Sub Worksheet_Change(ByVal Target As Range) Const MaxCol As Integer = 28 Dim intUpdateColumn As Integer Dim intColor As Integer Dim c As Variant Dim i As Integer, col As Integer Dim Sh1 As Worksheet Set Sh1 = Worksheets("小児科Dr") col = Target.Cells(1).Column If col Mod 6 <> 4 Or col > MaxCol Then Exit Sub '制限された列 For Each c In Target col = c.Column If c.Value <> "" And IsNumeric(c.Value) Then Select Case c.Offset(0, 1) Case Is >= 0.91: intColor = 5 Case Is >= 0.81: intColor = 3 Case Else: intColor = 2 End Select intUpdateColumn = Int((col - 4) / 6) * 2 + 2 Sh1.Cells(c.Row, intUpdateColumn).Interior.ColorIndex = intColor End If Next c Set Sh1 = Nothing End Sub 変更箇所はピックアップするセル列の追加と反映先のセル列の計算です。 これでご希望されている処理は出来そうですか?

iguyuk0512
質問者

お礼

ありがとうございます!! 完璧に思い通りの動きをしてくれました。 こんな形でしかお礼が出来ないのが残念です。。 本当にありがとうございました☆

その他の回答 (4)

  • lul
  • ベストアンサー率41% (10/24)
回答No.4

こんにちは! ご説明頂いた事を実現するなら以下のコードのみで出来ると思います。 Private Sub Worksheet_Change(ByVal Target As Range) Const intUpdateColumn As Integer = 2 Dim intColor As Integer Dim c As Variant Dim Sh1 As Worksheet Set Sh1 = Worksheets("小児科Dr") If Not Target.Cells(1).Column = 4 Then Exit Sub '制限された列 For Each c In Target If c.Value <> "" And IsNumeric(c.Value) Then Select Case c.Offset(0, 1) Case Is >= 0.91: intColor = 5 Case Is >= 0.81: intColor = 3 Case Else: intColor = 2 End Select Sh1.Cells(c.Row, intUpdateColumn).Interior.ColorIndex = intColor End If Next c Set Sh1 = Nothing End Sub 進捗を記載するシートのマクロとして使用して下さい。 上記では、D列が変更された場合にE列の値を見て「小児科Dr」というシートのB列の対応する行の色を編集しています。 こんな感じで良かったでしょうか?

iguyuk0512
質問者

補足

ありがとうございます。 キレイに色が一段ずつ付きました!! ですが、本当に何度も申し訳ないのですが、 ソースを書いてあるシートにはA~E(A列:番号、B列:氏名、C列:目標、D列:進捗、E列:進捗率<D/C>)の表があり、F列は空欄でまた G~K列までA~Eと同じ表があります。(エリアごとの表になっているため、同じ表が横に5つあります) 色を表すシートも同じようにB列・D列・F列と一つ飛ばしに表が5つありソースを書いてあるシートのE列・K列・・・との表の5つ目をそれぞれ行を見てセルの色が塗られるといったフォーマットなのです。。。 こちらの説明不足、また説明下手で何度もお手数をおかけしてしまい申し訳ございません。 現在のソースの中で同じように横に連なる表に色をつけるためには どのようなソースを書き足すのでしょうか? ファイルを添付できれば分かりやすいのですが・・・。 分かりづらい説明ですみません。。 ~色を付けるシート&セル~ A列 B列 C列 D列 E列 □      □      □ □      □      □        □      □      □        □      □      □ ~ソースが書いてあるシート~ A列 B列 C列 D列 E列 F列 G列 H列 I列 J列 K列  No. 氏名 目標 進捗   %      No. 氏名 目標 進捗 %  No. 氏名 目標 進捗   %      No. 氏名 目標 進捗 % No. 氏名 目標 進捗   %      No. 氏名 目標 進捗 % 上記それぞれのシートでE列(ソースのシート)=B列(色のシート) K列(ソースのシート)=D列(色のシート)という感じにしたいです。

  • lul
  • ベストアンサー率41% (10/24)
回答No.3

こんにちは、まずご質問の件ですが iColors = Array(16, 16, 16, 16, 16, 53, 53, 53, 53, 53, 54, 54, 54, 54, 54) これに関しましては不要です、あっても別に害はありませんが…(使用していないので) 次に If Not (col = 4 Or col = 8 Or col = 12 Or col = 16) Then Exit Sub これに関しましては、変更されたセルの列が4列目、8列目、12列目もしくは16列目でなければ処理はしないという事ですね、iguyuk0512様の方でそういった仕様にされていないのであれば削除して頂いても問題ないかと思います。 InsideColorsプロシージャの方でも色々セルの位置を計算しておられるようですので希望されている箇所へきちんと反映されているかどうかは仕様を知らない為分かりませんが、こちらでテストしてみた所色付けは出来ているようでした。 詳細にやりたい事が分かればすぐに回答できるんですがこういった場では難しいですね(^^;

iguyuk0512
質問者

補足

何度もご回答ありがとうございます。 他のファイルで試してみたところ、確かに色は変わりました。 ソースを書いているシートですが、C列に目標、D列に進捗、E列にD/Cの計算式を入れています。 進捗を入れるとE列の進捗率が変わるといったフォームにしていますが 計算式のせいで色が変わらないのでしょうか? 直接入力でなければ変わらないものですか? また、こちらの説明不足で申し訳ないのですが ソースを書いているシートのE3へ入力すると、別シート上のB3の色が変わり、E4へ入力するとB4が変わるようにしたいのですが 現在のソースですとE4に入力してもB3が変わってしまいます。 E列の何行目に入力しても色が変わるのはB3なのですが E3=B3、E4=B4、E5=B5と色が変わるにはどこを書き換えれば 良いのでしょうか? 大変申し訳ないのですが、宜しくお願いします。。

  • lul
  • ベストアンサー率41% (10/24)
回答No.2

やはり勘違いしていましたね…失礼しました。 で、ご要望の件ですが、プロシージャ「Worksheet_Change」の For Each c In Target ~ Next c の部分を以下のように修正して頂ければ実現できるかと思われます。 For Each c In Target If c.Value <> "" Then If IsNumeric(c.Value) Then Select Case c.Value Case Is >= 0.91: ar(k) = 5 Case Is >= 0.81: ar(k) = 3 Case Else: ar(k) = 2 End Select k = k + 1 End If End If Next c まだ回答が完全でなければまた仰って下さい。

iguyuk0512
質問者

補足

早急なご回答ありがとうございます。 作業を会社でやっているので、確認が出来ずご返事遅くなってしまい、申し訳ございません。。。 やってみたのですが、特に反応がなく・・・デバックも出なかったので何がおかしいのか自分なりに考えてみたのですが If Not (col = 4 Or col = 8 Or col = 12 Or col = 16) Then Exit Sub iColors = Array(16, 16, 16, 16, 16, 53, 53, 53, 53, 53, 54, 54, 54, 54, 54) というソースは残しておいていいものでしょうか? こちらでもカラーの指定をしてるのでダブっているのかなとちょっと思ったのですが。 素人判断なので分かりませんが、何か策があればまたご回答いただけると幸いです。

  • lul
  • ベストアンサー率41% (10/24)
回答No.1

こんにちは、前回というのがどのような話だったのか分かりませんが ソースを見た感じだと、「Private Sub Worksheet_Change」中の iColors = Array(16, 16, 16, 16, 16, 53, 53, 53, 53, 53, 54, 54, 54, 54, 54) という箇所を以下のように書き換えればご希望通りになると思います。 iColors = Array(2,2,2,2,2,2,2,2,3,5,5,5,5,5,5) これで出来ませんか?もし質問を勘違いしていましたら言って下さい^^;

iguyuk0512
質問者

補足

ご回答ありがとうございます。 前回は下記のような質問をしました。 http://oshiete1.goo.ne.jp/qa3686374.html 恐らく%を使うと小数点での扱いになりますが 現時点のソースでは1以上でのソースではないかと思います。 Case Is >= 0.91: myColor = 38 Case Is >= 0.81: myColor = 37 上記のような書き方をすれば良いのだと単純に思うのですが 私が持っているソースを上記のようにする書き方が分かりません。。 お分かりになりますか?

関連するQ&A

  • VB2005で、Structureの配列を返すプログラムを以下のように書きたい

    VB2005で、Structureの配列を返すプログラムを以下のように書きたいのですが、そもそもVB6しか使ったことが無いもので、以下のような素数の結果を返すこのプログラムの書き方はVB2005らしいでしょうか? Module Module1 Public Structure SosuuStatus Public num As Integer Public status As String End Structure Class Sosuu Function SosuuCheck(ByVal st As Integer, ByVal ed As Integer) As SosuuStatus() Dim i As Integer, j As Integer Dim sosuu(0 To ed - st) As SosuuStatus Dim cnt As Integer = 0 For i = st To ed sosuu(cnt).num = i sosuu(cnt).status = "" '初期化 If 1 = i Then sosuu(cnt).status = "素数ではない" ElseIf 0 = (i Mod 2) Then sosuu(cnt).status = "素数ではない" Else For j = 3 To Math.Sqrt(ed) If 0 = (i / j) Then sosuu(cnt).status = "素数ではない" End If Next j End If If sosuu(cnt).status = "" Then sosuu(cnt).status = "素数である" End If cnt = cnt + 1 Next i SosuuCheck = sosuu End Function End Class End Module

  • VBA PrintArea に引数を使いたい

    お世話になります 入力ファイルのある項目を抽出したデータを出力ファイルに同一フォーマットで出力しています。 この時印刷範囲の指定を行ってますが、経験値により概算で印刷されるであろう枚数を PrintAreaに指定していて、現状では抽出データの編集されたページ以降も何枚か印刷 の対象に入っているため、ムダな紙がプリントされてしまいます。 そこでディテイルカウントなる物を設け、改ページ毎カウントアップして印刷時に、プリントエリアを指定 するところで使いたいのですが、実行時エラー'1004'PrintArea が設定できませんのエラーが出て しまいます。 指定でよい方法があったらご教示願います。以下VBAの内容です。 Sub P_Print() ' Dim D_cnt As Integer Dim sh1 As Worksheet '添字 Dim sh2 As Worksheet 'd ; 入力データ、エクセルファイルの最終行番号 Dim d As Integer 'i ; 入力データ読込件数 Dim i As Integer 'j ; 出力側シートのラインカウンタ Dim j As Integer ' (5 -> 54行の間のループ) Dim K As Integer 'k ; 出力側シートのライン行 ' (実際に書き込む行) If 諸表印刷.記録A.Value = True Then Windows("記録(A).xls").Activate End If If 諸表印刷.記録B.Value = True Then Windows("記録(B).xls").Activate End If If 諸表印刷.記録C.Value = True Then Windows("記録(C).xls").Activate End If Sheets("原紙").Select Sheets("原紙").Copy Before:=Sheets(2) Sheets("原紙 (2)").Select Set sh2 = Worksheets("原紙 (2)") Windows("データ 2013年度").Activate Set sh1 = Worksheets(combo_sel) '諸表印刷フォームで選択されたシートをセット d = sh1.Range("A65536").End(xlUp).Row K = 5 j = 5 For i = 2 To d If sh1.Cells(i, "O") = P_sel Then    If j < 55 Then 'sh2.Cells(k, "A") = sh1.Cells(i, "A") 'sh2.Cells(k, "B") = sh1.Cells(i, "B") 'sh2.Cells(k, "C") = sh1.Cells(i, "C") 'sh2.Cells(k, "D") = sh1.Cells(i, "D") 'sh2.Cells(k, "E") = sh1.Cells(i, "E") 'sh2.Cells(k, "F") = sh1.Cells(i, "F") 'sh2.Cells(k, "G") = sh1.Cells(i, "G") K = K + 1 j = j + 1    Else '改ページ処理、Detail1行目の編集 K = K + 8 j = 5 'sh2.Cells(k, "A") = sh1.Cells(i, "A") 'sh2.Cells(k, "B") = sh1.Cells(i, "B") 'sh2.Cells(k, "C") = sh1.Cells(i, "C") 'sh2.Cells(k, "D") = sh1.Cells(i, "D") 'sh2.Cells(k, "E") = sh1.Cells(i, "E") 'sh2.Cells(k, "F") = sh1.Cells(i, "F") 'sh2.Cells(k, "G") = sh1.Cells(i, "G")     K = K + 1   j = j + 1   D_cnt = D_cnt + 1 ←ここでディテイルカウント +1 End If End If Next i If 諸表印刷.記録A.Value = True Then Windows("記録(A).xls").Activate ActiveSheet.PageSetup.PrintArea = "$A$1:$N$(D_cnt*58)" ←ここでエラーが出る End If If 諸表印刷.記録B.Value = True Then Windows("記録(B).xls").Activate ActiveSheet.PageSetup.PrintArea = "$A$1:$N$(D_cnt*58)" ←ここでエラーが出る End If If 諸表印刷.記録C.Value = True Then Windows("記録(C).xls").Activate ActiveSheet.PageSetup.PrintArea = "$A$1:$N$(D_cnt*58)" ←ここでエラーが出る End If End sub

  • マクロで色が同じになるように設定したい

    こんにちは。 現在マクロに挑戦中なのですが、一点分からず戸惑っています。 お分かりになる方教えてください。 下記のマクロを書きました。 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 --------------------------------------------------------------- お分かりになる方、宜しくお願い致します。

  • 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

  • Workbook

    次のプログラムをExcelのWorkbookで開くやり方がよくわかりません。 どうやってやるのか教えていただけないでしょうか? Option Explicit Const ALIVE As Integer = 1 Const DEAD As Integer = 0 Const BORN As Integer = 3 Const LIFE As Integer = 2 Const SIZE As Integer = 20 Const Tmax As Integer = 100 Dim C(SIZE, SIZE) As Integer Dim Xrange As Variant Private Sub LifeGame() Dim InitRate As Single Dim T As Integer Dim I As Integer, J As Integer Randomize Xrange = Range("A1:T20") InitRate = 0.5 For I = 1 To SIZE For J = 1 To SIZE If Rnd() < InitRate Then C(I, J) = ALIVE Else C(I, J) = DEAD End If Next J Next I For T = 1 To Tmax For I = 1 To SIZE For J = 1 To SIZE If C(I, J) = ALIVE Then Xrange(I, J) = "■" Else Xrange(I, J) = "" End If Next J Next I Range("A1:T20") = Xrange For I = 1 To SIZE For J = 1 To SIZE C(I, J) = Cnext(I, J) Next J Next I Next T End Sub Function Cnext(I As Integer, J As Integer) As Integer Dim xi As Integer Dim xj As Integer Dim xsum As Integer For xi = I - 1 To I + 1 For xj = J - 1 To J + 1 If (xi > 0 And xi <= SIZE) _ And (xj > 0 And xj <= SIZE) Then If Not (xi = I And xj = J) Then If C(xi, xj) = ALIVE Then xsum = xsum + 1 End If End If End If Next Next Select Case xsum Case BORN Cnext = ALIVE Case LIFE Cnext = C(I, J) Case Else Cnext = DEAD End Select End Function Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range) Call LifeGame End Sub

  • VB6→VB2005アップグレードの際のエラー

    VBを勉強中です。段階としては書籍やサイトの見本プログラムを いくつか真似て作っているところです。 質問ですがVB6で作られたプログラムのバージョンアップを 行っています。VS2005を使いアップグレードを行った際 UPGRADE_WARNINGが発生し、デバッグできない状態です。 エラーを潰してデバッグしたいのですが、どう直して良いのか 教えて下さい。 "配列型の次元数が異なるため、型 'Object の 2 次元配列' の値を 'Object の 1 次元配列' に変換できません。" 構文は以下の通りです。 Public Sub Sort(ByRef Ar() As Object, ByRef rs As Integer, ByRef cs As Integer, ByRef Re As Integer, ByRef ce As Integer, ByRef keyc As Integer) Dim i As Integer Dim j As Integer Dim k As Integer Dim aa As Object For i = rs To Re - 1 For j = i + 1 To Re 'UPGRADE_WARNING: オブジェクト Ar(j, keyc) の既定プロパティを解決できませんでした。 'UPGRADE_WARNING: オブジェクト Ar(i, keyc) の既定プロパティを解決できませんでした。 If Ar(i, keyc) > Ar(j, keyc) Then For k = cs To ce 'UPGRADE_WARNING: オブジェクト Ar(i, k) の既定プロパティを解決できませんでした。 'UPGRADE_WARNING: オブジェクト aa の既定プロパティを解決できませんでした。 aa = Ar(i, k) 'UPGRADE_WARNING: オブジェクト Ar(j, k) の既定プロパティを解決できませんでした。 'UPGRADE_WARNING: オブジェクト Ar(i, k) の既定プロパティを解決できませんでした。 Ar(i, k) = Ar(j, k) 'UPGRADE_WARNING: オブジェクト aa の既定プロパティを解決できませんでした。 'UPGRADE_WARNING: オブジェクト Ar(j, k) の既定プロパティを解決できませんでした。 Ar(j, k) = aa Next End If Next Next End Sub

  • 小数点以下表示

    averageで計算した値を表示したところ、 勝手に四捨五入されてしまいました 小数点第二位まで表示したいので どなたかよろしくお願いいたします<m(__)m> Option Explicit Public Sub 平均() Const SH_NAME As String = "VBA" Dim art As String Dim i Dim ws As Worksheet Dim endrow As Long Dim msg As String Dim writerow As Integer Dim target As Range Dim ActCell As Variant Dim Result As Integer Set ws = ThisWorkbook.Worksheets(SH_NAME) writerow = 2 art = InputBox("日付を入力してください") With ws endrow = .Cells(Rows.Count, 2).End(xlUp).Row For i = 2 To endrow If art = .Range("A" & i) Then If target Is Nothing Then Set target = Range("D" & i) Else Set target = Union(target, Range("D" & i)) End If Else If InStr(msg, .Range("A" & i)) = 0 Then msg = msg & .Range("A" & i) & vbCrLf End If End If Next i If msg <> "" Then MsgBox msg End If target.Select ActCell = Selection.Address Result = Application.WorksheetFunction.Average(.Range(ActCell)) Range("F39").Value = Result Range("F39").NumberFormatLocal = "0.00" End With End Sub

  • VBAのファイル参照について

    セルの変更時、列によって行の内容を変更するプログラムを組んだのですが、 エラーが起きてうまくいきません。 使用しているExcelは2007です。 ファイルを参照するあたりが全然わかってないのでそのあたりがあやしいです。 実行時エラー '91': オブジェクト変数または With ブロック変数が設定されていません。 → hoge = book1.Worksheets(customer).Range("A34:D" & endrow) '係数表をコピー ↓デバッグ押すと 実行時エラー '-2147417848 (80010108)': 'Value' メソッドは失敗しました: 'Range'オブジェクト → Call all_feeCulc_change2(target.Parent.Name, target.row) 番号をメモし忘れました。91かこれが表示されます。どちらが出るかわかりません。 'Range' メソッドは失敗しました:'_Worksheet' オブジェクト →endrow = book1.Worksheets(customer).Cells(Rows.Count, 1).End(xlUp).row '最終行番号を取得 何回かリトライして開いたり閉じたりを繰り返したら↓のようなダイアログも出ました。 マクロでスタック領域が不足しています また、ダイアログで終了を押したらセルを正しく選択できなくなりました。 デバッグを押したら、停止ボタンを押すと応答なしになった後、Excelが終了し再起動しました。 そして、どちらを選択した場合でも、メニューや閉じるボタンを押してもExcelが終了できず、 タスクマネージャからプロセスを終了させるしかなかったです。 その時CPU使用率が50%を超えてたりと異常事態になっております。 ###標準モジュール### Sub all_feeCulc_change2(ByVal sheetName As String, ByVal row As Integer) If sheetName <> "" Then Dim customer As String customer = Worksheets(sheetName).Cells(row, 3) On Error Resume Next Dim book1 As Workbook '別ファイルのオープン(触らない) Workbooks.Open Filename:="hogehoge.xlsm" '別ファイルのオープン(触らない) Set book1 = Workbooks("hogehoge.xlsm") '別ファイルのオープン(触らない) On Error GoTo 0 Dim endrow As Integer '最終行番号 endrow = book1.Worksheets(customer).Cells(Rows.Count, 1).End(xlUp).row '最終行番号を取得 Dim hoge As Variant hoge = book1.Worksheets(customer).Range("A34:D" & endrow) '早見表から係数表をコピー With Worksheets(sheetName) ... ###ThisWorkbook### Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal target As Range) If target.Count = 1 Then Dim column As Integer Dim row As Integer column = target.column row = target.row If row >= 3 Then If ((column - 3) Mod 5) = 2 And column > 3 Then '更新セルがメーターだったら Call usageCulc_change(target.Parent.Name, target.column, target.row) Call all_feeCulc_change(target.Parent.Name, target.column - 1, target.row) Call chenge_tax_change(target.Parent.Name, target.column + 1, target.row) ElseIf column = 3 Then target.Value = format(target.Value, "000") '誤入力防止 Call all_feeCulc_change2(target.Parent.Name, target.row) Call chenge_tax_change2(target.Parent.Name, target.row) End If End If End If End Sub Private Sub Workbook_Open() '*****すべてのシート名を取得*****' Dim ws As Worksheet Dim sheetName() As String ReDim sheetName(3) Dim cnt As Integer cnt = 0 For Each ws In Worksheets If cnt > 3 And (cnt Mod 4) = 0 Then ReDim Preserve sheetName(UBound(sheetName) + 4) End If sheetName(cnt) = ws.Name cnt = cnt + 1 Next '*****取得終了*****' Dim endrow As Integer Dim line As Variant For Each line In sheetName If line <> "000" And line <> "" Then With Worksheets(line) endrow = .Cells(Rows.Count, 3).End(xlUp).row Dim i As Integer Dim j As Integer For i = 0 To endrow For j = 0 To 11 .Cells(3 + i, 4 + j * 5).NumberFormatLocal = "0.0" .Cells(3 + i, 5 + j * 5).NumberFormatLocal = "0.0" .Cells(3 + i, 6 + j * 5).NumberFormatLocal = "#,##0" .Cells(3 + i, 7 + j * 5).NumberFormatLocal = "#,##0" .Cells(3 + i, 8 + j * 5).NumberFormatLocal = "#,##0" Next j Next i End With End If Next End Sub

  • オブジェクト??

    またまた困っております inputboxで入力した日付を検索して複数選択しようとしたのですが unionの使い方がよくわかりません(・・;) どこが間違っているのかもしくは何が足りないのか教えてください<m(__)m> どうかよろしくお願いします! Option Explicit Sub グラフ() Const SH_NAME As String = "VBA" Dim art As String Dim i Dim ws As Worksheet Dim endrow As Long Dim msg As String Dim writerow As Integer Dim grahu As Chart Dim target As Range Set ws = ThisWorkbook.Worksheets(SH_NAME) writerow = 2 art = InputBox("日付を入力してください") With ws endrow = .Cells(Rows.Count, 2).End(xlUp).Row For i = 2 To endrow If art = .Range("A" & i) Then Set target = Union(target, "D" & i) Else If InStr(msg, .Range("A" & i)) = 0 Then msg = msg & .Range("A" & i) & vbCrLf End If End If Next i target.Select End With If msg <> "" Then MsgBox msg End If MsgBox "グラフベースを作成しました" End Sub Set target = Union(target, "D" & i) ↑ここでエラーが起きて 「オブジェクトが必要です」と言われました どうすればよいのでしょうか?

  • ExcelのVBAソースコード(一部)の翻訳

    ソースコードの一部ですが、開発者が他界し訊けずにおります。 今後自分でもVBAを勉強しますが、お教えいただけますでしょうか。 なお冒頭は Function process_new(m0 As Integer, m As Integer, d As Variant, ans As Double) As Integer Dim a(501), b(501), s(501), r(501) As Double Dim w(501), g(11), xx As Double Dim s1 As Double Dim k(501) As Integer Dim i, j, flg As Integer でスタートしています。 =(以下、質問内容)==== s1 = s(k(0)) * 1.618 flg = 0 For i = m0 To m - 3 If Not i = k(0) Then If s1 > s(i) Then flg = flg + 1 End If End If Next i =(以上)====

専門家に質問してみよう