• ベストアンサー
  • すぐに回答を!

エクセルVBAを勉強中の者です。

エクセルVBAを勉強中の者です。 今、あるソースを書いていて、それなりに上手くいったので、仮で、これまで、 dim e as string と宣言していたのを、eをdataaddress1に変更して、ソース中のeも全て、dataaddress1に変更しました。以下は途中のソースです。変更まではソースは正常に作動していました。 Range("B2:B" & Rows.count).Interior.ColorIndex = xlColorIndexNone '初めての検索処理 Set data1 = .Find(What:=myKey, After:=.Cells(.count), LookIn:=xlValues, lookat:=xlPart, SearchOrder:=xlByColumns) '最初の検索で見つからなければ、 If data1 Is Nothing Then MsgBox "データは見つかりません", vbExclamation Exit Sub '最初の検索で見つかれば Else dataaddress1 = data1.Address TextBox1.Value = Range(dataaddress1).Value TextBox2.Value = Range(dataaddress1).Offset(0, 1).Value 分類.Value = Range(dataaddress1).Offset(0, 2).Value データ番号.Value = Range(dataaddress1).Offset(0, -1).Value dataaddress1に変更したとたんに、実行時エラー1004 Rangeメソッドは失敗しました'Globalオブジェルト"というメッセージがでました。 何か、stringでの変数の宣言の仕方に問題があるのでしょうか、ご存知の方教えて下さい、よろしくお願いします。

共感・応援の気持ちを伝えよう!

  • 回答数2
  • 閲覧数72
  • ありがとう数3

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

  • ベストアンサー
  • 回答No.2
  • nda23
  • ベストアンサー率55% (773/1384)

暗黙のオブジェクトを使用するのは避けるべきです。 例えば、Range(dataaddress1)とありますが、 とのブックのどのシート?という目的物(語)が ありません。これを省略すると、「現在カレントに なっているブックとシート」になります。これが 意図したものを示している保証はあるのですか? さすがに、Applicationまで書けとは言いませんが、 ブックとシートは必ず明示的に指定すべきです。 Dim 目的シート As WorkSheet Set 目的シート = ThisWorkbook.WorkSheets(1) TextBox1.Value = 目的シート.Range(dataaddress1).Value 尚、細かいことですが、Range(dataaddress1)が 何度も出てきます。こういう場合は変数に取得して おく方が効率的です。 Dim 領域 As Range Set 領域 = 目的シート.Range(dataaddress1) ()の付く動作は内部的にサブルーチンコールが発生する ので、変数参照より時間がかかります。まぁ、今時は CPUが高速なので、無神経にやっても大差はないのですが、 昔の遅いマシンで仕事してきたジジイSEとしてはチョット 気になる所です。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

詳細なコメントありがとうございます。実は、元データのコピーを利用してやり直したら、上手くいきました。おそらくタイプミスではないかと思われます、只今検証中ですが、多分そう思われます。検証を丁寧にしてみます、ありがとうございました。 また、いくつかの視点からご指摘をいただきありがとうございました、参考にさせていただきます。

