VBAで標準モジュールの変数を引用する方法

このQ&Aのポイント
  • VBAを勉強している方が、標準モジュールで定義した変数を他のプロシージャで利用したい場合、どのようにすれば良いかについて質問しています。
  • また、指定した日付で工程表を作成する際に、イベントプロシージャ(Worksheet_Changeなど)が正しく動作しない問題や、既存の日付を削除する方法についても質問しています。
  • ご教示いただけると助かります。
回答を見る
  • ベストアンサー

vbaで標準モジュールの変数を引用したい

vbaを勉強しています。以下のようなコードを書きました。(長くなってしまい申し訳ありません) ユーザーが指定した日付で工程表を作成したいのですが、イベントプロシージャ?(と呼ぶかどうかよくわからないのですが)がうまく動きません。標準プロシージャのイン尾うっとボックスで取得した日付をイベントプロシージャで使うにはどうしたらよいでしょうか。 また、インプットボックスで日付を指定する際に、既存にある日付を削除してから記述をしたいのですが、どのようにしてよいかわかりませんでした。 ↓標準モジュール Const HIDUKE_ADRS As String = "E2" '日付セル位置 Const MONTH_OFST As Integer = 0 '月の行の位置 Const DAY_OFST As Integer = 1 '日の行の位置 Const WKDAY_OFST As Integer = 2 '曜日の行の位置 Const FIRST_DAY As Integer = 1 '月の変わり目の日 Dim myDate As Date '処理中の日付を表す変数 Dim baseCell '基点セル Dim LC As Long '最終列 Dim LR As Long '最終行 Sub 日付描画() Dim orgDate As Date Dim dstDate As Date orgDate = InputBox("開始年月日を入力してください。例:2012/5/1") dstDate = InputBox("終了年月日を入力してください。例:2013/3/31") Set baseCell = Range(HIDUKE_ADRS) '基点セルを日付にセット  ↓以下の作業をする前に、既に記述されている日付を削除したい。 '----------- 月と日と曜日を描画 ----------- baseCell.Activate '基点セルをアクティブセル化 myDate = orgDate 'myDateを開始年月日にセット Do Until myDate > dstDate '処理中の日が終了年月日に達するまでループを回す With ActiveCell '月の変わり目の日と表の最初の行のみ月を描画 If Day(myDate) = FIRST_DAY Or .Column = baseCell.Column Then .Value = Month(myDate) & "月" '月を入力 .Borders(xlEdgeLeft).Weight = xlThin 'セル左辺に罫線を引く End If .Interior.Color = vbBlue .Offset(DAY_OFST, 0).Value = Day(myDate) '日を入力 .Offset(DAY_OFST, 0).ColumnWidth = 3 .Offset(WKDAY_OFST, 0).Value = WeekdayName(Weekday(myDate), True) '曜日を入力 '日の列~スケジュール欄の列に格子状の罫線を引く Range(.Offset(DAY_OFST, 0), .Offset(WKDAY_OFST, 0)).Borders.Weight = xlThin '日曜のセル背景を黄色にする If Weekday(myDate) = vbSunday Then Range(.Offset(DAY_OFST, 0), .Offset(WKDAY_OFST, 0)) _ .Interior.Color = vbYellow End If myDate = DateAdd("d", 1, myDate) '処理中の日付を1日進める .Offset(0, 1).Activate 'アクティブセルを1行進める End With Loop End Sub ↓イベントプロシージャ(と呼ぶのでしょうか?) Private Sub Worksheet_Change(ByVal target As Range) End Sub Private Sub Worksheet_SelectionChange(ByVal target As Range) ' 工程ライン作成 Dim orgDate As Date Dim myDate As Date '処理中の日付を表す変数 Dim X1 As Single Dim Y1 As Single Dim X2 As Single Dim Y2 As Single Dim kiten As Range Dim Kikan As Long Dim start As Long Dim i As Long Dim LR As Long '最終行 LR = Range("D65536").End(xlUp).Row Set kiten = Range("E4") If target.Column = Range("C:D").Column Then Call 日付描画(orgDate)  ←ここが駄目なようです。。 myDate = orgDate On Error Resume Next For i = 5 To LR ActiveSheet.Shapes("KOUTEILine " & i).Delete Next i For i = 5 To LR start = Cells(i, 3).Value - myDate Kikan = Cells(i, 4).Value - Cells(i, 3).Value X1 = Range(Cells(1, 1), Cells(1, 4 + start)).Width Y1 = Range(Cells(1, 1), Cells(i - 1, 1)).Height + Cells(i, 1).Height / 1.1 X2 = Range(Cells(1, 1), Cells(i, start + 5 + Kikan)).Width Y2 = Y1 With ActiveSheet.Shapes.AddLine(X1, Y1, X2, Y2) .Name = "KOUTEILine " & i .line.EndArrowheadStyle = msoArrowheadTriangle .line.ThemeColor = xlThemeColorAccent1 .line.Weight = 3 End With Next i End If End Sub よろしくお願いいたします。

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

  • ベストアンサー
  • TAKA_R
  • ベストアンサー率32% (26/79)
