• ベストアンサー

VB6 API LISTVIEW(チェックボックス付き)にチェックを付けたい

CreateWindowExでLISTVIEW(チェックボックス付きのレポートビュー)を作ったのですが、「山田花子」行にソースでチェックを付ける方法が分かりません。 Form1のソース ↓ Option Explicit Private Sub Form_Load() Dim lngRet As Long Dim lvcol As LV_COLUMN Dim rStyle As Long Dim item As LV_ITEM '-- リストビューの作成 hList = CreateWindowEx(WS_EX_CLIENTEDGE, _ WC_LISTVIEW, "", _ WS_CHILD Or WS_VISIBLE Or WS_BORDER Or _ WS_CLIPSIBLINGS Or WS_CLIPCHILDREN Or _ LVS_REPORT, _ 0&, 0&, Me.ScaleWidth / Screen.TwipsPerPixelX, 200&, _ Me.hwnd, _ 0&, _ App.HINSTANCE, _ ByVal 0&) '拡張スタイルを設定 rStyle = rStyle Or LVS_EX_FULLROWSELECT Or LVS_EX_GRIDLINES Or LVS_EX_CHECKBOXES SendMessageByNum hList, LVM_SETEXTENDEDLISTVIEWSTYLE, 0&, rStyle '-- カラムヘッダーの追加 With lvcol .mask = LVCF_FMT Or LVCF_WIDTH Or LVCF_TEXT Or LVCF_SUBITEM .fmt = LVCFMT_LEFT .cx = 100 .pszText = "名前" .iSubItem = 0 lngRet = ListView_InsertColumn(hList, 0&, lvcol) End With '-- リストアイテムの追加 With item .mask = LVIF_TEXT Or LVIF_IMAGE ' 1つめ .pszText = "山田 太郎" .iItem = 0 .iSubItem = 0 .iImage = 0 lngRet = ListView_InsertItem(hList, item) ' 2つめ .pszText = "山田 花子" .iItem = 1 .iSubItem = 0 .iImage = 1 lngRet = ListView_InsertItem(hList, item) End With End Sub Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) '-- リストビューを破棄 DestroyWindow hList End Sub 標準モジュールは補足に書きます

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

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.3

LVITEMのstateMaskとstateメンバを適切に設定してLVM_SETITEMSTATEメッセージを送ればいいようです Pubic Sub ListView_SetCheckState( hWnd as long, n as long, bflag as integer) Const LVM_SETITMSTATE = (LVM_FIRST + 43)   dim oItem as LVITEM   dim bit as integer   if bflag then     bit = &h2000   else     bit = &h1000   end if   oItem.stateMask = &HF000   oItem.state = bit   SendMessage hWnd, LVM_SETITEMSTATE, n, oItem End Sub チェック状態の取得は Pubic Function ListView_GetCheckState( hWnd as long, n as long ) as integer   Const LVM_GETITMSTATE = (LVM_FIRST + 44)   dim state as long   state = SendMessage( hWnd, LVM_GETITEMSTATE, n, &HF000) / 4096   ListView_GetCheckState = state - 1 End Function といった具合だと思います

type0000
質問者

お礼

上記のとおりで出来ました。 LVM_SETITEMSTATEメッセージのパラメータにビットを設定するんですね。 ありがとうございました。

その他の回答 (2)

  • stiffels
  • ベストアンサー率34% (25/72)
回答No.2

VCだと ListView_GetCheckStateというマクロで値を取得 ListView_SetCheckStateというマクロで値を設定しているようですが VBに移植するのがめんどくさいです。。 動作未確認ですがListView_GetCheckStateだけは移植してみましたので張っておきます。 cmmctrl.hのマクロ(抜粋) #define INDEXTOSTATEIMAGEMASK(i) ((i) << 12) #define ListView_SetCheckState(hwndLV, i, fCheck) \     ListView_SetItemState(hwndLV, i, INDEXTOSTATEIMAGEMASK((fCheck)?2:1), LVIS_STATEIMAGEMASK) #define LVM_GETITEMSTATE 0x1000+44 #define LVIS_STATEIMAGEMASK 0xF000 #define ListView_GetCheckState(hwndLV, i) \     ((((UINT)(SNDMSG((hwndLV), LVM_GETITEMSTATE, (WPARAM)(i), LVIS_STATEIMAGEMASK))) >> 12) -1) '--------------------------------------------- ' ListView_GetCheckState '--------------------------------------------- Function ListView_GetCheckState(hwndLV As Long, i As Long) As Integer   ListView_GetCheckState = (SendMessage(hwnd, &h102C, 0, &hF000) \ (2 ^ &hC)) - 1 Enf Function

  • type0001
  • ベストアンサー率0% (0/1)
