ExcelVBA非連続域の扱い:困っています

このQ&Aのポイント
  • ExcelVBAで非連続域の扱いについて困っています。
  • 具体的には、Functionを使用して最小値域を取得しようとしているのですが、制御がうまくいきません。
  • 非連続域の指定方法や値の渡し方について理解ができていません。どうぞご指導ください。
回答を見る
  • ベストアンサー

ExcelVBA 非連続域の扱い(01)

お世話になります。 添付映像の、ような 非連続域の、扱いに 困って、います 下記に、記載の コードに、おいて 2回目、以降に Function 最小値域(… に、 制御が、回た 際の >フィールド.Rows.Count が、 1に、成り 困って、います。 と、言うか 抑も、 非連続域の、扱い方が 全く 解って、いません どう、取得し、 どう、扱い、 どう、指定し、 どう、渡す、 のか… 等、 なので >Evaluate("MIN(" & フィ… や、 >For Each カウンター In フィールド.Range(Cells(… 等の、 Range指定、等も 間違えて、いる と、思います 其処で、 非連続域の、扱い に、ついて どうぞ、ご指南を 宜しく、お願いします。                記 Option Base 1 Option Explicit Type ランゲポイント形式   左 As Long   右 As Long   上 As Long   下 As Long End Type Function 最小値域(ByVal フィールド As Range, ByVal 列 As Long, Optional ByVal 指標値 As Variant) As Range Dim ポイント As ランゲポイント形式, ランゲ As Range, カウンター As Range, 注目行 As Long  Let ポイント.上 = 1  Let ポイント.左 = 1  Let ポイント.下 = フィールド.Rows.Count  Let ポイント.右 = フィールド.Columns.Count  Set ランゲ = Nothing  Set カウンター = Nothing  If IsMissing(指標値) _  Then   Set 指標値 = Evaluate("MIN(" & フィールド.Range(Cells(列, ポイント.上), Cells(列, ポイント.下)).Value & ")")  End If  For Each カウンター In フィールド.Range(Cells(列, ポイント.上), Cells(列, ポイント.下))   If カウンター.Value = 指標値 _   Then    Let 注目行 = カウンター.Row    If ランゲ Is Nothing _    Then     Set ランゲ = フィールド.Range(Cells(注目行, ポイント.左), Cells(注目行, ポイント.右))    Else     Set ランゲ = Union(ランゲ, フィールド.Range(Cells(注目行, ポイント.左), Cells(注目行, ポイント.右)))    End If   End If  Next  Set 最小値域 = ランゲ End Function Sub main() Dim ダミー As Range  Set ダミー = 最小値域(最小値域(最小値域(Range("sheet2!B2:e9"), 2, "A"), 3), 4) End Sub                               以上

  • Nouble
  • お礼率91% (1698/1856)

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

  • ベストアンサー
回答No.2

 (No.1の続き、です) 複数領域のセル範囲を使いこなしたいなら、  range.Areas プロパティ をまず、概念的に理解を深めることが、とっても重要です。   rng(2, 3) のように普通の省略形で書いて成立する参照であっても実は   rng.Areas(1).Cells(2, 3) が正しいという場合が結構あって、、、 とか、、、これは、   領域の参照を省略した場合は、常に、   rng.Areas(1) や   rng.Areas(1).Cells(1, 1)   を起点として、   rangeオブジェクトのメソッドやプロパティが機能する ということを意味しています。 上記のコードに挙げている例では、   rngRet.Areas(1).Cells(1, 1).EntireColumn は、   rngRet(1, 1).EntireColumn に。   rngRet.Areas(1).Columns.Count は、   rngRet.Columns.Count に。 本来の意味(由来)を想像出来ないような形での省略が可能で、 また、暗黙の内に省略されている場面を目撃することの方が多い、のです。 > For Each カウンター In フィールド.Range(Cells(列, ポイント.上), Cells(列, ポイント.下)) (行列の指定が反転しているのはともかく) ([フィールド]の中身は実行中に変動するので成立していないことも置いといて) この書き方では、先頭の矩形範囲.Areas(1)の左上セル.Cells(1, 1)を 起点とした参照にしかなっていません。 Areas プロパティを使ったFor Each ループの使用例を挙げておきましたので ゆっくり考えてみて下さい。 (ただし、  概念的な理解を援ける趣旨での記述であって  実用コードを意識したものではありません) 複数領域のセル範囲を扱うなら、  range.Areas プロパティ  range.Rows プロパティ  range.Columns プロパティ  range.Intersect メソッド  range.Union メソッド 等、コレクション風味のrangeオブジェクト(=Areas As Range)を返すもの を一通りお浚いして、基本を押さえておきましょう。 例えば、上に挙げた(実用を意識していないのですが)   For Each rngArea In rngRet.Areas     For Each rngRowPart In rngArea.Rows という記述についても、     For Each rngRowPart In rngRet.Rows の1行で(対応するNext削除すれば)、同じ結果を返してくれます。 Rows プロパティも複数領域を普通に扱える、ということです。 複数領域の要素としての矩形範囲それぞれを、 上下左右のポイントで捉えようとするのは、 基本を踏まえた上での、次のステージでは、可能性があると思います。 私個人は、  Cells(y, x).Resize(h, w) のように、 起点の座標x,yと高さh幅wで表現することが殆どで、  Range(Cells(top, left), Cells(bottom, right)) のような書式は、まったく使いません。 上下左右を扱うのは、  Range("B3:E3,B5:E6,B9:E9") ' (上記マクロ実行時のイミディエイトウィンドウより) のように、参照文字列で直接、複数領域を指定したい時の 各矩形範囲への参照を得たい時ぐらいです。 実際使うのは、  Range("B:E (3:3,5:6,9:9)") みたいな書式ですが、領域を扱う上ではこの書式こそ最高に重宝します。  range.Resize プロパティ これも使いこなせる方が、領域を合成する時なんかには有用です。 ご質問掲載4時間後の閲覧数が113とこの時期にしては特異でしたので、 閲覧者さんへの影響?も考えて、迷った末、 1度だけ回答することにしました。 態々お断りするのは、質問タイトルにある付番に反応してのものです。 教場ではないし、私的なSNSでもないので、 継続的な"教授"を求めていることを暗示されるのは如何なものかと。 現実にお困りの場面で、 質問者と回答者という立場で関われるような質問であれば、 また、お手伝いできること、"教示"できるもあるかも知れませんが、 この課題につきましては、以上とさせてください。 ご健闘を。

Nouble
質問者

お礼

有難うございます 〉複数領域のセル範囲を扱うなら、 〉 range.Areas プロパティ 〉 range.Intersect メソッド OfficeTanaka 氏の 掲載を、初め 様々な、掲示を 拝見させて、頂いて おりましたが 此等を 目に、するのは 初めての、事 お陰で 光明を、得た と、思えます 重ねて、申します 有り難うございます 〉質問タイトルにある付番に反応しての 今まで 幾度と、なく 質問させて 頂く、中で お礼欄、にて 詳細を お伺い、する 余り 多段に、渡る 質疑応答を お付き合い、 頂く、事も 多く、なって おりました しかし、 此れは、良くない と、反省し テーマ内で 別途、新たに 発起した、質問は 別で、聞くもの と 改めました 此れを、受け ご回答、頂く方 への、配慮 と、して テーマの、連続性 詰まりは、 あぁ、あの続きか と 容易に、想起 頂く、事が 一助に、なれば と、 今回は 未来を、想定し 付けさせて、頂いた 振り番、です 他意は、ありません ので ご容赦、下さい

その他の回答 (1)

回答No.1

' ' // Function ExtractMinV_Areas2Areas(ByRef ExtractedTable As Range, _           ByVal nCol As Long, _           Optional ByVal vIndex As Variant) As Range Dim c As Range Dim rngInt As Range Dim rngNewTable As Range   Set rngInt = Intersect(ExtractedTable, ExtractedTable(1, nCol).EntireColumn)   If IsMissing(vIndex) Then vIndex = WorksheetFunction.Min(rngInt) Debug.? "■'基のTable'= Range("""; ExtractedTable.Address(0, 0); """)" Debug.? , "'列相対'="; nCol, "'検索値/最小値'= "; vIndex Debug.? , "'検索範囲'= "; rngInt.Address(0, 0) Debug.? "'Table↓抽出↓集積中'"   For Each c In rngInt     If c = vIndex Then       If rngNewTable Is Nothing Then         Set rngNewTable = Intersect(ExtractedTable, c.EntireRow)       Else         Set rngNewTable = Union(rngNewTable, Intersect(ExtractedTable, c.EntireRow))       End If Debug.? "   ↓", rngNewTable.Address(0, 0)     End If   Next Debug.? "'抽出後のTable'= Range("""; rngNewTable.Address(0, 0); """)", "■"   Set ExtractMinV_Areas2Areas = rngNewTable End Function ' ' // Sub Re9325848w() Dim rngRet As Range   Set rngRet = ExtractMinV_Areas2Areas( _           ExtractMinV_Areas2Areas( _             ExtractMinV_Areas2Areas( _               Sheets("Sheet2").Range("B3:E9") _             , 2, "A") _           , 3) _         , 4)   rngRet.Select ' ' 以下、回答用オプション Dim vMatrix Dim rngArea As Range Dim rngRowPart As Range Dim rngCell As Range Dim nY As Long, nX As Long   ReDim vMatrix(1 To Intersect(rngRet, rngRet(1, 1).EntireColumn).Count, 1 To rngRet.Areas(1).Columns.Count)   For Each rngArea In rngRet.Areas     For Each rngRowPart In rngArea.Rows       nY = nY + 1       nX = 0       For Each rngCell In rngRowPart.Cells         nX = nX + 1         vMatrix(nY, nX) = rngCell       Next     Next   Next Debug.? "◆二次元配列の要素"   For nY = 1 To UBound(vMatrix)     For nX = 1 To UBound(vMatrix, 2) Debug.? vMatrix(nY, nX), ;     Next nX Debug.?   Next nY Debug.? "◆" End Sub ' ' // デバッグ と トレース を  しっかりと、出来るようにして、 怠ることなく、ご自分でやるべき仕事、 という意識を持って (コーディングや質問に) 取り組むようにして下さい。 趣味趣向に副った掃除の仕方を臨時に教えることは出来るでしょうけれど、 実践するのは他の誰でもない、、、でしょう。 Evaluateメソッドは、多重のオーバーヘッドが負担になりますから、 ・他に(効率的な)方法が無い場合 ・配列(範囲)と配列(範囲)とを演算させる、または演算結果が配列 等、限られた条件の下で、過分の負荷が掛からないよう 扱うように考えた方がよろしいかと。 Worksheetfunctionオブジェクトに用意されている メソッド(関数)があるならば、 わざわざEvaluateメソッドを用いるメリットはひとつもない処か、 寧ろ処理を遅くしてしまいます。 速さでは大抵他の処理に(例えばベタなループ処理にも)劣るけれど、 人間の立場として早く仕事を片付けたいとか、 文字数というリソースが他より重視される場面とか、 使い処を選んで使えれば、価値が上がってくるのが"Evaluate"ですね。 Evaluateメソッドに、 VBAで変数に格納した配列を 引数として直接渡すことは出来ません。 ・セル参照を経由して配列として解釈させるような書き方  例)   Set rng = [a1:c5]   matrix = Evaluate("""(""&" & rng.Address(0, 0) & "&"")""") ・配列定数式を文字列として渡す書き方  例)   matrix = Evaluate("{""A"",""B"",""C""}" & "&row(1:3)&" & """=""&" & "{""A"",500,2;""A"",1010,3;""B"",-1000000,2}") 2通りだけですね。 Let の使い方がおかしくないですか? Property Letに呼応したものなら、今のVBA界でも通じるコトバかもですけれど。 Typeも、それを引数として受け渡しするとか、 配列やコレクションの要素として、仮想テーブルの中のレコード的な扱いなら アリでしょうけれど、その使い方は却って謎を深めているような気がします。 他、object型にはByValは使いません。誤作動の元です。 object型でないものを格納する時に、 Set ステートメントを用いるのも止めましょう、というより、 object型の参照値なのか、数値や文字列等の値なのか、 結構間違ってること多いみたいなので、 この2つの区別をもっとハッキリ意識した方が、 間違いが減らせて、先が開けてくるんじゃないでしょうか。  (次の投稿に続きます)

Nouble
質問者

お礼

有難うございます。 ネット等を、調べつつ 少し 読み込ませて 頂いて また、後日 質問させて、頂ければ と、思います。

関連するQ&A

  • ExcelVBA Filter関数について

    お世話になります 唐突ですが、Filter関数についてお教えください。 これってobject、特にレンジobjectには使えないのですか? もし使えないならば、同様の用途のもの、他にありますでしょうか? ご教示をお願い致します。 例文 Option Base 1 Option Explicit Const カウントアップ As Integer = 1,Zero = 0, 真 As Boolean = True, 偽 As Boolean = False, DimBaseUnder = 0 Sub TEST() Dim ランゲ As Range, カウンターr As Range, カウンターI As Long, 項目数() As String     カウンターI = DimBaseUnder     With Sheets("Sheet1")         ランゲ = .Range("A1:j40").Value         Do             カウンターI = カウンターI + カウントアップ             ReDim 項目数(カウンターI)             項目数(カウンターI) = CStr(ランゲ.Cells(1, 1).Value)             ランゲ = Filter(ランゲ, 項目数(カウンターI), 偽)         Loop Until ランゲ Is Nothing     End With End Sub

  • ExcelVBA .Interior等に、ついて

    毎度、 お世話に、なります。 仮初めに、戯れで 下記の、ような コードを 作って、みた の、ですが Range(Cells(3, 列), Cells(10, 列)).Interior.ColorIndex も、 Range(Cells(3, 列), Cells(10, 列)).Interior.Pattern も、 ウオッチウインドウで 見た限り、では 値が、1つしか 出ません 此って… ? 後、 xlSolid等の 定数、ですが 実際の、値は 何が、当てられて いる の、ですか? もう1つ with ~ て Dosの、フォルダーの ように 1つ上の~~ て、指定 出来ないのですか? 例えば、ですが  With Range(Cells(3, 列), Cells(10, 列)).Interio   let .ColorIndex = 2.0 - (..value >= 90) * 34  End With と、いった感じに ..と 2つ、打つと 階層が、1つ 上に、上がる 的な… ? 無い… ですか? 宜しく お願い、致します                     記 Option Explicit Option Base 0 Const 列 As Long = 5 Sub test()  With Range(Cells(3, 列), Cells(10, 列))   Let .Interior.ColorIndex = Evaluate("2+(" & Range(Cells(3, 列), Cells(10, 列)).Address & ">=90)*32+(" & Range(Cells(3, 列), Cells(10, 列)).Address & "<=70)*34")   Let .Interior.Pattern = Evaluate("If((" & Range(Cells(3, 列), Cells(10, 列)).Address & " > 70)*(" & Range(Cells(3, 列), Cells(10, 列)).Address & " < 90) > 0 ," & CStr(Range(Cells(3, 列), Cells(10, 列)).Interior.Pattern) & ",""xlSolid"")")  End With End Sub                                  以上

  • EXCELVBA Variantとobject

    毎度 お世話に、なります。 3つ、程 お伺いしたい の、です 先ず、1つ目 Variant型に、Set で 代入、したら 駄目 みたい、ですけど 昔から でしたで、しょうか? 後、2つ目 objectは 複数値を、持つ ポインタに、よる 実態参照の、変数 と、思っていた の、ですが Variantも 此の、意味では objectの 気が、します で、ですね objectは、set必須 と、 持って、いましたが variantは objectでは、無い の、ですか? そう、決めた 奴が、いる の、だから 仕方ない とか、 付けなくて、いい と、覚えれば 其れで、良いじゃん とか、 等と、いえば 身も、蓋も、 ない、ですが… 最後に、 以下の、コーディングで 前者を、後者に、 変えると Application.WorksheetFunction.SumProduct( の、所で 転けます 要因と、して 考えられる、もの には どの様な、ものが 挙げられる で、しょうか? お教え下さい 宜しくお願いします。 Sub test() Dim 合否行列1 As Variant, 演算式1 As String, 合格件数 As Long  Let 演算式1 = "(sheet1!" & Range(Cells(1, 3), Cells(1, 200)).Address & "=Sheet2!" & Range("A1:A100").Address & ")+0"  Let 合格件数 = CLng(Application.WorksheetFunction.SumProduct(Evaluate(演算式1)))  合格行列1 = Evaluate(演算式1) End Sub Sub test() Dim 合否行列1 As Variant, 演算式1 As String, 合格件数 As Long  Let 演算式1 = "(sheet1!" & Range(Cells(1, 3), Cells(1, 200)).Address & "=Sheet2!" & Range("A:A").Address & ")+0"  Let 合格件数 = CLng(Application.WorksheetFunction.SumProduct(Evaluate(演算式1)))  Set 合格行列1 = Evaluate(演算式1) End Sub

  • ExcelVBAで条件の追加

    条件(0.5以下)に一致するセルの個数を数えます。 CH1 CH2 CH3 CH4 1 5  5 0.1  5 2 5  5 0.1  5 3 0.1 5 5   0.1 4 0.1 5 5   0.1 5 0.1 5 5   0.1 6 5  5 0.1  0.1 7 0.1 5 0.1  5 8 0.1 5 0.1  0.1 9 5  5 5 0.1 CH1の列の先頭行から数えていくと、0.5以下に一致するセルの個数はCH1では3個、2個となります。この3と2は足さずに別々に表示したいのです。 CH1が終わると、CH2→CH3→と繰り返します。 結果は以下のように列ごとに表にして示します。 CH1 CH2 CH3 CH4 3     2  4 2     3  2 今回は、以下の条件を追加したいのです。 「数えたセルの個数のうち、各列の先頭行や最終行を含むものは除く」 上の例でこの条件を追加しますと、CH3の2個、3個という結果のうち2個の方は先頭行を含んでいるので削除、CH4の結果のうち2個は最終行を含んでいるので削除、結果以下のようになります。 CH1 CH2 CH3 CH4 3    3  4 2     <コードの一部> Dim 出力値 As Variant Dim 出力先セル As Range Dim Counter As Long 'カウンタ Dim a As Long For a = 1 To 5 Set 出力先セル = Cells(2, 7+a) For Each 出力値 In Range(Cells(32, a),Cells(60000, a)).Value If 出力値 <= 0.5 Then Counter = Counter + 1 ElseIf Counter <> 0 Then 出力先セル.Value = Counter '出力 Set 出力先セル = 出力先セル.Offset(1) Counter = 0 'リセット End If Next If Counter <> 0 Then 出力先セル.Value = Counter '出力 End If Next このif文の所に上記条件を追加したいのです。※先頭行(32行)と最終行(60000行)は固定

  • ExcelVBA .cells(… が働きません

    お世話になります メモリーの、壁と 格闘して、います 其の、中で OfficeTANAKA様の http://officetanaka.net/excel/vba/tips/tips71.htm の、ページを 拝見し Private Declare Sub GlobalMemoryStatus Lib "kernel32" (lpBuffer As MEMORYSTATUS) と、モジュールに、 書き加えた、ところ With Ws   ↓此処、メソットがダメ  With .Range(.cells(… が、突如エラーに なり始めました Private Declare S… を、外して 全て、元通りに しても 回復、しません 回復可能で、しょうか? 宜しく お願い、します                  記 Option Explicit Option Base 0 Private Declare Sub GlobalMemoryStatus Lib "kernel32" (lpBuffer As MEMORYSTATUS) '↑  ↑  ↑  ↑ '此れを、加えると Type 変数取得順速度差を減らす  s1 As Long  s2 As Long  Ch As Long  du As Long  St As String  Rg As Range End Type Const n As Long = 2000 Dim lp As 変数取得順速度差を減らす, Data(1 To n, 1 To n) As Long, k As Long, Ws As Worksheets Sub ダミーデータ作成1()  Set Ws = Worksheets.Add()  Worksheets("Sheet1").Select  With Ws’   ↓此処で、エラー   With .Range(.Cells(1, 1), .Cells(n, n))    Let lp.St = "Min(" & Ws.Name & "!" & .Address & ")"   End With   For k = 0 To Int(n / 100) - 1    For lp.s2 = 1 To 100     For lp.s1 = 1 To n      With .Cells(k * 100 + lp.s2, lp.s1)       .Formula = "=RANDBETWEEN(1," & n & ")"       .Calculate       .Value = .Value       Data(k * 100 + lp.s2, lp.s1) = .Value      End With     Next lp.s1    Next lp.s2    Worksheets("Sheet1").Range("c1").Value = k    Application.DisplayAlerts = False    ThisWorkbook.Save    Application.DisplayAlerts = True   Next k   Set lp.Rg = .Range(.Cells(1, 1), .Cells(n, n))  End With End Sub                              以上

  • エクセル 最終行からの連続コピー

    エクセルで最終行から上に連続する10行(最終行含む)をコピーしたいです。 途中、空白行が含まれている場合でも、最終行を特定し、コピーできるようにするには、下記のコードにどう手を加えたらよいでしょうか? どなたかアドバイスをお願いします。 Sub Test()   Dim i As Long   Dim j As Integer   Dim rng As Range   With ActiveSheet     'フィルタ     .Range("A1").CurrentRegion.AutoFilter Field:=1          '行選択     With .AutoFilter.Range       For i = .Cells(.Cells.Count).Row To 2 Step -1         If .Rows(i).Hidden = False Then           If rng Is Nothing Then             Set rng = .Rows(i)           Else             Set rng = Union(rng, .Rows(i))           End If           j = j + 1         End If         If j >= 10 Then Exit For       Next i       'コピー       If Not rng Is Nothing Then         rng.Copy Worksheets("Sheet2").Range("A1")         Beep       Else         MsgBox "該当行は存在しません。", 48       End If     End With   End With   Set rng = Nothing なお、コードはこちらを参考にさせていただきました。 http://okwave.jp/qa3552420.html?ans_count_asc=1

  • エクセルマクロで開いているアクセスのファイルを知る

    エクセル2007です。今立ち上がっているファイルを、エクセルの表に書き出すマクロを作りたいです。 エクセル自身はいうまでもなく、ワード、パワーポイントまで成功しました。けど、アクセスだけがうまくいきません。パワーポイント用testはうまく動くのに、アクセス用testはだめなのです。 For Each アクセス文書 In アクセスアプリケーション.databases でこけるのです。どうも、「databases」 というところが間違っていると、目星をつけました。どう書いたらいいのか教えてください。いろいろ調べましたがわかりませんでした。 Sub パワーポイント用test() Dim パワーポイントアプリケーション As Object Dim パワーポイント文書 As Object Dim カウンター As Long カウンター = 1 Range("A2").Select On Error Resume Next Set パワーポイントアプリケーション = GetObject(, "PowerPoint.Application") On Error GoTo 0 If パワーポイントアプリケーション Is Nothing Then Exit Sub For Each パワーポイント文書 In パワーポイントアプリケーション.Presentations カウンター = カウンター + 1 Cells(カウンター, 1) = パワーポイント文書.Name Cells(カウンター, 2) = パワーポイント文書.FullName Next Set パワーポイントアプリケーション = Nothing End Sub Sub アクセス用test() Dim アクセスアプリケーション As Object Dim アクセス文書 As Object Dim カウンター As Long カウンター = 1 Range("A2").Select On Error Resume Next Set アクセスアプリケーション = GetObject(, "Access.Application") On Error GoTo 0 If アクセスアプリケーション Is Nothing Then Exit Sub For Each アクセス文書 In アクセスアプリケーション.databases カウンター = カウンター + 1 Cells(カウンター, 1) = アクセス文書.Name Cells(カウンター, 2) = アクセス文書.FullName Next Set パワーポイントアプリケーション = Nothing End Sub

  • 連続データのVBAの質問

    お世話になります。 Private Sub Worksheet_Change(ByVal Target As Range) Dim i As Long, k As Long, myNum As Long If Range("C1") <= Date - Day(Date) Then Exit Sub If Not Intersect(Target, Range("C1,B9:B39")) Is Nothing And Target.Count = 1 Then Application.EnableEvents = False With Target If .Column = 3 Then myNum = WorksheetFunction.Max(Range("B9:B39")) If IsDate(.Value) Then For i = 9 To 39 If Cells(i, "A").Value = "" Then Cells(i, "B").Value = "" Else Cells(i, "B") = myNum + i - 8 End If Next i End If Else i = .Row If .Value = "" Then Range(Cells(i + 1, "B"), Cells(39, "B")).ClearContents Else For k = i + 1 To 39 If Cells(k, "A").Value = "" Then Cells(k, "B").Value = "" Else Cells(k, "B") = Cells(k - 1, "B") + 1 End If Next k End If End If End With Application.EnableEvents = True ElseIf Not Intersect(Target, Range("R8:R38")) Is Nothing Then Application.EnableEvents = False Range(Cells(Target.Row, 18), Cells(39, 18)).Value = Target.Value Application.EnableEvents = True End If End Sub これはセルC1に年月を表記させ、そのC1セルの年月を変更した場合B9~B39のセルが自動で連続データの数字を記入し、B9~B39のどこかのセルを空白にすると、そのセル以降も空白になります。 そこで質問ですが、例えばB14の数字を消すとB15~39まで空白のセルになります。そして、B20に1と入力するとB21~39に連続データの数字が自動記入されます。 そしてC1の年月を次の月に更新した際は、B39で示された数字以降の連続データをB9に表示させるには、どうすれば良いでしょうか?

  • 表計算

    Sub TaskManager() Dim i As Integer Dim Maxval As Integer Dim Counter As Integer Dim AtoShoriFlg As String Set SH1 = Worksheets("Sheet1") Set SH2 = Worksheets("Sheet2") Maxval = WorksheetFunction.Max(Range("B:B")) Maxval = Maxval + 1 '初期値設定 i = 7 AtoShoriFlg = "ON" Counter = 1 Do While Cells(i, 4).Value <> "end" Select Case Cells(i, 4) Case Is = "新規エントリー" AtoShoriFlg = "OFF" i = i + 1 Case Is = "" Cells(i - 1, 4).Copy Cells(i, 4) Cells(i, 4).Font.Color = RGB(255, 255, 255) SH1.Range(SH1.Cells(i, 2), SH1.Cells(i, 6)).Borders(xlEdgeTop).LineStyle = xlLineStyleNone Case Is <> Cells(i - 1, 4) SH1.Range(SH1.Cells(i, 2), SH1.Cells(i, 6)).Borders(xlEdgeTop).LineStyle = xlContinuous SH1.Range(SH1.Cells(i, 2), SH1.Cells(i, 6)).Font.Color = RGB(0, 0, 0) If Cells(i, 2) = "" Then Cells(i, 2) = Maxval Maxval = Maxval + 1 End If Counter = 1 Case Else SH1.Range(SH1.Cells(i, 2), SH1.Cells(i, 6)).Borders(xlEdgeTop).LineStyle = xlLineStyleNone End Select If Cells(i, 2).Value = "" Then Cells(i, 2) = Cells(i - 1, 2).Value Cells(i, 2).Font.Color = RGB(255, 255, 255) End If If Cells(i, 3).Value = "" And Counter <> 1 Then Cells(i, 3) = Cells(i - 1, 3).Value Cells(i, 3).Font.Color = RGB(255, 255, 255) End If If AtoShoriFlg = "ON" Then Cells(i, 7) = Counter Counter = Counter + 1 End If i = i + 1 Loop SH1.Range(SH1.Cells(i, 2), SH1.Cells(i, 6)).Borders(xlEdgeTop).LineStyle = xlContinuous If AtoShoriFlg = "ON" Then SH2.Range("B2:F5").Copy Destination:=SH1.Cells(i, 2) End If End Sub

  • ExcelVBAで実行時エラーが出ます

    このようなマクロを作りました。 Sub WriteCsv() Dim myTxtFile As String, myFNo As Integer Dim myLastRow As Long, i As Long Dim j As Long Dim aaa As Worksheet Set aaa = ActiveSheet Application.ScreenUpdating = False j = 0 myTxtFile = ActiveWorkbook.Path & "\Adress List.txt" Worksheets("List").Activate myLastRow = Range("A4").End(xlDown).Row myFNo = FreeFile Open myTxtFile For Output As #myFNo -----※ For i = 4 To myLastRow If Cells(i, 3) = 1 Then Write #myFNo, Cells(i, 5) j = j + 1 End If Next Close #myFNo   ・・・・   ・・・・ このExcelをフォルダーから実行するとすると、※で[ランタイムエラー52]が発生しますが、デスクトップから実行すると出ません。 どのように修正すればいいんでしょうか? よろしくお願いします。

専門家に質問してみよう