• 締切済み

配列内の要素が空だった場合、空要素を削除したい。

お世話になります。 どなたかお助けください。 B7:B11のセルの値で、空ではないものをGlNaviA()に格納して いき、GlNaviAのUboundを動的に変更しております。 ここで格納された空以外の要素をSub GlNaviに渡しているのですが、 正しく値が渡せていないみたいで、エラーになってしまいます…。 どこかおかしいとこはあるでしょうか。 プログラムは初心者レベルです…。 Option Explicit Private GlNaviA() As Variant Public cnt As Integer Public Sub ABC() 省略… cnt = 0 For i = 0 To 4 If SH2.Range("B" & i + 7).Value <> "" Then ReDim Preserve GlNaviA(cnt) GlNaviA(cnt) = SH2.Range("B" & i + 7).Value cnt = cnt + 1 End If Next i   MsgBox GlNaviA(cnt) 省略… End Sub Public Sub GlNavi(ByVal f As TextFile) If UBound(GlNaviA) = 4 Then f.TextWriteLine GlNaviA(0) f.TextWriteLine GlNaviA(1) f.TextWriteLine GlNaviA(2) f.TextWriteLine GlNaviA(3) f.TextWriteLine GlNaviA(4) ElseIf UBound(GlNaviA) = 3 Then f.TextWriteLine GlNaviA(0) f.TextWriteLine GlNaviA(1) f.TextWriteLine GlNaviA(2) f.TextWriteLine GlNaviA(3) ElseIf UBound(GlNaviA) = 2 Then f.TextWriteLine GlNaviA(0) f.TextWriteLine GlNaviA(1) f.TextWriteLine GlNaviA(2) ElseIf UBound(GlNaviA) = 1 Then f.TextWriteLine GlNaviA(0) f.TextWriteLine GlNaviA(1) Else f.TextWriteLine GlNaviA(0) End If End Sub

みんなの回答

  • korin_
  • ベストアンサー率69% (46/66)
回答No.7

こんにちは。#6です。 多分、私が提示したソース以外の部分で何かしていると思います。 こちらでは、空でない要素が2以下になっても正常に動作しています。 具体的にどこでどんなエラーになるのかを教えていただいた方が解決に近づくと思います。

miyumi20
質問者

お礼

korin_様 回答ありがとうございます! 先ほど教えていただいた内容でばっちりあってました!! エラーが出たのは、私の凡ミスですorz Public Sub GlNavi(ByVal f As TextFile) If UBound(GlNaviA) = 4 Then  省略 ElseIf UBound(GlNaviA) = 1 Then f.TextWriteLine GlNaviA(0) f.TextWriteLine GlNaviA(2) ←これ…でしたorz End Sub すっきり片付きました! 本当にありがとうございました!

  • korin_
  • ベストアンサー率69% (46/66)
回答No.6

何度もすみません。 質問者さんの最初のソースに初期化処理を入れる方が簡潔で良いかもしれません。こんな感じで。 cnt = 0 ReDim GlNaviA(0) For i = 0 To 4 If SH2.Range("B" & i + 7).Value <> "" Then ReDim Preserve GlNaviA(cnt) GlNaviA(cnt) = SH2.Range("B" & i + 7).Value cnt = cnt + 1 End If Next i

miyumi20
質問者

補足

korin_様 回答ありがとうございます。 こちらこそ何度もすいませんorz 上記を試したところ、空では無い要素が3つ以上ある場合は、エラーが なく上手く動作します! ただし、空では無い要素が2以下になった場合に、エラーが発生してしまいます…。

  • AKARI0418
  • ベストアンサー率67% (112/166)
回答No.5