回答No.1

標準モジュール ↓ Public hList As Long Public Type LV_COLUMN mask As Long fmt As Long cx As Long pszText As String cchTextMax As Long iSubItem As Long iImage As Long iOrder As Long End Type Public Type LV_ITEM mask As Long iItem As Long iSubItem As Long state As Long stateMask As Long pszText As String cchTextMa As Long iImage As Long lParam As Long iInden As Long End Type Public Const LVM_FIRST = &H1000 Public Const WS_EX_CLIENTEDGE = &H200& Public Const WC_LISTVIEW = "SysListView32" Public Const WS_CHILD = &H40000000 Public Const WS_VISIBLE = &H10000000 Public Const WS_BORDER = &H800000 Public Const WS_CLIPSIBLINGS = &H4000000 Public Const WS_CLIPCHILDREN = &H2000000 Public Const LVM_SETEXTENDEDLISTVIEWSTYLE = LVM_FIRST + 54 Public Const LVM_GETEXTENDEDLISTVIEWSTYLE = LVM_FIRST + 55 Public Const LVS_ICON = &H0 Public Const LVS_REPORT = &H1 Public Const LVS_SMALLICON = &H2 Public Const LVS_LIST = &H3 Public Const LVS_TYPEMASK = &H3 Public Const LVS_SINGLESEL = &H4 Public Const LVS_SHOWSELALWAYS = &H8 Public Const LVS_SORTASCENDING = &H10 Public Const LVS_SORTDESCENDING = &H20 Public Const LVS_SHAREIMAGELISTS = &H40 Public Const LVS_NOLABELWRAP = &H80 Public Const LVS_AUTOARRANGE = &H100 Public Const LVS_EDITLABELS = &H200 Public Const LVS_OWNERDATA = &H1000 Public Const LVS_NOSCROLL = &H2000 Public Const LVS_EX_GRIDLINES = &H1 'グリッドライン Public Const LVS_EX_SUBITEMIMAGES = &H2 'サブアイテムイメージ Public Const LVS_EX_CHECKBOXES = &H4 'チェックボックス追加 Public Const LVS_EX_TRACKSELECT = &H8 'トラックセレクト Public Const LVS_EX_HEADERDRAGDROP = &H10 'ヘッダードラッグ&ドロップ Public Const LVS_EX_FULLROWSELECT = &H20 '一行選択 Public Const LVS_EX_ONECLICKACTIVATE = &H40 '1クリック選択 Public Const LVS_EX_TWOCLICKACTIVATE = &H80 '2クリック選択 Public Const LVS_TYPESTYLEMASK = &HFC00 Public Const LVS_ALIGNTOP = &H0 Public Const LVS_ALIGNLEFT = &H800 Public Const LVS_ALIGNMASK = &HC00 Public Const LVS_OWNERDRAWFIXED = &H400 Public Const LVS_NOCOLUMNHEADER = &H4000 Public Const LVS_NOSORTHEADER = &H8000 Public Const LVCF_FMT = &H1 Public Const LVCF_WIDTH = &H2 Public Const LVCF_TEXT = &H4 Public Const LVCF_SUBITEM = &H8 Public Const LVCF_IMAGE = &H10 Public Const LVCF_ORDER = &H20 Public Const LVCFMT_LEFT = &H0 Public Const LVCFMT_RIGHT = &H1 Public Const LVCFMT_CENTER = &H2 Public Const LVCFMT_JUSTIFYMASK = &H3 Public Const LVCFMT_IMAGE = &H800 Public Const LVCFMT_BITMAP_ON_RIGHT = &H1000 Public Const LVCFMT_COL_HAS_IMAGES = &H8000 Public Const LVIF_TEXT = &H1 Public Const LVIF_IMAGE = &H2 Public Const LVIF_PARAM = &H4 Public Const LVIF_STATE = &H8 Public Const LVIF_INDENT = &H10 Public Const LVIF_NORECOMPUTE = &H800 Public Const LVIS_FOCUSED = &H1 Public Const LVIS_SELECTED = &H2 Public Const LVIS_CUT = &H4 Public Const LVIS_DROPHILITED = &H8 Public Const LVIS_OVERLAYMASK = &HF00 Public Const LVIS_STATEIMAGEMASK = &HF000 Public Const LVSIL_NORMAL = 0 Public Const LVSIL_SMALL = 1 Public Const LVSIL_STATE = 2 Declare Function CreateWindowEx Lib "USER32" Alias "CreateWindowExA" (ByVal dwExStyle As Long, ByVal lpClassName As String, ByVal lpWindowName As String, ByVal dwStyle As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hWndParent As Long, ByVal hMenu As Long, ByVal HINSTANCE As Long, lpParam As Any) As Long Declare Function SendMessageByNum Lib "USER32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Private Declare Function SendMessage Lib "USER32" _ Alias "SendMessageA" ( _ ByVal hwnd As Long, _ ByVal wMsg As Long, _ ByVal wParam As Long, _ lParam As Any) As Long Declare Function DestroyWindow Lib "USER32" (ByVal hwnd As Long) As Long Public Function ListView_InsertColumn(ByVal hwnd As Long, ByVal iCol As Long, pcol As LV_COLUMN) As Long Const LVM_INSERTCOLUMN = (LVM_FIRST + 27) ListView_InsertColumn = SendMessage(hwnd, LVM_INSERTCOLUMN, iCol, pcol) End Function Public Function ListView_SetColumn(ByVal hwnd As Long, ByVal iCol As Long, pcol As LV_COLUMN) As Long Const LVM_SETCOLUMN = (LVM_FIRST + 26) ListView_SetColumn = SendMessage(hwnd, LVM_SETCOLUMN, iCol, pcol) End Function Public Function ListView_InsertItem(ByVal hwnd As Long, pitem As LV_ITEM) As Long Const LVM_INSERTITEM = (LVM_FIRST + 7) ListView_InsertItem = SendMessage(hwnd, LVM_INSERTITEM, 0&, pitem) End Function Public Function ListView_SetItem(ByVal hwnd As Long, pitem As LV_ITEM) As Long Const LVM_SETITEM = (LVM_FIRST + 6) ListView_SetItem = SendMessage(hwnd, LVM_SETITEM, 0&, pitem) End Function Public Function ListView_SetImageList(ByVal hwnd As Long, ByVal himl As Long, ByVal iImageList As Long) As Long Const LVM_SETIMAGELIST = (LVM_FIRST + 3) ListView_SetImageList = SendMessage(hwnd, LVM_SETIMAGELIST, iImageList, ByVal himl) End Function