回答No.5

3です。 以前の回答を自分で読んでいて分かりにくく思ったので、コード全体を貼り付けてみました。 Const HIDUKE_ADRS As String = "E2" '日付セル位置 Const MONTH_OFST As Integer = 0 '月の行の位置 Const DAY_OFST As Integer = 1 '日の行の位置 Const WKDAY_OFST As Integer = 2 '曜日の行の位置 Const FIRST_DAY As Integer = 1 '月の変わり目の日 Dim myDate As Date '処理中の日付を表す変数 Dim baseCell '基点セル Dim LC As Long '最終列 Dim LR As Long '最終行 Sub 日付描画() Dim orgDate As Date Dim dstDate As Date orgDate = InputBox("開始年月日を入力してください。例:2012/5/1") dstDate = InputBox("終了年月日を入力してください。例:2013/3/31") range("e2",cells(4,activesheet.usedrange.column.count)).clear 'ここで日付のテーブルを消します Set baseCell = Range(HIDUKE_ADRS) '基点セルを日付にセット '----------- 月と日と曜日を描画 ----------- baseCell.Activate '基点セルをアクティブセル化 myDate = orgDate 'myDateを開始年月日にセット Do Until myDate > dstDate '処理中の日が終了年月日に達するまでループを回す With ActiveCell '月の変わり目の日と表の最初の行のみ月を描画 If Day(myDate) = FIRST_DAY Or .Column = baseCell.Column Then .Value = Month(myDate) & "月" '月を入力 .Borders(xlEdgeLeft).Weight = xlThin 'セル左辺に罫線を引く End If .Interior.Color = vbBlue .Offset(DAY_OFST, 0).Value = Day(myDate) '日を入力 .Offset(DAY_OFST, 0).ColumnWidth = 3 .Offset(WKDAY_OFST, 0).Value = WeekdayName(Weekday(myDate), True) '曜日を入力 '日の列~スケジュール欄の列に格子状の罫線を引く Range(.Offset(DAY_OFST, 0), .Offset(WKDAY_OFST, 0)).Borders.Weight = xlThin '日曜のセル背景を黄色にする If Weekday(myDate) = vbSunday Then Range(.Offset(DAY_OFST, 0), .Offset(WKDAY_OFST, 0)) _ .Interior.Color = vbYellow End If myDate = DateAdd("d", 1, myDate) '処理中の日付を1日進める .Offset(0, 1).Activate 'アクティブセルを1行進める End With Loop range("e1").value=orgdate 'orgdateをセルに記入 End Sub ↓イベントプロシージャ(と呼ぶのでしょうか?) Private Sub Worksheet_Change(ByVal target As Range)  '_changeで使う ' 工程ライン作成 Dim orgDate As Date Dim myDate As Date '処理中の日付を表す変数 Dim X1 As Single Dim Y1 As Single Dim X2 As Single Dim Y2 As Single Dim kiten As Range Dim Kikan As Long Dim start As Long Dim i As Long Dim LR As Long '最終行 LR = Range("D65536").End(xlUp).Row orgdate=range("e1").value '日付描写()でセルに書き出した日付を読み込む Set kiten = Range("E4") If target.Column = Range("C:D").Column Then   'call~消しました。 myDate = orgDate On Error Resume Next For i = 5 To LR ActiveSheet.Shapes("KOUTEILine " & i).Delete Next i For i = 5 To LR start = Cells(i, 3).Value - myDate Kikan = Cells(i, 4).Value - Cells(i, 3).Value X1 = Range(Cells(1, 1), Cells(1, 4 + start)).Width Y1 = Range(Cells(1, 1), Cells(i - 1, 1)).Height + Cells(i, 1).Height / 1.1 X2 = Range(Cells(1, 1), Cells(i, start + 5 + Kikan)).Width Y2 = Y1 With ActiveSheet.Shapes.AddLine(X1, Y1, X2, Y2) .Name = "KOUTEILine " & i .line.EndArrowheadStyle = msoArrowheadTriangle .line.ThemeColor = xlThemeColorAccent1 .line.Weight = 3 End With Next i End If End Sub