すいませんひとつ間違いがあったため訂正します。 redim GlNaviA(cnt) ではなく redim GlNaviA(cnt-1) でした。 私の環境ではうまく動きました、MsgBox UBound(GlNaviA)では要素-1の値をとることができました。 ほかに考えられるとすると、セルにスペースが入ってしまっていればうまくいかないと思います。Trim(SH2.Range("B" & i + 7).Value)と記述するとスペースをトリミングしてくれるので、試してみてください。 下記がソースです。 For i = 0 To 4 If Trim(SH2.Range("B" & i + 7).Value) <> "" Then cnt = cnt + 1 End If Next i ReDim GlNaviA(cnt-1) cnt = 0 For i = 0 To 4 If Trim(SH2.Range("B" & i + 7).Value) <> "" Then GlNaviA(cnt) = Trim(SH2.Range("B" & i + 7).Value) cnt = cnt + 1 End If Next i

miyumi20
質問者

お礼

AKARI0418 様 今回の件、無事解決することができました。 最後までお付き合いいただきありがとうございました!!

miyumi20
質問者

補足

AKARI0418様 回答ありがとうございます。 上限は4まで、下限0までの間で動的に変化させたいのですが 上記を試したところ Ubound(GlNaviA)で7を返してきます…。 質問させていただいてる箇所以外が問題なんですかねorz

  • korin_
  • ベストアンサー率69% (46/66)
回答No.4

こんにちは。 > MsgBox Ubound(GlNaviA)で確認すると4となり、 > Public Sub GlNavi(ByVal f As TextFile)で > 必要ない行まで書き出されてしまいます…。 一番最初に cnt = 0 と初期化するのを忘れていませんか? ちなみに#1さんの提示されたコードでは > ReDim Preserve GlNaviA(cnt) となっていますが、このタイミングでは初期化するだなので > ReDim GlNaviA(cnt) の方が良いです。 配列にセットしたデータを記憶したまま、新しく要素を追加する場合のみ ReDim Preserve を使用してください。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.3

エクセルVBAの問題で、(VBからでなく)エクセルから実行できればよいのですよね。 質問の路線にこたえてないのですが、 空白セルを除いて捉えるなら Sub test01() Dim cl For Each cl In Range("a1:A10") If Intersect(cl, Range("a1:A10").SpecialCells(xlCellTypeBlanks)) Is Nothing Then MsgBox cl 'ここで必要な処理をする End If Next End Sub またはMsgboxのところで配列にすれば、あるいは各セルについて 単純に空白かどうか聞いて配列データ化すればよいように思いますが、全体でやりたいこととの関連でこれでは役立たないですか。

miyumi20
質問者

補足

imogasi様 回答ありがとうございます。 >Sub test01() >Dim cl >For Each cl In Range("a1:A10") >If Intersect(cl, >Range("a1:A10").SpecialCells(xlCellTypeBlanks)) Is Nothing >Then >MsgBox cl 'ここで必要な処理をする >End If >Next >End Sub 上記を試したところ、空白以外の要素をMsgBoxにて確認することが できましたが、Public Sub GlNaviへclのUboundを渡せておらず、 値の書き出しもできません…。 >Msgboxのところで配列にすれば これはまだ、cl= Array(空白以外の要素)になっていない ということでしょうか。 配列化するということは、 Sub test01() Dim cl Dim GlNaviA As Variant ReDim GlNaviA(0) For Each cl In Range("a1:A10") If Intersect(cl, Range("a1:A10").SpecialCells(xlCellTypeBlanks)) Is Nothing Then For i = 0 To Ubound(cl) GlNaviA(i) = cl(i) ReDim GlNaviA(i) Next i End If Next End Sub でいいのでしょうか。

  • korin_
  • ベストアンサー率69% (46/66)
回答No.2

こんにちは。 おそらく、ReDim Preserve が行われなかった(追加する要素が1つもなかった)場合にエラーが起きてますよね? 配列は、長さを指定せずに宣言した場合には長さが未定義の状態です。 その状態でUBoundやLBoundを行うと、エラーとなります。 GlNaviA()を定義した後に、 GlNaviA() = Split(vbNullString, vbNullChar) を追加すれば、長さ0の配列を作成した扱いになり、エラーはおきないと思います。

miyumi20
質問者

補足