関連するQ&A

  • 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

  • エクセルVBA の変数を使うべきでしょうか?

    はじめまして。エクセル初心者です。 書籍やサイトで勉強させてもらっていますが、VBAがなかなか難しくてすぐに壁にぶつかってしまいます。少々困ってしまい、詳しい方のアドバイスを頂ければと質問を投稿させていただきました。 どうか宜しくお願い致します。質問ですが、 以下のようなコードで、sheet5のB列の任意のセルをダブルクリックした場合、sheet5のBCD列の同じ行のセル値がsheet1の指定した列に入力されるという処理を作りました。 これで一応目的の動作はするのですが、数が増えると「コンパイルエラー・プロシージャが大きすぎます」というメッセージがでてしまいます。列や行には規則性があるので、もしかしたら変数というものを使ってコードを書き直せばいいのかなと思いネットで調べてみたのですが、今のところさっぱり理解できません。 申し訳ありませんが、分かりやすくご教授いただけないでしょうか。バージョンは2003を使っています。 また、下のコードですと、sheet5のBCDいずれかのセルに空白があった場合、sheet1の列に入力されるときに入力される行がずれてしまいます。今は空白を何かで埋めて対処しているのですが、この問題の解決策も教えて頂けると助かります。どうか宜しくお願い致します。 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Excel.Range, cancel As Boolean) If Target.Address = "$B$2" Then Worksheets("sheet1").Range("B" & Rows.Count).End(xlUp).Offset(1).Value = Target.Value Worksheets("sheet1").Range("H" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("B2") Worksheets("sheet1").Range("K" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("C2") Worksheets("sheet1").Range("M" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("D2") Worksheets("sheet1").Activate cancel = True End If If Target.Address = "$B$3" Then Worksheets("sheet1").Range("B" & Rows.Count).End(xlUp).Offset(1).Value = Target.Value Worksheets("sheet1").Range("H" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("B3") Worksheets("sheet1").Range("K" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("C3") Worksheets("sheet1").Range("M" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("D3") Worksheets("sheet1").Activate cancel = True End If If Target.Address = "$B$4" Then Worksheets("sheet1").Range("B" & Rows.Count).End(xlUp).Offset(1).Value = Target.Value Worksheets("sheet1").Range("H" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("B4") Worksheets("sheet1").Range("K" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("C4") Worksheets("sheet1").Range("M" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("D4") Worksheets("sheet1").Activate cancel = True End If   ・     ・   ・     ・   ・     ・ End Sub

  • Excel VBAについて

    Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Excel.Range, cancel As Boolean) If Intersect(Target, Range("F:F")) Is Nothing Then Exit Sub Application.Goto Worksheets("人件費").Range("A1") Worksheets("人件費").Cells(Rows.Count, "A").End(xlUp).Offset(1).Value = Target.Offset(, -5).Value cancel = True End Sub Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Excel.Range, cancel As Boolean) If Intersect(Target, Range("G:G")) Is Nothing Then Exit Sub Application.Goto Worksheets("外注費").Range("A1") Worksheets("外注費").Cells(Rows.Count, "A").End(xlUp).Offset(1).Value = Target.Offset(, -5).Value cancel = True End Sub 上の指令はFの列をダブルクリックすると人件費のシートが開いてAある値を人件費の新しいセルのAに代入する指令ですが それをG列ダブルクリックで外注費シートに同じようにやろうと思いましたが出来ません。 たぶん根本的に書き方が間違っているのかと思われますが、ご指導のほどお願いします。

その他の回答 (1)

  • 回答No.1
  • tom11
  • ベストアンサー率53% (134/251)

よく解りませんが 例えばfind結果のrangeを見つけると rangeには、シート情報が入っています。 その後、range.addressの文字情報にすると シート情報が消えます。 その後は、rangeオブジェクトは、アクティブな シートのシート情報で、動作しますので、 その辺の事を考慮して、コードを書いているのでしょうか? コードの全体像が見えないと、はっきりした 回答はないかもしれません。 例えば 以下のコードを実行すると Dim ad As String Dim data1 As Range Set data1 = Sheet1.Range("A1") Debug.Print data1.Worksheet.Name ad = data1.Address Sheet2.Activate Debug.Print Range(ad).Worksheet.Name Debug.Print data1.Worksheet.Name UserForm1.Show 実行結果は、 Sheet1 Sheet2 Sheet1 になります。 シート1が、シート2に変化しても、 最初につかんだ、rangeのシート情報は、 シート1のままです。 findでつかんだ、情報には、シート情報が含まれていますよね その辺を考慮すると、上手くいくかもしれません。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

詳細なコメントありがとうございます。実は、元データのコピーを利用してやり直したら、上手くいきました。おそらくタイプミスではないかと思われます、只今検証中ですが、多分そう思われます。検証を丁寧にしてみます、ありがとうございました。 字数の関係で全てのソースを書くことができず、ご迷惑をおかけしました。またいくつかの視点でのご指摘をいただきありがとうございました。参考にさせていただきます。

関連するQ&A

  • excel vbaでの質問になります

    このようなマクロを作成したのですが、セルに数式が入れてあると、どうしてもその下の空白の行に値を入力されてしまいます。 数式が入っているセルにもそのままセルに値を入れたいのですが・・ 宜しくお願いします。 Dim wb1 As Worksheet, r1 As Range Dim N As Integer, i As Integer Dim mycount As Long   Set wb1 = ThisWorkbook.Worksheets("請求書") mycount = Range("B111").CurrentRegion.Rows.Count Cells(111 + mycount, 2).Select ActiveCell.Offset(0, 0).Value = wb1.Range("C60").Value ActiveCell.Offset(0, 1).Value = wb1.Range("C61").Value ActiveCell.Offset(0, 12).Value = wb1.Range("C66").Value ActiveCell.Offset(0, 13).Value = wb1.Range("C74").Value ActiveCell.Offset(0, 14).Value = wb1.Range("C75").Value ActiveCell.Offset(0, 15).Value = wb1.Range("C84").Value ActiveCell.Offset(0, 16).Value = wb1.Range("C85").Value ActiveCell.Offset(0, 20).Value = wb1.Range("C69").Value ActiveCell.Offset(0, 22).Value = wb1.Range("C68").Value ActiveCell.Offset(0, 23).Value = wb1.Range("C76").Value ActiveCell.Offset(0, 24).Value = wb1.Range("C77").Value Exit Sub

  • エクセルマクロが重い

    こんにちは。 ご教授くださいませ。 すでに先方が作っているエクセルのシートがありまして、 そのシートの表組み規則にのっとって入力するユーザーフォーム を私のほうで作ったのですが、重いです。 selectの多用はだめ!というところまでは調べたのですが じゃあどうしたらいいかわかりません。 ■ '--------------------8時から If OptionButton1.Value = True Then ActiveCell.Offset(3, -1).Range("A1").Select ActiveCell = UserForm3.TextBox1.Value ActiveCell.Offset(0, 1).Range("A1").Select ActiveCell = UserForm3.TextBox2.Value ActiveCell.Offset(0, 1).Range("A1").Select ActiveCell = UserForm3.TextBox3.Value ActiveCell.Offset(0, 1).Range("A1").Select ActiveCell = UserForm3.TextBox4.Value ActiveCell.Offset(0, 1).Range("A1").Select ActiveCell = UserForm3.TextBox5.Value ActiveCell.Offset(0, 1).Range("A1").Select ActiveCell = UserForm3.TextBox6.Value ActiveCell.Offset(3, 0).Range("A1").Select ActiveCell = UserForm3.TextBox12.Value ActiveCell.Offset(0, -1).Range("A1").Select ActiveCell = UserForm3.TextBox11.Value ActiveCell.Offset(0, -1).Range("A1").Select ActiveCell = UserForm3.TextBox10.Value ActiveCell.Offset(0, -1).Range("A1").Select ActiveCell = UserForm3.TextBox9.Value ActiveCell.Offset(0, -1).Range("A1").Select ActiveCell = UserForm3.TextBox8.Value ActiveCell.Offset(0, -1).Range("A1").Select ActiveCell = UserForm3.TextBox7.Value ActiveCell.Offset(3, 0).Range("A1").Select ActiveCell = UserForm3.TextBox13.Value ActiveCell.Offset(0, 1).Range("A1").Select ActiveCell = UserForm3.TextBox14.Value ActiveCell.Offset(0, 1).Range("A1").Select ActiveCell = UserForm3.TextBox15.Value ActiveCell.Offset(0, 1).Range("A1").Select ActiveCell = UserForm3.TextBox16.Value ActiveCell.Offset(0, 1).Range("A1").Select ActiveCell = UserForm3.TextBox17.Value ActiveCell.Offset(0, 1).Range("A1").Select ActiveCell = UserForm3.TextBox18.Value ActiveCell.Offset(3, 0).Range("A1").Select ActiveCell = UserForm3.TextBox24.Value ActiveCell.Offset(0, -1).Range("A1").Select ActiveCell = UserForm3.TextBox23.Value ActiveCell.Offset(0, -1).Range("A1").Select ActiveCell = UserForm3.TextBox22.Value ActiveCell.Offset(0, -1).Range("A1").Select ActiveCell = UserForm3.TextBox21.Value ActiveCell.Offset(0, -1).Range("A1").Select ActiveCell = UserForm3.TextBox20.Value ActiveCell.Offset(0, -1).Range("A1").Select ActiveCell = UserForm3.TextBox19.Value ActiveCell.Offset(3, 0).Range("A1").Select ActiveCell = UserForm3.TextBox25.Value ActiveCell.Offset(0, 1).Range("A1").Select ActiveCell = UserForm3.TextBox26.Value ActiveCell.Offset(0, 1).Range("A1").Select ActiveCell = UserForm3.TextBox27.Value ActiveCell.Offset(0, 1).Range("A1").Select ActiveCell = UserForm3.TextBox28.Value ActiveCell.Offset(0, 1).Range("A1").Select ActiveCell = UserForm3.TextBox29.Value ActiveCell.Offset(0, 1).Range("A1").Select ActiveCell = UserForm3.TextBox30.Value 'ActiveWorkbook.Save MsgBox "入力しました。", vbInformation, "確認" End If '--------------------8時から(END ■ 基本の流れは... 最初にオプションボタン3つのどれか1個の 選択を求め、その条件に応じて 始基点となるセルが変わります。 で、あとは与えられた表組みを縦や横に 移動しながら、対応するテキストボックスの 値を入れる、という 我ながら頭の悪い方法で^^; .selectではない、スマートな方法があればと思います。 ぜひお知恵を!

  • VBA転記について教えて下さい

    200件位のデータがあるとします。顧客情報AB・商品C&#65374;AY 氏名 性  青森りんご 長野りんご みかん バナナ 送料 AA  男   1             2      100 BB  女          1            100 CC  男                   3     0 このデータを別シートAにはりんごと送料 別シートBにはそれ以外のデータに分けたいのです。 シートA 氏名 性  青森りんご 長野りんご  送料 AA  男   1           100 BB  女        1    100 CC  男 シートB 氏名 性  みかん バナナ AA  男    2 BB  女 CC  男       3 こんな感じです。 色々参考にして作成しましたがうまくいきませんでしたので 教えて欲しいです。 よろしくお願いします。 エクセルは2002です。 1、項目名の転記でデータは200位ですが変動があるので最終行で作成したら うまくいきませんでした。 2、データ域の転記が動きません。 Sub サンプル() Dim i As Long Dim lastRow As Long Dim lastcolumns As Long Dim S1 As Worksheet, S2 As Worksheet, S3 As Worksheet Dim myColumns As Long Dim myKey As String Set S1 = Worksheets("データ") Set S2 = Worksheets("りんご") Set S3 = Worksheets("その他") ' Sheet1の最終行を取得 lastRow = S1.Range("A" & Rows.Count).End(xlUp).Row ' Sheet1の最終列を取得 lastcolumns = S1.Cells(1, Columns.Count).End(xlToLeft).Column ' 項目名の転記 S2.Range("A1:B200").Value = _ S1.Range("A1:B200").Value S3.Range("A1:B200").Value = _ S1.Range("A1:B200").Value 'データ域の転記 For i = 2 To lastcolumns myKey = S1.Cells(1 & i).Value If myKey <> "" Then myColumns = Worksheets(myKey).Cells(1, Columns.Count).End(xlUp).Columns + 1 S1.Range(S1.Cells(1, i), S1.Cells(lastRow, i)).Copy _ Worksheets(myKey).Range(Cells(1, myColumns), Cells(lastRow, myColumns)) End If Next i End Sub

  • VBA Excel

    分散が既知の場合の区間推定のプログラムを考えています。 次のマクロを実行するとエラーが出ます。 エラー:"1004" 引数の数の誤りがあります。 どこの行がエラーなのか分かりません。どこなのでしょうか? また、プログラムでおかしいところがあったら、教えてください。 Sub Calculate(DataRange As String, OutRange As String, a As Single) Dim RanData As Range Dim Ave As Single, n As Single, n1 As Integer, n2 As Integer Dim Std As Single, s As Single, p As Single, z As Single, aa As Single Dim b As Single, kukan As Single, Max As Single, Min As Single Set RanData = Range(DataRange) n1 = RanData.Rows.Count n2 = RanData.Columns.Count n = n1 + n2 Ave = Application.Average(RanData) Std = Application.StDev(RanData) s = Std * Std p = (1 + a) / 2 z = Application.NormInv(0, 1) b = Sqr(s / n) kukan = z * b Max = Ave + kukan Min = Ave - kukan aa = a * 100 Range(OutRange).Select Call output("信頼度", aa) Call output("標本数", n) Call output("平均", Ave) Call output("標準偏差", Std) Call output("分散", s) Call output("信頼区間", kukan) Call output("信頼上限", Max) Call output("信頼下限", Min) End Sub Private Sub output(name As String, x As Single) ActiveCell.Range("A1") = name ActiveCell.Offset(0, 1).Range("A1").Select ActiveCell.Range("A1") = x ActiveCell.Offset(1, -1).Range("A1").Select End Sub Sub Prob() UserForm1.Show End Sub

  • エクセル VBA マクロについて

    VBA初心者です。 Sub 記入() Range("H8", "J14").Copy Range("C" & Rows.Count).End(xlUp).Offset(1).PasteSpecial Paste:=xlPasteValuesAndNumberFormats Application.CutCopyMode = False Range("H15", "J21").Copy Range("C" & Rows.Count).End(xlUp).Offset(1).PasteSpecial Paste:=xlPasteValuesAndNumberFormats Application.CutCopyMode = False Range("H22", "J28").Copy Range("C" & Rows.Count).End(xlUp).Offset(1).PasteSpecial Paste:=xlPasteValuesAndNumberFormats Application.CutCopyMode = False Range("K13").Select End Sub こういうマクロを作り上手く作動しましたのでB列に日付を記入したいと思い Sub 日付() Range("("B" & Rows.Count).End(xlUp).Offset(1)","("C" & Rows.Count).End(xlUp).Offset(0, -1)").Value = Date End Sub このようなマクロを組みましたがエラーがでます。どなたか直して頂けませんか?よろしくお願いします。

  • VBA エクセル 文字列

    A列に、【鈴木 太郎】、【佐藤 一郎】・・・・と続いていて、B列には鈴木、佐藤・・・と表示させたい場合は以下のソースに、 =LEFT(A1,FIND(" ",SUBSTITUTE(A1," "," "))-1) と同じソースを書けばいいのはわかるのですが、勉強不足でわかりません。教えていただけませんでしょうか。下記のソースも教えていただきました。すごく助かります。 Sub PickupWords() Dim Matches As Object Dim Match As Object Dim buf As String Dim c As Variant With CreateObject("VBScript.RegExp") .Pattern = "【(.+)】" .Global = False Application.ScreenUpdating = False For Each c In Range("A1", Cells(Rows.Count, 1).End(xlUp)) If .Test(c.Value) Then buf = c.Value Set Matches = .Execute(buf) c.Offset(, 1).Value = Matches.Item(0).SubMatches(0) '括弧の中を取り出す End If Next c Application.ScreenUpdating = True End With End Sub

  • VBA セルの値を取得する

    下記のはランダムにチーム分けするものです。 TmCnt = 5がチーム数です。 Sub Sample() Dim Total As Integer Dim TmCnt As Integer Dim Data1 As Variant Dim Data2() As String Dim i As Integer, j As Integer, k As Integer Total = Cells(Rows.Count, 1).End(xlUp).Row TmCnt = 5 Data1 = Range("A1:A" & Total).Value ReDim Data2(1 To Total) Randomize For i = TmCnt To 1 Step -1 j = Int(Rnd * i) + 1 Data2(i) = Data1(j, 1) Data1(j, 1) = Data1(i, 1) Next i For i = Total To TmCnt + 1 Step -1 j = Int((i - (TmCnt + 1) + 1) * Rnd + TmCnt + 1) Data2(i) = Data1(j, 1) Data1(j, 1) = Data1(i, 1) Next i i = 1 Do For j = 1 To TmCnt k = k + 1 Cells(i, j + 2).Value = Data2(k) If k = Total Then Exit Sub Next j i = i + 1 Loop End Sub TmCnt = 5をセル「B1」にチーム数を入力し、(例「6」「4」など)マクロを実行したいのです。 検索しましたところ、 セルの値を取得するにはRange("A1").Valueを入力だそうです。 TmCnt = 5を下記に書き換えるにはどのようにしたら良いでしょうか? Dim s As String s = Range(“B1”).Value Debug.Print(s) 宜しくお願いします。

  • エクセル VBA

    VBA内で、そのVBAの実行を制御することは可能でしょうか? 下のようなコードを作ったのですが、 Sub 承認書作成() Dim ws0 As Worksheet, ws1 As Worksheet, r1 As Range Dim i As Long Dim nyuryoku(), chikuseki() Set ws0 = Worksheets("承認書作成") Set ws1 = Worksheets("顧客データ") Set ws2 = Worksheets("業者コード") Set ws3 = Worksheets("承認通知書") Worksheets("顧客データ").Select Range("テーブル1[[#Headers],[NO.]]").Select Selection.End(xlToRight).Select Selection.End(xlDown).Select Selection.ListObject.ListRows.Add AlwaysInsert:=False Range("B7").Select nyuryoku = Array("b5", "d5", "f5", "h5", "j5", "l5", "n5", "p5", "b6", "d6", "f6", "h6", "j6", "l6", "n6", "p6", "b4", "d4") '転記したいセルの位置 chikuseki = Array("0", "1", "5", "6", "8", "9", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "53", "54") '転記先の列のオフセット値  Set r1 = ws1.Range("f" & Rows.Count).End(xlUp).Offset(0) 'データ蓄積セル  For i = 0 To UBound(nyuryoku) r1.Offset(0, chikuseki(i)).Value = ws0.Range(nyuryokui)).Value '入力 Next MsgBox "入力完了" Dim lRowNum As Long '転記先となる行番号を求める lRowNum = ws1.Cells(Rows.Count, "b").End(xlUp).Row '転記 ws3.Cells(6, "d").Value = ws1.Cells(lRowNum, "j").Value ws3.Cells(17, "g").Value = ws1.Cells(lRowNum, "c").Value ws3.Cells(22, "g").Value = ws1.Cells(lRowNum, "l").Value ws3.Cells(22, "ac").Value = ws1.Cells(lRowNum, "ab").Value    Set ws0 = Nothing   Set ws1 = Nothing End Sub ここに、     If call Macro1 then call 承認書作成  '上のマクロです    Else: Msgbox"中止" 「Macro1を実行しないと承認書作成マクロを実行できない」 という コードを組み込みたいのですが、うまくいきません。 VBA内に同じVBAを組み込むことは不可能なのでしょうか?

  • エクセルVBAのフィルター機能について

    こんにちわ! エクセルのVBAを使って複数の条件を入力すると結果シートへ吐き出すプログラムを組み込んでいますが、下から五行目のCriteriaRange:=Sheets("検索").Range("A1:R2"), _の.Range("A1:R2")を変更した際に.Range("A1:R3")にすれば条件を指定できるのですがその状態で条件を一つだけ入力し抽出すると抽出できずすべてのデーターが吐き出されてしまいます。 ただし二行抽出データーを埋めるとそのとおりに抽出され結果シートへ吐き出されます。 抽出する条件を入力する際、一つの時もあれば二つの時もあります。そういった事を回避するにはどうすればいいでしょうか? Sub OutputRec() Application.ScreenUpdating = False Sheets("結果").Activate Cells.Clear Sheets("検索").Range("A1").Value = Sheets("DATA").Range("A1").Value Sheets("検索").Range("B1").Value = Sheets("DATA").Range("B1").Value Sheets("検索").Range("C1").Value = Sheets("DATA").Range("C1").Value Sheets("検索").Range("D1").Value = Sheets("DATA").Range("D1").Value Sheets("検索").Range("E1").Value = Sheets("DATA").Range("E1").Value Sheets("検索").Range("F1").Value = Sheets("DATA").Range("F1").Value Sheets("検索").Range("G1").Value = Sheets("DATA").Range("G1").Value Sheets("検索").Range("H1").Value = Sheets("DATA").Range("H1").Value Sheets("検索").Range("I1").Value = Sheets("DATA").Range("I1").Value Sheets("検索").Range("J1").Value = Sheets("DATA").Range("J1").Value Sheets("検索").Range("K1").Value = Sheets("DATA").Range("K1").Value Sheets("検索").Range("L1").Value = Sheets("DATA").Range("L1").Value Sheets("検索").Range("M1").Value = Sheets("DATA").Range("M1").Value Sheets("検索").Range("N1").Value = Sheets("DATA").Range("N1").Value Sheets("検索").Range("O1").Value = Sheets("DATA").Range("O1").Value Sheets("検索").Range("P1").Value = Sheets("DATA").Range("P1").Value Sheets("検索").Range("Q1").Value = Sheets("DATA").Range("Q1").Value Sheets("検索").Range("R1").Value = Sheets("DATA").Range("R1").Value Sheets("DATA").Range("A1").CurrentRegion.AdvancedFilter _ Action:=xlFilterCopy, _ CriteriaRange:=Sheets("検索").Range("A1:R2"), _ CopyToRange:=Sheets("結果").Range("A1"), _ Unique:=False Sheets("結果").Columns("A:R").AutoFit Application.ScreenUpdating = True End Sub

  • エクセルのVBAコードにつてい

    以下のコードについて、その内容をまだ自分の知識では理解できず困っておりまして、アドバイスいただければと思いまして書き込みました。 『コード』 Sub Test() Dim Lc As Integer Dim Ct As Integer Dim MyR As Range Dim C As Range Dim D As Range Lc = Range("A1").End(xlToRight).Column - 2 For Each C In Range("B2", Range("B65536").End(xlUp)) Ct = WorksheetFunction.Count(C.Offset(, 1).Resize(, Lc)) If Ct > 0 Then Set MyR = C.Offset(, 1).Resize(, Lc).SpecialCells(2, 1) For Each D In MyR With Sheets("Sheet2").Range("A65536").End(xlUp) .Offset(1).Value = C.Value .Offset(1, 1).Value = Cells(1, D.Column).Value End With Next Set MyR = Nothing End If Next With Sheets("Sheet2") .Columns("A:B").AutoFit .Activate End With End Sub 『質問』 1.「Lc = Range("A1").End(xlToRight).Column - 2」の部分の解釈は「A1から右方向に一番最後のセルまでを範囲指定し、その一番右のセルの列番号を取得する」変数という解釈でいいのか 2.「Ct = WorksheetFunction.Count(C.Offset(, 1).Resize(, Lc))」の部分の変数はどういった値の整数を取得する変数なのか 以上2点についてアドバイスいただけると幸いです。