sdyurtio
質問者

お礼

全部記載してくださってありがとうございます わかりにくくなんてないですよ。いつもわかりやすくて、なるほどって思っています。 しかも頑張れとの応援頂いて更に勉強楽しくなりました。ありがとうございます。 おかげさまで思っているように動きました。

その他の回答 (4)

  • TAKA_R
  • ベストアンサー率32% (26/79)
回答No.4

えっとこの間の人です。 お礼のところで >インプットボックスを使わないでどこかのセルに記入してもらい・・・ とありましたが、いえいえインプットボックスはそのまま使ってください。 標準モジュールでインプットボックスで受け取った日付データを適当なセルに書き出して、 使いたいとき(イベントモジュール使用時)にその都度、そのセルを読み出すってことです。 では、頑張って!!

  • TAKA_R
  • ベストアンサー率32% (26/79)
回答No.3

2です。 補足に対する回答をし忘れていたので、書きます。 1の作業をすると、インプットボックスは呼び出されるけれど、イベントプロシージャの続きは実行されなかったと思います。 もしイベントプロシージャの続きを動かしたいなら、(今回はインプットボックスを登場させたくないとのことなのであてはまりませんが)subプロシージャではなくfunctionプロシージャにしないといけません。 さくっと言えば、あるプロシージャからイベントプロシージャに移るには、このfunctionプロシージャを使うしかなく、このfunctionプロシージャは呼び出されて、呼び出された先に計算した結果を返す、そういう働きをします。 そしてこのfunctionプロシージャは「関数」「ユーザー関数」と呼ばれています。 (変数とは少し違うんですね) subプロシージャとの書き方の違いはsub→functionに変える、( )の続きに戻すデータの型を書く、endの1行前に プロシージャ名=戻したい値 がいる、です。

  • TAKA_R
  • ベストアンサー率32% (26/79)
回答No.2

結論からすると、無理です。 というか、メンドイことをいろいろとしないといけません。 が、ダサくて良ければ、とっておきの方法があります。 その前に、前回、削除する方法を言いましたが、下の方が一発でした。 range("e2",cells(4,activesheet.usedrange.column.count)).clear 標準モジュールは単独で使ってください。 ボタンか何かをマクロのスイッチにするとよいと思います。 (また別に、イベントプロシージャを作ってもいいです) 標準モジュールの日付描画( )はまた空欄に戻しておきます。 それから、orgdate を邪魔にならないセルに入れます。 イベントプロシージャはworksheet_changeの方を使ったほうがよいと思います。 (希望の使い方からすると・・。) 次にorgdateを書き出したセルから読み込みます。 それから、call 日付描画() を削除します。 書き込まれた値が気になるようなら、フォントを白にしておくのとか・・・ イベントプロシージャを書き換えると、エクセルを再起動させないと反映されないかもしれません。