korin_様 回答ありがとうございます。 Option Explicit Private GlNaviA() As Variant Public cnt As Integer Public Sub ABC() GlNaviA() = Split(vbNullString, vbNullChar) 省略… cnt = 0 For i = 0 To 4 If SH2.Range("B" & i + 7).Value <> "" Then ReDim Preserve GlNaviA(cnt) GlNaviA(cnt) = SH2.Range("B" & i + 7).Value cnt = cnt + 1 End If Next i MsgBox GlNaviA(cnt) 省略… End Sub 上記で実行してみたのですが、やはり値を正しく渡すことが できません。 >配列は、長さを指定せずに宣言した場合には長さが未定義の状態です。 >その状態でUBoundやLBoundを行うと、エラーとなります。 大変参考になります。ありがとうございます。

  • AKARI0418
  • ベストアンサー率67% (112/166)
回答No.1

ReDim Preserve GlNaviA(cnt)のタイミングが問題だと思います。 Redimをおこなうと、その要素の初期化を行います、そのためこのプログラムだと、最後にRedimを行った、i=4の場合の値のみが格納されていることになります。 たとえばですが、以下のように修正すれば、上記の問題は解決できます。 For i = 0 To 4 If SH2.Range("B" & i + 7).Value <> "" Then cnt = cnt + 1 End If Next i ReDim Preserve GlNaviA(cnt) cnt = 0 For i = 0 To 4 If SH2.Range("B" & i + 7).Value <> "" Then GlNaviA(cnt) = SH2.Range("B" & i + 7).Value cnt = cnt + 1 End If Next i

miyumi20
質問者

補足

AKARI0418様 回答ありがとうございます。 >For i = 0 To 4 >If SH2.Range("B" & i + 7).Value <> "" Then >cnt = cnt + 1 >End If >Next i >ReDim Preserve GlNaviA(cnt) >cnt = 0 >For i = 0 To 4 >If SH2.Range("B" & i + 7).Value <> "" Then >GlNaviA(cnt) = SH2.Range("B" & i + 7).Value >cnt = cnt + 1 >End If >Next i 上記を試してみたところ、空では無い要素のみを 渡すことに成功しました。 しかし、 MsgBox Ubound(GlNaviA)で確認すると4となり、 Public Sub GlNavi(ByVal f As TextFile)で 必要ない行まで書き出されてしまいます…。 現在、セルの値は下記のようになっています。 B7 コンテンツ1 B8 B9 コンテンツ2 B10 B11 格納される値は、下記のようにしたいです。 GlNavi = Array("コンテンツ1",コンテンツ2) まだ他に直すべき箇所はありますでしょうかorz