関連するQ&A

  • ActiveBasic ListView 選択を移動させたい

    SendMessage関数を使って、ListViewの選択されているアイテムの場所を移動させたいのですが、 思うように動きません。 Dim lv As LVITEM With lv .iItem=PlayListNum[RandomFlag] .mask=LVIF_STATE .state=LVIS_SELECTED End With SendMessage(hList,LVM_SETITEM,0,VarPtr(lv)) ※hListには、ListViewのハンドルが格納されてあります。 ご存知の方、いらっしゃいましたら、やり方の方をご教授下さい。 Win XP AB 4.23.00

  • リストビューで選択行の背景を変える

    お世話になります。リストビューの選択行の背景色を変えたいと思い、カスタムドローを用い以下のようにしましたが、選択していない所も赤になってしまいます。 if (lplvcd->nmcd.dwDrawStage == CDDS_ITEMPREPAINT) {  // 選択行の背景色を変更  if (lplvcd->nmcd.uItemState & CDIS_SELECTED) {   lplvcd->clrTextBk = RGB(255, 0, 0);   lplvcd->nmcd.uItemState &= ~CDIS_SELECTED;  } else {   lplvcd->clrTextBk = RGB(255, 255, 255);  }  return CDRF_NOTIFYSUBITEMDRAW; } デバッグモードで見ると、else以降の分は解釈されていないようです。 リストビューは g_hList = CreateWindowEx(0 , WC_LISTVIEW , 0 , WS_CHILD | WS_VISIBLE | LVS_REPORT | LVS_NOSORTHEADER | LVS_SHOWSELALWAYS, 1 , 1 , width , lv_height , g_hMain , (HMENU)1 , g_hInst , NULL); dwStyle = ListView_GetExtendedListViewStyle(g_hList); dwStyle |= LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT | LVS_EX_SUBITEMIMAGES; ListView_SetExtendedListViewStyle(g_hList, dwStyle); ListView_SetBkColor(g_hList, RGB(240,240,240)); のようにしています。宜しくお願いします

  • ListViewで条件式を使う方法

    Visual Basic 2010でDatasetとListviewを使ってプログラムを作成しています。 DatasetのデータをListviewに表示させるプログラムは下記のコードで完成しました。 ******************************* Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load With ListView1 .Columns.Add("date", 40, HorizontalAlignment.Left) .Columns.Add("no", 40, HorizontalAlignment.Left) .Columns.Add("住所", 100, HorizontalAlignment.Left) showlist() End With End Sub Private Sub showlist() Try 住所TableAdapter.Fill(Kz526DataSet.住所) Catch ex As Exception MessageBox.Show(ex.Message, "住所テーブル") End Try With Kz526DataSet.住所 For i As Integer = 0 To .Rows.Count - 1 ListView1.Items.Add(.Rows(i)("date"), (i)) ListView1.Items(i).SubItems.Add(.Rows(i)("no")) ListView1.Items(i).SubItems.Add(.Rows(i)("住所")) Next End With End Sub ************************************ 次に、Datasetのデータの内一部だけListviewに表示させることにしました。そのため、テキストボックスを設けて、その日付と同じデータをListviewに表示させます。 テキストボックスを設けて、ボタンをクリックしてデータをListviewに表示させようとしたコードです。 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load With ListView1 .Columns.Add("date", 40, HorizontalAlignment.Left) .Columns.Add("no", 40, HorizontalAlignment.Left) .Columns.Add("住所", 100, HorizontalAlignment.Left) showlist() End With End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click 住所TableAdapter.Fill(Kz526DataSet.住所) With Kz526DataSet.住所 For c As Integer = 0 To .Rows.Count - 1 If TextBox1.Text = Kz526DataSet.住所.Rows(c)("data") Then ListView1.Items.Add(.Rows(c)("date"), (c)) ListView1.Items(c).SubItems.Add(.Rows(c)("no")) ListView1.Items(c).SubItems.Add(.Rows(c)("住所")) End If Next End With End Sub *************************************** このコードでは、条件式とListViewの関係がいまくいきません。エラーメッセージは次の様に表示されます。 「'3' の InvalidArgument=Value は 'index' に対して有効ではありません。 パラメーター名: index」 いろいろ試行錯誤してみましたところ、「ListView1.Items(c).SubItems.Add(.Rows(c)("no"))」のところで止まります。 if文では、Thenのあとは1行しか書けないのでしょうか。書き方をご指導ください。

  • vb2008です。ListViewついてです。

    初心者です。説明に分かりにくい所もあるかと思いますがよろしくお願いします。 csvファイルを用いてListViewで一覧の作成をしています。 Using textPatser As New Microsoft.VisualBasic.FileIo.TextPatser("C:¥~¥.csv",System.Text.Encoding.GetEncoding("UTF-8")) textPatser.TextFiledType=FileIo.FiledType.Delimited textPatser.HasfildsEnclosedInQuotes=True textPatser.SetDelimitedrs(",") ListView1.Items.Clear() While Not textPatser.EndOfData Dim fields As String() = textPatser.ReadFields() ListView1.Items.Add(New ListViewItem(fields)) End while End Using のコードにてListViewの一覧に入力しました。 一覧に国名の列があり0001,0002,0003....と入力しています。 別のcsvファイルに数字のコードと国名 国コード,国名 0001,日本 0002,アメリカ 0003,フランス と作りました。これを認識、0001の所は、日本と表示出来るようにしたいのですが 仕方を知りたいです。よろしくお願いします。

  • ユーザーフォーム、リストボックスに重複なしのリスト

    ユーザーフォームリストボックスに 重複なしのリストを作りたく、調べたところ以下のソースを発見しました。 記載した所思った通りに実装できたのですが ソースがのっていたのは 詳しく解説しているサイトではなくよくわからぬままソースのコピーで実装しています 出来れば、下記の解説をお願いしたいです Private Sub UserForm_Initialize() Dim f As Long Dim v As Variant Dim Lrow As Long Dim WS As Worksheet Set WS = Worksheets("Sheet1") Lrow = WS.Range("A" & CStr(Rows.Count)).End(xlUp).Row v = WS.Range("A1:A" & CStr(Lrow)).Value With CreateObject("Scripting.Dictionary")    For f = 1 To UBound(v)       .Item(v(f, 1)) = Empty    Next    ListBox1.List = .Keys End With End Sub

  • リストコントロール(MFC or API)の最後尾にアイテムを追加するには?

     以下のような手順でリストコントロールにアイテムを追加しています。すると新しいアイテムはリストコントロールの先頭に追加されてしまいます。  先頭ではなくリストの最後尾にアイテムを挿入するにはどうしたらいいのでしょうか?  このサンプルはMFCですが回答はAPIやほかの手段を使っていても構いません。ヒントだけでも分かる方がいましたらお願いします。 LVITEM sItem; sItem.mask = LVIF_TEXT; sItem.iItem = 0; sItem.iSubItem = 0; sItem.pszText = LPSTR_TEXTCALLBACK; m_lpcList->InsertItem(&sItem);

  • CreateWindowEx のウィンドウスタイルが反映されないのですが・・・

    CreateWindowEx のウィンドウスタイルが反映されないのですが・・・ VC++6.0 の SDK にて、ウィンドウを表示するプログラムを作成中なのですが、 スタイルが思うように反映されません。なぜなのでしょうか。 hList = CreateWindowEx( 0,      WC_LISTVIEW, "",       WS_CHILD | WS_VISIBLE |//猫でもわかる ~ によるうとデフォルトで必要らしい      WS_EX_CLIENTEDGE |   // 縁が沈んで見える境界線を持ちます。→ 持ちません      WS_EX_ACCEPTFILES |  // ドラッグ&ドロップを受けるとあるが、テキストをドロップしても×マーク      WS_EX_RIGHTSCROLLBAR | // 右スクロールバーが出るはずなのに・・・      LVS_REPORT,       // カラムのタイトル      0, 0, 0, 0,      hWnd,      (HMENU)LISTVW_HI_1,      hInst,      NULL);

  • VB6 OpenPrinterのエラー

    OS:WindowsXP SP3 言語:VB6 SP6 現在、指定されたプリンタのジョブを取得して、全てジョブを一時停止にするプログラムを作っています。 下記コードはタイマーイベントで実行されるコードなのですが、、、 「lngRet = OpenPrinter(mPrinterName, hPrinter, ByVal 0&)」の部分で、 アプリケーションエラー(※添付画像参照)が発生してしまいます。 最初のうちは発生しませんが、数秒後にエラーになります。(タイマー間隔は0.5秒に設定) 内容をご存知の方がいましたら教えていただけないでしょうか? 宜しくお願い致します。 ------------------------------------------------------------- Dim lngRet As Long Dim i As Integer Dim intRow As Integer Dim lngTypeLen As Long Dim hPrinter As Long Dim Level As Long Dim bytJob() As Byte Dim dwNeeded As Long Dim dwReturned As Long Dim lngJobID() As Long Dim udtJobInfo1() As JOB_INFO_1 Dim ftDate As FILETIME Dim ltDate As FILETIME Dim stDate As SYSTEMTIME Dim udtPrinterDefaults As PRINTER_DEFAULTS '初期化 Call PgdGrid.RemoveItems(0, PgdGrid.Items) PgdGrid.Enabled = False Erase lngJobID 'プリンタアクセス権 udtPrinterDefaults.DesiredAccess = PRINTER_ALL_ACCESS 'プリンタをオープンし、プリンタのハンドルを取得 ↓エラーになる********************************** lngRet = OpenPrinter(mPrinterName, hPrinter, ByVal 0&) ↑エラーになる********************************** 'まずEnumJobsを実行し、必要なメモリサイズ(バッファのバイト数)を調べる lngRet = EnumJobs(hPrinter, 0&, &HFFFFFFFF, 1&, ByVal 0&, 0&, dwNeeded, dwReturned) If dwNeeded = 0& Then Call ClosePrinter(hPrinter) Exit Sub End If '配列初期化 ReDim bytJob(dwNeeded - 1) '実際のデータを取得するために関数を実行 lngRet = EnumJobs(hPrinter, 0, &HFFFFFFFF, 1, bytJob(0), dwNeeded, dwNeeded, dwReturned) '配列初期化 ReDim udtJobInfo1(dwReturned - 1) ReDim lngJobID(dwReturned - 1) For i = 0 To dwReturned - 1 Call MoveMemory(udtJobInfo1(i), bytJob(Len(udtJobInfo1(0)) * i), Len(udtJobInfo1(0))) lngJobID(i) = udtJobInfo1(i).JobId lngRet = OpenPrinter(mPrinterName, hPrinter, udtPrinterDefaults) 'ジョブの状態を一時停止にする If (udtJobInfo1(i).Status And JOB_STATUS_PAUSED) Or (udtJobInfo1(i).Priority = 2) Then '一時停止 or 本PGで既に設定したものは状態を変えない Else '優先順位を変える(フラグ) udtJobInfo1(i).Priority = 2 lngRet = SetJob(hPrinter, lngJobID(i), 1, ByVal udtJobInfo1(i), JOB_CONTROL_PAUSE) If lngRet = 0 Then 'エラー MsgBox GetLastErrorMessage(GetLastError) End If '一時停止にする lngRet = SetJob(hPrinter, lngJobID(i), 0&, 0&, JOB_CONTROL_PAUSE) If lngRet = 0 Then 'エラー MsgBox GetLastErrorMessage(GetLastError) End If End If 'プリンタをクローズ Call ClosePrinter(hPrinter) Next i -------------------------------------------------------------

  • 複数のエクセルシートをまとめるマクロ

    下は複数のエクセルファイルを一つにするマクロですが、100万件を超えるためcsvで保存するようにするにはどこを変更したらよいでしょうか。 よろしくお願いします。 Sub Sample() Dim t As Single Dim strPath As String Dim strFileName As String Dim WB1 As Workbook Dim WS1 As Worksheet Dim WS2 As Worksheet Dim lngRowCount As Long 'A列に値が入っているデータ数 t = Timer 'まとめたいシート Set WS2 = ThisWorkbook.Worksheets(1) strPath = ThisWorkbook.Path strFileName = Dir(strPath & "\*.xls*") Do While strFileName <> "" If strFileName <> ThisWorkbook.Name Then Set WB1 = Workbooks.Open(strPath & "\" & strFileName) Set WS1 = WB1.Worksheets(1) With WS1.Range("A1") lngRowCount = .Worksheet.Cells(.Worksheet.Rows.Count, .Column).End(xlUp).Row - .Row If lngRowCount >= 1 Then With .Resize(lngRowCount, 14).Offset(1) .Copy WS2.Range("A" & WS2.Rows.Count).End(xlUp).Offset(1) End With End If End With WB1.Close False End If strFileName = Dir Loop MsgBox "まとめ処理をしました。処理時間 " & Format((Timer - t) / 60 / 60 / 24, "h:mm:ss") End Sub

  • エクセルのVBAの記述について

    VBAの記述についてなのですが、 Sub filter() Dim gyo As Long Dim ws1 As Worksheet Dim ws2 As Worksheet Dim ws3 As Worksheet Set ws1 = Worksheets("データ") Set ws2 = Worksheets("チーム") Application.ScreenUpdating = False ws2.Range("A4:BH30").Clear gyo = ws1.Range("A65536").End(xlUp).Row ws1.Activate With ws1.Range(Cells(4, 1), Cells(gyo, 6)) .AutoFilter Field:=1, Criteria1:="A" .SpecialCells(xlCellTypeVisible).Copy ws2.Range("A4") Selection.AutoFilter End With Application.ScreenUpdating = True End Sub ならプログラムははしるのですが、 14行目を .SpecialCells(xlCellTypeVisible).Copy ws2.Range(Cells(4, 1)) だと 「実行時エラー 1004 Rangeメソッドは失敗しました Worksheet オブジェクト」 とでるのですが、出来ないのでしょうか? Cells(4, 1)の1のところを変数にして変えていきたいのですが、よい方法はありますか。 よろしくお願いいたします。