sdyurtio
質問者

お礼

すぐご回答頂いているのにお礼が遅くなってしまって申し訳ありません。 全然ださくないです。インプットボックスを使わないで どこかのセルに記入してもらい、そのセルのvalueを使うということですよね? ちょっとやってみているのですが、未熟なためうまく行かなくて。。 もうすこしお時間ください。。(^ ^;) worksheet_changeの使い方もググって出直します! あと、range("e2",cells(4,activesheet.usedrange.column.count)).clear もまだ使えずじまいです。

  • TAKA_R
  • ベストアンサー率32% (26/79)
回答No.1

呼ばれる方(標準モジュール側)に引数が書かれていないので、動かないのだと思います。 Sub 日付描画(orgdate)で呼び出せます。 >また、インプットボックスで日付を指定する際に、既存にある日付を削除してから記述をしたいのですが、どのようにしてよいかわかりませんでした >↓以下の作業をする前に、既に記述されている日付を削除したい。 1アイテムずつ(セル値、背景、罫線)消してもよいかと思いますが、削除-挿入というのも1つの手だとは思います。

sdyurtio
質問者

お礼

さっそくのご回答ありがとうございます。 動いてくれました。でも私の認識があやまっていたようです。 sub()の()はプロシージャそのものを変数にしてしまうものなのでしょうか。 標準モジュールの日付描画プロシージャで使用しているインプットボックスはあくまで工程表上部の日付書き換え用で、 C・D列にはそれぞれの工程項目の開始日と終了日をセルにユーザーが入力します。 CとDの値が変更されれば矢印を変形させるイベントプロシージャを書いたのですが、 今回のコードではC列の値を変更するとインプットボックスから始まって動いてしまいます。 本当は開始日のorgDateの値だけ取り出し、上部にある日付が変更されても矢印の開始点を自動修正できるようにしたかったのですが、 可能でしょうか。 説明長くなってしまってすみません。