関連するQ&A

  • 最終行がわからない場合

    エクセルです。 ・最終行は毎回違ってくるので Cells(Rows.Count, "A").End(xlUp).Row で取得したいです。 ・今は最終行が51行という前提で作業をしています。 ・1行目にはタイトルが入っています。 ・2行目以降には文字が入っています。  今回はテストのため数字を入れました。 最終行が51の場合は ************************************************ Sub test1() Dim i As Long Dim cnt As Long For i = 1 To 10 Call test2 Next End Sub -------------------- Sub test2() Dim str As String If cnt = 0 Or cnt = 42 Then cnt = 2 ElseIf cnt = 2 Then cnt = cnt + 10 ElseIf cnt = 12 Then cnt = cnt + 10 ElseIf cnt = 22 Then cnt = cnt + 10 ElseIf cnt = 32 Then cnt = cnt + 10 End If With Sheets("Sheet1") For myRow = cnt To cnt + 9 str = str & "," & .Cells(myRow, 1) Next myRow End With Debug.Print str End Sub ************************************************ このような方法で、str に10個ずつセルの値を格納できるのですが 最終行が不明の場合はどうすればいいのでしょうか? イミディエイトウインドウに表示される値は ,1,2,3,4,5,6,7,8,9,10 ,11,12,13,14,15,16,17,18,19,20 ,21,22,23,24,25,26,27,28,29,30 ,31,32,33,34,35,36,37,38,39,40 ,41,42,43,44,45,46,47,48,49,50 ,1,2,3,4,5,6,7,8,9,10 ,11,12,13,14,15,16,17,18,19,20 ,21,22,23,24,25,26,27,28,29,30 ,31,32,33,34,35,36,37,38,39,40 ,41,42,43,44,45,46,47,48,49,50 です。 最終行まで来たらまた2行目から取得しなおします。 なのでIf cnt = 0 Or cnt = 42 Thenにしました。 最終行が60だったり65だったりした場合は、strに10個格納できないですが、少ない分には問題ないです。 これで、最終行が100でも200でも対応できるコードを作りたいのですが わかりません。 お知恵を拝借願います。

  • 配列にて格納したデータの出力

    txtファイルで取り込んだ2行にまたがっている数値・英文字・ひらがななどを1行ずつ配列として格納した後に、数値だけのtxtファイルとそれ以外のtxtファイルを別々に作成し、保存するプログラムを組みたいのですがよく分かりません。 ちなみに、使っているOSとAPはWinXP、Excel2003です。 InputData.txtの内容 A34bFg7p0 あ 1ylut890 B45LK4L え Number.txtの完成形 34701890 454 String.txtの完成形 AbFgp あ ylut BLKL え '変数の宣言 Dim myFile, myText, myList(), myList2(), str, B, C As String Dim XX As Integer Dim myFunc As Boolean Dim cnt, i As Long On Error GoTo myError myFile = Dir("InputDama.txt") 'ファイルの読み込み If myFile = "InputDama.txt" Then Open myFile For Input As #1 Do While Not EOF(1) Line Input #1, myText If myText <> "" Then If cnt = 0 Then ReDim myList(cnt), myList2(cnt) Else ReDim Preserve myList(UBound(myList) + 1), myList2(UBound(myList2) + 1) End If '数字・文字列の分類 CC = Len(myText) For XX = 1 To CC str = Mid(myText, XX, 1) If IsNumeric(str) = True Then '←数字かどうかはIsNumericで判断 B = B & str Else C = C & str End If Next myList(cnt) = B myList2(cnt) = C cnt = cnt + 1 End If Loop '書き込みファイルの作成 Open "Number.txt" For Output As #2 Open "String.txt" For Output As #3 For cnt = 0 To UBound(myList) Print #2, myList(cnt) Next cnt For cnt = 0 To UBound(myList2) Print #3, myList2(cnt) Next cnt Close #1, #2, #3 End Sub これだと、2行目に1行目で格納したデータが最後出てしまうので、それを取り除きたいのですが、効果的な方法が分かりませんので、宜しくお願いします。

  • エクセル ダブルクリックで処理日の入力

    お世話になります。 先般、お教え頂きました別のダブルクリックイベントプロシージャと 下記の当日の日付を入力するという処理を同じシート上で行いたいのですが、VBエディターにどのように記述したら良いかわかりません。 当方、かなりの初心者です。 よろしくご教授くださいませ。 【新しく加えたい処理】 Option Explicit Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Intersect(Target, Range("b4:C999")) Is Nothing Then Exit Sub If ActiveCell = "" Then ActiveCell = Date Cancel = True End If End Sub 【もともと使っている処理】 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Not Intersect(Target, Range("h1:h999")) Is Nothing Then With Target If .Value = "" Then .Value = "有" ElseIf .Value = "有" Then .Value = "無" ElseIf .Value = "無" Then .Value = "" End If End With ElseIf Not Intersect(Target, Range("i1:i999")) Is Nothing Then With Target If .Value = "" Then .Value = "要" ElseIf .Value = "要" Then .Value = "不要" ElseIf .Value = "不要" Then .Value = "" End If End With End If End Sub よろしくお願いします。

  • 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 配列について

    配列の使い方について教えてください 1つの配列をどんどん追加したりしたいので1つの mybox で追加していきたいと思っています。 (下記コードが実現できればと思います。) (1)配列を広げ追加したい (2)繰返しを使わず一気に書き込みたい (3)一部をクリアしたりしたい のですがよろしくお願いします。 Sub Macro1() Range("A1").Value = "A" Range("A2").Value = "B" Range("A3").Value = "A" o = Range("A1").End(xlDown).Row mybox = Range(Cells(1, 1), Cells(o, 1)).Value 'myBox(1,1)=A 'myBox(2,1)=B 'myBox(3,1)=A ←このような表示になります。 '------------------------------------------------- '(1)配列を広げ追加したい ReDim Preserve mybox(o, 2) For i = 1 To UBound(mybox) If mybox(i, 1) = A Then mybox(i, 2) = 0 Else mybox(i, 2) = 1 End If Next i '------------------------------------------------- '(2)(1)をC列に「myBox(?,2)を「繰返しを使わず一気に」書き込みたい 'Transposeは限界(65536個)を超えるので使えません。 Range(Cells(1, 3), Cells(UBound(mybox), 3)) = mybox '(3)配列myBox(?,1)は残したままmyBox(?,2)はクリアにしたい End Sub

  • EXCEL2002 VBAのループ処理について

    セルB1~B24に入力した数字を i とすると、 コマンドボタンを押したときに、セルB1~B24にの全てに値が入力されていて、 セル( F & i )が空白であれば、そこにセルA1の値を入れるようなマクロを作成しています。 セル( F & i )への入力は、セルB1~B24の全部に数値が入力されており、セル( F & i )が空白があるときのみ処理が実行されるように。どちらかが満たされない場合には、メッセージボックスを表示し、処理しないようにしたいのですが、どうしても途中まで入力されてしまいます。 以下のようなコードですが、何か良い方法はないでしょうか? Private Sub CommandButton1_Click() 'ロール確認 Dim 入力 As String, パレット As String Dim i As Long, t As Long For i = 1 To 24 入力 = Range("B" & i) パレット = Range("F" & i) If 入力 = "" Then MsgBox "aaa" Exit For End If 'パレットNo.転記 If パレット <> "" Then MsgBox "bbb" Exit For ElseIf パレット = "" Then Range("F" & 入力).Value = Range("A1").Value End If Next i End Sub

  • 表計算

    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

  • マクロで質問します。

    初心者です。 下記のようなマクロの式があるのですが、条件を一つ増やしたいのですが、 イロイロ試してみたのですが、うまくゆきませんので教えてください! Sub 給与支払一覧() Application.ScreenUpdating = False Dim Sh As Worksheet For Each Sh In Worksheets If Sh.Name <> "給与支払一覧" And Sh.Name Like "Sheet*" Then With Worksheets("給与支払一覧") If Sh.Range("D14").Value > 0 Then With .Cells(.Rows.Count, 1).End(xlUp).Offset(1) Sh.Range("O2:X14").Copy .Cells(1) .Resize(13, 10).Value = Sh.Range("O2:X14").Value End With End If End With End If Next Sh Set Sh = Nothing End Sub この中で If Sh.Range("D14").Value > 0 Then とありますが、 同じ条件で I14も 0より大きいな時としたいのですが、 うまくゆきませんでした。 たぶん基本できな簡単な事と思いますが 分かりません。 If Sh.Range("D14").Value > 0 Then If Sh.Range("I14").Value > 0 Then 並べてみたり If Sh.Range("D14、I14").Value > 0 Then こんなのや If Sh.Range("D14、I14").).Value > 0 Then このような事も 他にも笑われるようなことも・・・・・ よろしくお願いします。

  • 行すべての値を張り付けるようにするには

    次の突合用マクロですが、照合番号だけでなく行すべてのデータを張り付けたいのですが、どの部分に変更を加えればよいかわかりません。 (添付画像をご覧ください) ・Sheet3~6にも列B~以降のデータを張り付けたい EntireRow Copy を使おうとしたのですが、どの様に行を指定すればよいかわかりませんでした。 ご教示頂ければ幸いです。 【準備して頂いたマクロ】 Sub TestX() Dim Sh1 As Worksheet, Sh2 As Worksheet Dim Sh3 As Worksheet, Sh4 As Worksheet Dim Sh5 As Worksheet, Sh6 As Worksheet Dim Sh1data As Variant, Sh2data As Variant Dim Sh3data As Variant, Sh4data As Variant Dim Sh5data As Variant, Sh6data As Variant Dim Sh1LastRow As Long, Sh2LastRow As Long Dim i As Long, j As Long, Sh5flg As Boolean Set Sh1 = Worksheets("Sheet1") Set Sh2 = Worksheets("Sheet2") Set Sh3 = Worksheets("Sheet3") Set Sh4 = Worksheets("Sheet4") Set Sh5 = Worksheets("Sheet5") Set Sh6 = Worksheets("Sheet6") ReDim Sh3data(0) ReDim Sh4data(0) ReDim Sh5data(0) ReDim Sh6data(0) Sh1LastRow = Sh1.Cells(Rows.Count, "A").End(xlUp).Row Sh2LastRow = Sh2.Cells(Rows.Count, "A").End(xlUp).Row Sh1data = Sh1.Range(Sh1.Cells(3, "A"), Sh1.Cells(Sh1LastRow, "B")).Value Sh2data = Sh2.Range(Sh2.Cells(3, "A"), Sh2.Cells(Sh2LastRow, "B")).Value For i = 1 To Sh1LastRow - 2 Sh5flg = False For j = 1 To Sh2LastRow - 2 If Sh1data(i, 1) = Sh2data(j, 1) Then If Sh2data(j, 2) <> "◯" Then Sh1data(i, 2) = "◯" Sh3data(UBound(Sh3data)) = Sh1data(i, 1) ReDim Preserve Sh3data(UBound(Sh3data) + 1) Sh2data(j, 2) = "◯" Else Sh5data(UBound(Sh5data)) = Sh1data(i, 1) ReDim Preserve Sh5data(UBound(Sh5data) + 1) Sh5flg = True End If Exit For End If Next j If Sh1data(i, 2) <> "◯" And Sh5flg = False Then Sh5data(UBound(Sh5data)) = Sh1data(i, 1) ReDim Preserve Sh5data(UBound(Sh5data) + 1) End If Next i For i = 1 To Sh2LastRow - 2 If Sh2data(i, 2) = "◯" Then Sh4data(UBound(Sh4data)) = Sh2data(i, 1) ReDim Preserve Sh4data(UBound(Sh4data) + 1) Else Sh6data(UBound(Sh6data)) = Sh2data(i, 1) ReDim Preserve Sh6data(UBound(Sh6data) + 1) End If Next Sh1.Range("A3").Resize(Sh1LastRow - 2, 2).Value = Sh1data Sh2.Range("A3").Resize(Sh2LastRow - 2, 2).Value = Sh2data Sh3.Range("A3").Resize(UBound(Sh3data), 1).Value = WorksheetFunction.Transpose(Sh3data) Sh4.Range("A3").Resize(UBound(Sh4data), 1).Value = WorksheetFunction.Transpose(Sh4data) Sh5.Range("A3").Resize(UBound(Sh5data), 1).Value = WorksheetFunction.Transpose(Sh5data) Sh6.Range("A3").Resize(UBound(Sh6data), 1).Value = WorksheetFunction.Transpose(Sh6data) Set Sh1 = Nothing Set Sh2 = Nothing Set Sh3 = Nothing Set Sh4 = Nothing Set Sh5 = Nothing Set Sh6 = Nothing End Sub

  • 2つのVBAを組み合わせる方法

    お世話になります、2つのVBAを組み合わせる方法で迷っています。 1つ目が Private Sub Worksheet_Change(ByVal Target As Range) Dim i As Long, k As Long, myNum As Long If Intersect(Target, Range("C1,B9:B39")) Is Nothing Or Target.Count > 1 Then Exit Sub 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 End Sub です。 2つめが Private Sub Worksheet_Change(ByVal Target As Range)  Application.EnableEvents = True If Intersect(Target, Range("R8:R38")) Is Nothing Then Exit Sub Application.EnableEvents = False Range(Cells(Target.Row, 18), Cells(39, 18)).Value = Target.Value Application.EnableEvents = True End Sub です。2つのPrivate Sub Worksheet_Change(ByVal Target As Range)イベントのVBAですが、どのようにして組み合わせれば良いのでしょうか?

専門家に質問してみよう