関連するQ&A

  • vbaでオートシェイプを変形させたい

    今月入ってVBAの勉強を始めた者です。 勉強にと、webで見つけた工程表のコードを読みながら作りたいモノへ改良しようとおもったのですがうまく行きません。 C列:開始日 D列:終了日 E2~月 E3~日 E4~曜日 E5~オートシェイプ描画欄 開始日と終了日を入力すると矢印が作成・変更される。 という仕様になっていますが、1日からの開始だと矢印が2日多く先まで矢印が引かれてしまい、終了日がズレてしまいます。2日以降の開始日であればズレないのですが、どこを直したらよいでしょうか。  また、表の最終列が変化するのですが、ForNext関数を使用する際、その変化に対応させたいのですがどのようにしたらよいでしょう。 コードは下記の様です。宜しくお願い致します。 Private Sub Worksheet_SelectionChange(ByVal target As Range) ' 工程ライン作成 Const ORG_DATE As Date = #4/1/2012# '開始年月日 Dim myDate As Date '処理中の日付を表す変数 Dim X1 As Single Dim Y1 As Single Dim X2 As Single Dim Y2 As Single Dim kiten As Range Dim Kikan As Long Dim Start As Long Dim i As Long If target.Column = Range("C:D").Column Then myDate = ORG_DATE On Error Resume Next For i = 5 To 30 ActiveSheet.Shapes("KOUTEIline " & i).Delete Next i For i = 5 To 30 Start = Cells(i, 3).Value - myDate Kikan = Cells(i, 4).Value - Cells(i, 3).Value X1 = Range(Cells(1, 1), Cells(1, 4 + Start)).Width Y1 = Range(Cells(1, 1), Cells(i - 1, 1)).Height + Cells(i, 1).Height / 2 X2 = X1 + Range(Cells(i, 4 + Start), Cells(i, Start + 4 + Kikan)).Width Y2 = Y1 With ActiveSheet.Shapes.AddLine(X1, Y1, X2, Y2) .Name = "KOUTEIline " & i .Line.EndArrowheadStyle = msoArrowheadTriangle .Line.Interior.Color = vbRed .Line.Weight = 4 End With Next i End If End Sub

  • 空白セルと0値を識別させたい。(VBA)

    すみません、誰か教えていただけますか。 シートの53、54、55行目にそれぞれ値入っています。 それを3行目にビジュアル的に表現させています。 55行目はセルの色で、53行目は数値があり同じ値が 続く部分の合計を出しています。 しかし、下記の記述ですと数値が0(変数D=0)の時に うまくいきません。空白セルと認識されてしまうと思います。 何か、良い方法があれば教えて頂けませんでしょうか。 宜しくお願いします。 Sub 表示() Dim a As Long Dim c As Long Dim D As Long Dim e As String Dim f As String c = 3 For a = 3 To 64 With Worksheets("Sheet1") If .Cells(53, a) <> .Cells(53, a + 1) Then .Range(.Cells(53, c), .Cells(53, a)).Select D = WorksheetFunction.Sum(Selection) e = D f = Selection(1).Offset(1, 0).Value G = Selection(1).Offset(2, 0).Value If D <> 0 Then Selection(1).Offset(-50, 0).Value = f + "//" + e .Range(.Cells(53, c), .Cells(53, a)).Offset(-50, 0).Select Selection.Interior.ColorIndex = G End If If Selection(1).Value = "" Then .Range(.Cells(53, c), .Cells(53, a)).Offset(-50, 0).Select Selection.ClearContents Selection.Interior.ColorIndex = xlNone End If c = a + 1 End If End With Next End Sub

  • Excel  VBAのマクロについて

    以下のようなマクロを作りました。 P4に開始番号P6に終わりの番号があるのですが、P4=P6、つまり、一つだけのシートを作成する分には問題なく動きます。しかしP4に1、P6に5と範囲を増やすとエラーが出て動きません。どこをなおしたらよろしいでしょうか? Option Explicit Sub 一括() Dim I As Worksheet Dim SheetName As String Dim Prompt As String Dim Col As Integer Dim Cell As Range Dim Row As Long Dim hani As Long For hani = Range("P4").Value To Range("P6").Value Set I = ActiveSheet SheetName = Cells(hani + 4, "K").Value & "(" & Cells(hani + 4, "B") & ")" Prompt = SheetName & "が存在します。" Sheets("基本シート").Copy After:=Sheets("基本シート") On Error GoTo 100 ActiveSheet.Name = SheetName On Error GoTo 0 Range("X3") = I.Cells(hani + 4, "B") Range("E8") = I.Cells(hani + 4, "C") Range("A13") = I.Cells(hani + 4, "D") For Col = 0 To 8 Step 4 Set Cell = I.Cells(hani + 4, "D").Offset(, Col) If Cell > 0 Then Prompt = "該当する日付がありません。" & Cell.Address On Error GoTo 100 Row = WorksheetFunction.Match(Cell, [A:A], 0) On Error GoTo 0 Cells(Row, "E") = I.Cells(hani + 4, "E").Offset(, Col) Cells(Row, "H") = I.Cells(hani + 4, "F").Offset(, Col) If Col < 8 Then Cells(Row, "Y") = I.Cells(hani + 4, "G").Offset(, Col) End If End If Next Col Next hani End 100 If Err <> 1004 Then Error Err End End If MsgBox Prompt, vbCritical Application.DisplayAlerts = False ActiveSheet.Delete Application.DisplayAlerts = True Sheets(1).Select End Sub

  • ExcelのVBAで質問です。

    以下のようなシートがあります。 A列  B列  C列  D列  E列  F列  G列  H列 NO  名前  確認 日付1 日付2  確認 日付1 日付2 6行目からデータを入れる予定です。 C列には○印を入力します。 C列~E列までデータが入った行は、 F列~H列まで同じ処理をします。 (セルの背景色を変えます。) 以後同じことを列方向で繰り返します。 以下のようなVBAを組みましたが、 ○の個数を数える部分でエラーがでます。 Private Sub Worksheet_Change(ByVal Target As Range) Dim staff As String Dim kakunin As String Dim date1 As Date Dim date2 As Date Dim i As Long Dim j As Long Dim cnt As Long '100件分ループ For i = 6 To 105 '○の数をカウント cnt = WorksheetFunction.CountIf(ActiveSheet.Range(Cells(i, 2), Cells(i, 256)), "○") 'jとは確認の列番号のこと j = 3 * cnt staff = Cells(i, 2) kakunin = Cells(i, j) date1 = Cells(i, j + 1) date2 = Cells(i, j + 2) 'スタッフ名が入力されたら If staff = "" Then Range(Cells(i, j), Cells(i, j + 50)).Interior.ColorIndex = 15 Else Cells(i, j).Interior.ColorIndex = xlNone '○が入力されたら If kakunin = "○" Then Range(Cells(i, j + 1), Cells(i, j + 2)).Interior.ColorIndex = xlNone Else Range(Cells(i, j + 1), Cells(i, j + 2)).Interior.ColorIndex = 15 End If If Cells(i, j + 1) <> "" And Cells(i, j + 2) <> "" Then Cells(i, j + 3).Interior.ColorIndex = xlNone End If End If Next i End Sub ご教授いただけたら、幸いです。 よろしくお願いいたします。

  • VBAの処理を軽くしたい

    各行ごとに5回セルを参照した結果を吐き出すプログラムを作成しています。 200行前後の処理が必要なのですが、現在のコードではあまりにも処理が重くなっています。 とにかく処理を軽くしたいのですが、どのような方法が考えられるでしょうか? 初心者なのでコードも含めてご教示頂けたら幸いです。 Sub test(b, c, d) Dim i1, i2 As Long Dim A1 As String  For i1=0 To Cells(Rows.Count, 1).End(xlUp).Row For i2 = 0 To 5 If Range(b).offset(i1, i2).Value = "x1" Or Range(c).offset(i1, i2).Value = "x1" Then A1 = "XXX" ElseIf Range(b).offset(i1, i2).Value = Range(c).offset(i1, i2).Value Then A1 = "YYY" Else A1 = "ZZZ" End If Range(d).offset(i1, i2).Value = A1 Next i2 Next i1 End Sub

  • 日付が同じなら削除

    すみません、誰か教えて頂けませんでしょうか。 A列に日付と時間が記入されているのですが、日付だけを比較して 同じなら削除したいのですが、誰かご教授頂けませんでしょうか。 A列 2013/8/14 8:00 2013/8/14 8:15 2013/8/14 10:00 2013/8/15 8:00 2013/8/16 8:00 2013/8/17 8:00 2013/8/17 20:00 2013/8/18 8:00 2013/8/18 9:00 A列 2013/8/14 8:00 2013/8/15 8:00 2013/8/16 8:00 2013/8/17 8:00 2013/8/18 8:00 Sub 削除 () Dim r As Long Dim y As Long r = Cells(Rows.Count,1).End(xlUp).Row For y = r To 1 Step -1 If Cells(y,1).Value = Cells(y,1).Offset(1,0) Then 'この比較がわかりません。 Cells(y,1).Offset(1,0).Delete(xlUp) End If Next y End Sub すみませんが、宜しくお願いします。

  • VBAの変数の定義について

    いつもお世話になっております。 VBAでの変数の定義についてお尋ねします。 VBAの勉強を始めたばかりの超初心者です。 I.チェック:A列とC列の和をE列に記載してその正誤を判定。 II.リセット:E列をクリアし、A列、C列の数字をランダムに置き換える。 という練習問題のコードを私が書いたものです。 以下について質問させていただきます。 (1)下記はモジュールレベルでの変数の宣言になると思いますが、変数の定義?例えば、最終値 = Range("A4").End(xlDown).Rowはそれぞれのプロシージャで定義しなければならないのでしょうか? (2)モジュールレベルでの変数の宣言は,Dimではなく、Privateでやるべきなのでしょうか? (3)何か指摘事項があれば、教えてください。 超初歩的な質問で、申し訳ありませんが、よろしくお願いいたします。 Option Explicit Dim i As Integer '処理用カウンタ変数 Const 初期値 As Integer = 4 '表の最初 行 Dim 最終値 As Integer '表の最終 行 Sub チェック() 最終値 = Range("A4").End(xlDown).Row '表の最終行番号を取得 For i = 初期値 To 最終値 Step 1 If Cells(i, 1).Value + Cells(i, 3).Value = Cells(i, 5).Value Then 'A列+B列 Cells(i, 5).Font.Color = vbBlue '回答が正ならフォントを青 Else Cells(i, 5).Font.Color = vbRed '回答が誤ならフォントを赤 End If Next i End Sub Sub リセット() 最終値 = Range("A4").End(xlDown).Row '表の最終行番号を取得 For i = 初期値 To 最終値 Step 1 Cells(i, 5).ClearContents '回答をクリア Cells(i, 5).Font.Color = vbBlack '回答のフォントを黒 Cells(i, 1).Value = Int(Rnd * 100) 'A列にランダムな数値 Cells(i, 3).Value = Int(Rnd * 100) 'C列にランダムな数値 Next i End Sub

  • セルの値から任意の文字のみを抽出する

    こんにちは。 VBA勉強中です。 どうしても詰まってしまったので力を貸してください。・゜・(ノД`)・゜・。 Sheet1にはA列~J列にデータが入っています(行数は3行目~□行目・・・都度変わります) Sheet2には抽出したい文字の一覧(仮に禁止ワードとします)がB列5行目~○行目まで入ってます。 質問としてはSheet1のB列、D列、F列のそれぞれの値より禁止ワードを抽出する。 1つのセルに禁止ワードが0~最大5つ入っている時にK列から→方向に禁止ワードを並べて行くといった 感じです。 わかりにくくてすみませんが宜しくお願い致します。 以下自分で考えてみたコードです。。 これだと始めのB列のみ抽出に成功しましたがその他の列からは抽出できず・・・。゜(PД`q。)゜。 列Bで使用したコードをD列、F列にも使えると下に数値のみ変えて羅列しただけだからでしょうか;w; 本当に初心者ですみません。。 以下コードです。 Sub 禁止ワード抽出() Dim SR As Integer , LR As Integer, SR2 As Integer , LR2 As Integer , LR3 As Integer , LR4 As Integer Dim i As Long , j As Long , k As Long , m As Long Dim KINSHI As Variant SR = 3 SR2 =5 LR = Sheets("Sheet1").Range("B" Rows.Count).End(xlUp).Row LR2 = Sheets("Sheet1").Range("D" Rows.Count).End(xlUp).Row LR3 = Sheets("Sheet1").Range("F" Rows.Count).End(xlUp).Row LR4 = Sheets("Sheet2").Range("B" Rows.Count).End(xlUp).Row For j = SR2 To LR4 KINSHI = Sheets("Sheet2").Cells(j , 2).Value For i = SR To LR If Sheets(Sheet1).Cells(i , 2).Value Like ("*" & KINSHI & "*") Then If Cells(i , 10) = "" Then Cells(i , 10) = KINSHI Else   If Cells(i , 10 + 1) = "" Then Cells(i , 10 + 1) = KINSHI            Else   If Cells(i , 10 + 2) = "" Then Cells(i , 10 + 2) = KINSHI Else   If Cells(i , 10 + 3) = "" Then Cells(i , 10 + 3) = KINSHI Else   If Cells(i , 10 + 4) = "" Then Cells(i , 10 + 4) = KINSHI End If End If End If End If End If End If Next i , j 以下上記コードをD列、F列バージョンで並べています・・・・ End Sub 恐らくOffsetプロパティを使う方がいいと思いましたが中々うまくいかず 自分なりに色々考えてみてこんな残念な結果になってしまいましたが 皆様のお力添えどうぞ宜しくお願い致します。

  • EXCEL2010エラーVBA

    下記を実行するとエラーになりEXCEL2010が終了してしまいます。 fDebug:0 offset00009391 がエラーメッセージです。 何が原因でしょうか。 Private Sub Worksheet_Change(ByVal Target As Range) Dim ws As Worksheet Dim rg As Range Dim r As Variant Dim c As Long Dim hanni1 As Range Dim atai As Range Set ws = Worksheets("あああ") Set rg = Worksheets("コード").Range("A1:B10") r = ws.Cells(Rows.Count, 1).End(xlUp).Row Set hanni1 = ws.Range(Cells(2, 2), Cells(r, 3)) Set atai = ws.Range(Cells(2, 3), Cells(r, 3)) atai = Application.VLookup(hanni1, rg, 2, False) End Sub

  • VBAのコードに関する質問です。

    以下のコードで実行しているのですが上手くデータ数のカウンタが上手くいきません。助言をお願いしたいです。 Range("D2").Select ActiveCell.Formula = "=0.001*C2+D1" Range("D2").Select Selection.AutoFill Destination:=Range("D2:D" & fin), Type:=xlFillDefault Range("D2:D" & fin).Select Dim i As Long, j As Long, flg As Boolean Dim i1 As Long j = 1 For i = 2 To Cells(Rows.count, 2).End(xlUp).Row If Cells(i, 2) = 2 Then flg = True ElseIf Cells(i, 2) = 3 And flg = True Then i1 = i Cells(1, 7) = i - 1 Cells(j, 5) = Cells(i, 4) Cells(j, 6) = Cells(i - 1, 4) flg = False Exit For Else: flg = False End If Next For i = i To Cells(Rows.count, 2).End(xlUp).Row If Cells(i, 2) = 2 Then flg = True ElseIf Cells(i, 2) = 3 And flg = True Then j = j + 1 Cells(j, 7) = i - i1 - 2 i1 = i Cells(j, 5) = Cells(i, 4) Cells(j, 6) = Cells(i - 1, 4) flg = False Else: flg = False End If Next Range("E1").Select Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove Cells(1, 5) = Cells(2, 4) Cells(Rows.count, 6).End(xlUp).Offset(1).Value = _ Cells(Rows.count, 4).End(xlUp).Value Cells(Rows.count, 7).End(xlUp).Offset(1).Value = 200 Range("H1").Select ActiveCell.Formula = "=(F1-E1)/G1" Range("H1").Select Selection.AutoFill Destination:=Range("H1:H16"), Type:=xlFillDefault Range("H1:H16").Select Range("E1").Select Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove Range("F1").Select Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove Range("G1").Select Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove Range("H1").Select Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove Dim rowStr As Long, rowEnd As Long Dim A, D, Da, H, K '演算:K=D-Da-H*A Dim cntS As Integer, cntA As Integer Dim cntD As Integer, cntH As Integer Dim r As Long, t As Long rowStr = 2 '開始行 rowEnd = Cells(Rows.count, 7).End(xlUp).Row 'G列で最終行を求める cntS = 1 '周期初期値 cntD = rowStr 'D列行数初期値 cntH = rowStr 'H列行数初期値 For r = rowStr To rowEnd cntA = rowStr For t = 1 To Cells(r, 7) '各周期の繰り返し処理 A = Cells(cntA, 1).Value D = Cells(cntD, 4).Value If t = 1 Then If r = rowStr Then Da = 0 '1周期目は0とする Else '2週期目以降は最初の値に固定 Da = Cells(cntD, 4).Value End If '周期の区切りをF列に出力 Cells(cntD, 11).Value = cntS & "周期" End If H = Cells(cntH, 8).Value K = D - Da - H * A '演算 Cells(cntD, 10).Value = K cntA = cntA + 1 'A列カウンタ更新 cntD = cntD + 1 'D列カウンタ更新 Next t cntS = cntS + 1 '周期カウンタ更新 cntH = cntH + 1 'H列カウンタ更新 Next r

専門家に質問してみよう