[[20100420123546]] 『より便利な検索方法』(ゆんぱすとーら) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『より便利な検索方法』(ゆんぱすとーら)

 Win Vista   Excel 2007

 こういう動作をマクロで動作させたいのですが、書式とマクロで可能でしょうか。

 1.特定のシートに検索BOXを設置
 2.その検索BOXに検索したい文字列(アルファベット)を入力する
 3.検索候補を表示

 例:Sheet1
       _______A______        このA列に入力されている文字列を検索候補を出しながら 検索
 1     AKIRA SATOU      検索BOX 『AK    』
 2     AKITOSI SANO     検索候補 AKIRA SATOU   
 3     SATOSI KITAGAWA         AKITOSI SANO
 4     HITOSI KURIHARA                 AKI ARAI
 5     AKI ARAI                        AKIKO KONDOU
 .
 .
 2000  AKIKO KONDOU

 4.検索候補から当てはまる文字列を選ぶと、A1:A2000の範囲の中でその文字列をセル選択

 よろしくお願いします


 マクロではないですが…

 B,C列を作業列として使用します。

 B1セルに    =IF(COUNTIF(A1,"*"&$E$1&"*")>0,"○","×")
 C1セルに    =IF(B1="○",COUNTIF($B$1:B1,"○"),"")

 としてそれぞれB2000,C2000までオートフィル

 E1セルを検索BOXとし、F列に検索候補を表示するとして

 F1セルに
 =IF(ISERROR(MATCH(ROW(),C:C,0)),"",INDIRECT("C"&MATCH(ROW(),C:C,0)))

 として下にオートフィルでいかがでしょうか?

 マクロわからなくてごめんなさい。

 (ぞうちゃん)


 すみません。

 さっきの式一部訂正です。

 F1セル==IF(ISERROR(MATCH(ROW(),C:C,0)),"",INDIRECT("A"&MATCH(ROW(),C:C,0)))

 でした。

 (ぞうちゃん)


 普通にエクセルに用意されている検索との違いはなんでしょう?
 かえって面倒にも思えますけど・・・
 (momo)

 絞込み検索ってことでしょうか?

 新規ブック(Sheet1というシート名がある)にて

 標準モジュールに

 '=======================================================================
 Option Explicit
 Sub 準備()
    With Worksheets("sheet1")
       Dim r As Range
       Set r = .Range("e2:g4")
       With .OLEObjects.Add(ClassType:="Forms.ComboBox.1", Link:=False, _
           DisplayAsIcon:=False, Left:=r.Left, Top:=r.Top, Width:=r.Width, Height:=r.Height)
           .Object.MatchEntry = 2
           .Name = "ComboBox1"
       End With
       .Range("a1:a6").Value = Evaluate("{""AKIRA SATOU"";""AKITOSI SANO"";""SATOSI KITAGAWA"";" & _
                                      """HITOSI KURIHARA"";""AKI ARAI"";""AKIKO KONDOU""}")
    End With
 End Sub

 準備を実行してみてください。

 検索データ例とコントロールツールボックスのコンボボックスを作成します。

 次にSheet1のモジュールに

 '========================================================
 Dim ev As Boolean 'Changeイベントの有無フラグ True--発生可能 False---発生不可
 Private Sub ComboBox1_Change()
   Dim myvalue As Variant
   Dim rng As Range 'リストデータのセル範囲
   Dim svtext As String 'コンボボックスのTextの内容の一時保存
   If ev = True Then Exit Sub
   With OLEObjects("combobox1") '←適当な名前に変更すること
      svtext = .Object.Text
      Set rng = Range("a1", Cells(Rows.Count, 1).End(xlUp))
      If .Object.Text <> "" Then
         If rng.Count = 1 Then
            If rng.Value = "" Then
               .Object.Clear
               Exit Sub
               End If
            End If
         myvalue = Evaluate("transpose(if(mid(" & rng.Address & ",1," & Len(.Object.Text) & ")=""" _
                             & .Object.Text & """," & rng.Address & ",""" & Chr(&HFF) & """))")
         If UCase(TypeName(myvalue)) <> UCase("variant()") Then
            myvalue = Array(myvalue)
            End If
         myvalue = Filter(myvalue, Chr(&HFF), False)
         '↑あり得ない文字を使用してフィルタをおこなう
         ev = True
         .Object.Clear
         .Object.List() = myvalue
         .Object.Text = svtext
         If UBound(myvalue) >= 0 Then
            .Object.DropDown
            End If
         ev = False
         On Error Resume Next
         rng(Application.Match(.Object.Text, rng, 0)).Select
         On Error GoTo 0
      Else
         .Object.Clear
         .Visible = False
         .Visible = True
         .Activate
         End If
      End With
 End Sub

 これでコンボボックスに検索データを入力してみてください。
 検索候補が表示されます。

 ichinose
 

ぞうちゃん様、ご回答有難うございます。Bookをあまり重くしたくないので、できればマクロで考えています。しかし、書式はちゃんと動きました。ありがとうございました。

momo様、ご回答有難うございます。そうなんです、標準の検索とはホント紙一重なやり方なのです。でもその紙一重が例え3秒でも5秒であっても、先方取引先に待ちの時間は与えたくない。そういう気持ちで質問しました。申し訳ございません。

ichinose様、ご回答有難うございます。マクロを動かしてみました。このマクロは

  .Range("a1:a6").Value = Evaluate("{""AKIRA SATOU"";""AKITOSI SANO"";""SATOSI KITAGAWA"";" & _
                                      """HITOSI KURIHARA"";""AKI ARAI"";""AKIKO KONDOU""}")
このEvaluateの後ろの部分に、現在登録されている名前を全て入力しなければ動かないのでしょうか。。(2000近くあります)

 拾ってきたマクロを少し書き換えたのですが、ちょっとした問題があるので見ていただけますでしょうか。

 <UserFormのコード>

 Private Sub UserForm_Initialize()
    Set Tokuisaki = Worksheets("得意先マスタ")
    'Tokuisaki.Activate
    Maxl = Tokuisaki.UsedRange.Rows.Count
    'ListIdx = 0
    'ChangeSwitch = False

    'Call Member
    'OptionButton1.Value = True
End Sub
Private Sub CommandButton1_Click()
    Dim Namae As String
    Dim MeNamae As Object

    Namae = TextBox1.Text
    Set MeNamae = KensakuForm
    Call 検索(Namae, MeNamae)

End Sub
Private Sub CommandButton2_Click()

    End
End Sub
Public Function Kensaku(ByVal Namae As String) As Integer
    Dim kensakuSu As Integer

    kensakuSu = 0
    For l = 1 To Maxl
        If Tokuisaki.Cells(l, 3) = Namae Then
            kensakuSu = kensakuSu + 1
            Kensaku = l
        End If
    Next
End Function
Private Sub ListBox1_Click()
    'If ChangeSwitch = True Then
    '    保存忘れ防止装置
    'End If
    ListIdx = ListBox1.ListIndex
    Namae = ListBox1.List(ListIdx)
    l = Kensaku(ByVal Namae)

    'Call 個別へ表示(ByVal l)
    Tokuisaki.Cells(l, 1).Activate
End Sub

 -----------------

 <標準モジュールのコード>

Public Sub 検索(ByVal Namae As String, ByRef MeNamae As Object)

    Dim Nagasa As Integer
    Dim i As Long
    Dim MaxRows As Long
    Dim Tokuisaki As Object
    Dim KensakuChar As String
    Dim ListNamae As String
    Dim ListChar As String
    Dim KBanme As Integer
    Dim LBanme As Integer

    Set Tokuisaki = Worksheets("得意先マスタ")
    MaxRows = Tokuisaki.UsedRange.Rows.Count
    Nagasa = Len(Namae)

    MeNamae.ListBox1.Clear

    For i = 3 To MaxRows
        ListNamae = Tokuisaki.Cells(i, 3)
        KBanme = 0
        LBanme = 0
        Do
            Do While Nagasa >= KBanme
                KBanme = KBanme + 1
                KensakuChar = Mid(Namae, KBanme, 1)
                If KensakuChar <> " " Then
                    Exit Do
                End If
            Loop
            Do While Nagasa >= LBanme
                LBanme = LBanme + 1
                ListChar = Mid(ListNamae, LBanme, 1)
                If ListChar <> " " Then
                    Exit Do
                End If
            Loop

            If KensakuChar = ListChar Then
                If Nagasa = KBanme Then
                    With MeNamae
                        .ListBox1.AddItem (ListNamae)
                    End With
                End If
            Else
                Exit Do
            End If
        Loop Until Nagasa <= KBanme
    Next
End Sub

 -------------------

 問題点
 1.検索候補に同じ名前(全く同じ人)が何度も表示されてしまう。
 (同じ名前の人は入力されてますが、2人しか居ないのに10個ほど表示されてしまう)
 2.大文字と小文字を区別したくない
 3.最初の一文字入力だけで検索候補が出ますが、逐一ボタンを押さないと検索候補が
 表示されない。これをタイプした瞬間に表示させたい。

 よろしくお願いいたします。

 (ゆんぱすとーら)

 私からはイベント制御でのサンプルコードです。
 該当シートのモジュールに貼り付けで
 B1セルを検索文字の入力セル
 B3から下へHITした文字を出力します。

  Private Sub Worksheet_Change(ByVal Target As Range)
  Dim tbl, c As Long, i As Long
  If Target.Address = "$B$1" Then
    Application.EnableEvents = False
    tbl = Me.Range(Me.Range("A1"), Me.Range("A" & Me.Rows.Count).End(xlUp)).Value
    Me.Range(Me.Range("B3"), Me.Range("B3").End(xlDown)).ClearContents
    c = 2
    For i = 1 To UBound(tbl)
      If tbl(i, 1) Like Me.Range("B1").Value & "*" Then
        c = c + 1
        Me.Range("B" & c).Value = tbl(i, 1)
      End If
    Next i
    Me.Range("B1").Activate
    Application.EnableEvents = True
  End If
  End Sub

  Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  If Application.Intersect(Target, Me.Range(Me.Range("B3"), Me.Range("B3").End(xlDown))) Is Nothing Then Exit Sub
  Application.EnableEvents = False
  With Me.Columns("A")
    .Find(Target.Value, .Cells(.Cells.Count), xlValues, xlWhole, xlByRows, xlNext, False, False).Activate
  End With
  Application.EnableEvents = True
  End Sub

 (momo)

 momo様、御回答有難うございます

 >> 該当シートのモジュールに貼り付けで
 B1セルを検索文字の入力セル
 B3から下へHITした文字を出力します。

 何も反応しません。。。

 (ゆんぱすとーら)


 >このEvaluateの後ろの部分に、現在登録されている名前を全て入力しなければ動かないのでしょうか。。

 これは、A列にデータ例を設定するマクロです。
 実際には、準備を実行して、コンボボックスの作成後に
 A列に実際のデータをコピーして試してください。
 でも、ということが読み取れないようでは、この仕様自体が難しい仕様かも知れませんよ!!

 訂正があったので再度最初からコードを提示します。

 新規ブック(Sheet1というシート名がある)にて

 標準モジュールに

 '=======================================================================
 Option Explicit
 Sub 準備()
    With Worksheets("sheet1")
       Dim r As Range
       Set r = .Range("e2:g4")
       With .OLEObjects.Add(ClassType:="Forms.ComboBox.1", Link:=False, _
           DisplayAsIcon:=False, Left:=r.Left, Top:=r.Top, Width:=r.Width, Height:=r.Height)
           .Object.MatchEntry = 2
           .Object.BoundColumn = 2
           .Object.TextColumn = 1
           .Name = "ComboBox1"
       End With
       .Range("a1:a6").Value = Evaluate("{""AKIRA SATOU"";""AKITOSI SANO"";""SATOSI KITAGAWA"";" & _
                                      """HITOSI KURIHARA"";""AKI ARAI"";""AKIKO KONDOU""}")
    End With
 End Sub

 「準備」を実行してみてください。
 検索データ例とコントロールツールボックスのコンボボックスを作成します。
 データ例は実際のデータをA1から設定してください。2000行でも
 試した限りでは そんなに遅くないですよ

 次にSheet1のモジュールに

 '========================================================
 Dim ev As Boolean 'Changeイベントの有無フラグ True--発生可能 False---発生不可
 '============================================================================
 Private Sub ComboBox1_Change()
   Dim myvalue As Variant
   Dim idx As Long
   Dim g0 As Long
   Dim rng As Range 'リストデータのセル範囲
   Dim svtext As String 'コンボボックスのTextの内容の一時保存
   If ev = True Then Exit Sub
   With OLEObjects("combobox1") '←適当な名前に変更すること
      On Error Resume Next
      idx = .Object.List(.Object.ListIndex, 1)
      If Err.Number <> 0 Then idx = 0
      On Error GoTo 0
      svtext = .Object.Text
      Set rng = Range("a1", Cells(Rows.Count, 1).End(xlUp))
      If .Object.Text <> "" Then
         If rng.Count = 1 Then
            If rng.Value = "" Then
               .Object.Clear
               Exit Sub
               End If
            End If
         myvalue = Evaluate("transpose(if(mid(" & rng.Address & ",1," & Len(.Object.Text) & ")=""" _
                             & .Object.Text & """,row(" & rng.Address & "),""" & Chr(&HFF) & """))")
         If UCase(TypeName(myvalue)) <> UCase("variant()") Then
            ReDim ll(1 To 1)
            ll(1) = myvalue
            myvalue = ll()
            Erase ll()
            End If
         myvalue = Filter(myvalue, Chr(&HFF), False)
         '↑あり得ない文字を使用してフィルタをおこなう
         ev = True
         .Object.Clear
         If UBound(myvalue) >= 0 Then
            ReDim llist(1 To UBound(myvalue) + 1, 1 To 2)
            For g0 = LBound(myvalue, 1) To UBound(myvalue, 1)
               llist(g0 + 1, 2) = myvalue(g0)
               llist(g0 + 1, 1) = rng(myvalue(g0)).Value
            Next
            .Object.List() = llist()
            .Object.DropDown
         End If
         .Object.Text = svtext
         ev = False
         On Error Resume Next
         If idx > 0 Then rng(idx).Select
         On Error GoTo 0
      Else
         .Object.Clear
         .Visible = False
         .Visible = True
         .Activate
         End If
      End With
      Erase llist()
 End Sub

 これで同名の選択肢があっても選択した名前のあるセルを選択します。

 私のコードに限らず、ご自分で解析し、コードをピンポイントで指定し、質問をした方が良いですよ!!

 ichinose


 ichinose様、ご回答ありがとうございます。

 >> これは、A列にデータ例を設定するマクロです。
 実際には、準備を実行して、コンボボックスの作成後に
 A列に実際のデータをコピーして試してください。
 でも、ということが読み取れないようでは、この仕様自体が難しい仕様かも知れませんよ!!

 マクロを正常に動かすことが出来ました。この形はここに質問する前に思い描いていた理想の
 検索方法です。場所も取らず、動きも早いし、クリック数も最小限。有難うございます。仕様
 に関しては、はい、、難しいです。

 『>>このEvaluateの後ろの部分に、現在登録されている名前を全て入力しなければ
 動かないのでしょうか。。』後から読み直してみると、ichinose様がそんな仕様にするはず無い
 のに、とても失礼な言動でした。申し訳ございません。以前、GoogleMapの住所検索の件で一度
 御世話になりました。その節は大変お世話になりました。

 >>私のコードに限らず、ご自分で解析し、コードをピンポイントで指定し、質問をした方が良いですよ!!

 コードを解析する能力も、そこを指定することも、現在の私ではとても悔しいですが出来ないのです><
 せめて出来るのは、拾ってきたマクロなり書式なりを、自分のBookで動くように書き換えることくらい
 しか出来ません。そして、それすら一つの作業に1週間ほど掛かってしまう能力以上の作業なのです。
 申し訳ありません、こんな者にでも御助力いただけたら助かります。

 ・C4から検索して(C3には見出しがあります)候補をクリックしたらA列の同じ行の文字列をコピーし、
 「オーダー」シートのAM2にペーストしたい。
 ・マクロに仕事をしてもらった後、Bookを終了したときにExcel応答無しで、再起動してしまいま
   す(10回中10回)。こちらの環境でしょうか。。他のマクロが書いてあるBookでも新規Bookでも
   同じ状態です。

 質問ではA列A1からの検索で質問しています。この時点では、Rangeを書き変えるだけで自分の指定した
 範囲で検索出来るだろう、と簡単に考えていたのですが、Ichinose様から頂いたマクロを見るとどこに  
Rangeの範囲 があるのか、どこを書き変えたら指定した場所を検索してくれるのか、全く理解できません。
2度手間になってしまい本当に申し訳ありませんが、A1ではなくC4からの検索方法を御
願い出来れば、、、と、厚かましいのは重々承知しております。

どうか、よろしくお願いします。

 (ゆんぱすとーら)

 >それすら一つの作業に1週間ほど掛かってしまう能力以上の作業なのです。
 そうですか?今回は、いくつか興味深い現象が見つかったのでそのお礼ということで
 コードは提示します。

 まず、

 >マクロを見るとどこにRangeの範囲 があるのか、どこを書き変えたら指定した場所を検索してくれるのか、全く理解できません。

 これは、Sheet1のモジュールの ComboBox1_Change内に

 Set rng = Range("a1", Cells(Rows.Count, 1).End(xlUp))

 とありますね!!

 ここでセルA1からデータのあるA列のセル範囲を取得しています
 例題データでは、rngは、セルA1:A6を取得しています。

 >Bookを終了したときにExcel応答無しで、再起動してしまいます。
 これは、コンボボックスのBoundColumnとTextColumnが異なる時に
 起きていそうです。

 >A1ではなくC4からの検索方法を御願い出来れば、、、と、厚かましいのは重々承知しております。

 新規ブックにて試してみてください。

 標準モジュール(Module1)に

 '=======================================================================
 Option Explicit
 Sub 準備()
    With Worksheets("sheet1")
       Dim r As Range
       Set r = .Range("e2:g4")
       With .OLEObjects.Add(ClassType:="Forms.ComboBox.1", Link:=False, _
           DisplayAsIcon:=False, Left:=r.Left, Top:=r.Top, Width:=r.Width, Height:=r.Height)
           .Object.MatchEntry = 2
           .Object.BoundColumn = 2
           .Object.TextColumn = 1
           .Name = "ComboBox1"
       End With
       .Range("c3:c9").Value = Evaluate("{""氏名"";""AKIRA SATOU"";""AKITOSI SANO"";""SATOSI KITAGAWA"";" & _
                                      """HITOSI KURIHARA"";""AKI ARAI"";""AKIKO KONDOU""}")
    End With
 End Sub

 別の標準モジュール(Module2)に

 '===========================================================================
 Sub auto_close()
    With Worksheets("sheet1").OLEObjects("combobox1")
       .Object.Clear
    End With
 End Sub

 Sub auto_open()
    With Worksheets("sheet1").OLEObjects("combobox1")
       .Object.Value = ""
       .Object.Clear
    End With
 End Sub

 Sheet1のモジュールに

 '=====================================================================
 '========================================================
 Dim ev As Boolean 'Changeイベントの有無フラグ True--発生可能 False---発生不可
 '============================================================================
 Private Sub ComboBox1_Change()
   Dim myvalue As Variant
   Dim idx As Long
   Dim g0 As Long
   Dim rng As Range 'リストデータのセル範囲
   Dim svtext As String 'コンボボックスのTextの内容の一時保存
   If ev = True Then Exit Sub
   With OLEObjects("combobox1") '←適当な名前に変更すること
      On Error Resume Next
      idx = .Object.List(.Object.ListIndex, 1)
      If Err.Number <> 0 Then idx = 0
      On Error GoTo 0
      svtext = .Object.Text
      Set rng = Range("c4", Cells(Rows.Count, "c").End(xlUp))
      If .Object.Text <> "" Then
         If rng.Row <= 3 Then
            .Object.Clear
            Exit Sub
         End If
         myvalue = Evaluate("transpose(if(mid(" & rng.Address & ",1," & Len(.Object.Text) & ")=""" _
                             & .Object.Text & """,row(" & rng.Address & "),""" & Chr(&HFF) & """))")
         If UCase(TypeName(myvalue)) <> UCase("variant()") Then
            ReDim ll(1 To 1)
            ll(1) = myvalue
            myvalue = ll()
            Erase ll()
            End If
         myvalue = Filter(myvalue, Chr(&HFF), False)
         '↑あり得ない文字を使用してフィルタをおこなう
         ev = True
         .Object.Clear
         If UBound(myvalue) >= 0 Then
            ReDim llist(1 To UBound(myvalue) + 1, 1 To 2)
            For g0 = LBound(myvalue, 1) To UBound(myvalue, 1)
               llist(g0 + 1, 2) = myvalue(g0) - rng.Row + 1
               llist(g0 + 1, 1) = rng(myvalue(g0) - rng.Row + 1).Value
            Next
            .Object.List() = llist()
            .Object.DropDown
         End If
         .Object.Text = svtext
         ev = False
         On Error Resume Next
         If idx > 0 Then rng(idx).Select
         On Error GoTo 0
      Else
         .Object.Clear
         .Visible = False
         .Visible = True
         .Activate
         End If
      End With
      Erase llist()
 End Sub

 「準備」を実行してみてください。

 Sheet1にコンボボックスが作成され、C4:C9にサンプルデータが作成されます。
 尚、C3には、項目名(例では、「氏名」)があるものとします。
 C4以降に、データを追加・変更してもかまいません。

 ここで一度、適当な名前でこのブックを保存してください。

 一度、終了して、再度当該ブックを開いて、試してみてください。

 私の環境では、今度は、正常に作動しています。

 ichinose


 ishinose様、御回答有難うございます。

 応答なし、再起動については、10回保存→終了を試したところ1度だけ再発しましたが、概ね正常に
 終了動作するようになりました。ありがとうございます。

 1つだけ自分のBookにおいて不都合な点があります。Book起動時に一番最初にアクティブ(Sheet00)に
 なるシートを設定してあるんですが(起動時処理としてマクロ設定しています)、Ichinose様から頂
 いたマクロを動作させると、Sheet1がアクティブになって起動してしまいます。なぜ起動時処理のマ
 クロが動作しないか、なぜSeet1がアクティブになるのか皆目解りません><

 ・C4から検索して(C3には見出しがあります)候補をクリックしたら同じ行のA列を
 コピーし、Sheet2のAM2にペーストしたい。

 甘えてばかりで申し訳ありません、よろしくお願いいたします。

 (ゆんぱすとーら)


 >1つだけ自分のBookにおいて不都合な点があります。Book起動時に一番最初にアクティブ(Sheet00)に
 なるシートを設定してあるんですが

 Thisworkbookのモジュールに

 Private Sub Workbook_Open()
    Worksheets("sheet00").Activate
 End Sub

 このようなコードが記述されているのですか?

 だとしたら、

 このThisworkbookのモジュールに

 Option Explicit
 Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Dim asht As Object
    Set asht = ActiveSheet
    With Worksheets("sheet1").OLEObjects("combobox1")
       .Object.Clear
       .Object.BoundColumn = 1
       .Object.TextColumn = -1
    End With
    asht.Activate
    Set asht = Nothing
 End Sub
 Private Sub Workbook_Open()
    With Worksheets("sheet1").OLEObjects("combobox1")
       .Object.Value = ""
       .Object.Clear
       .Object.BoundColumn = 2
       .Object.TextColumn = 1
    End With
    Worksheets("sheet00").Activate
 End Sub

 このようにして、標準モジュールにある

 Auto_Open とAuto_Closeは、削除してください。

 ・C4から検索して(C3には見出しがあります)候補をクリックしたら同じ行のA列を
  コピーし、Sheet2のAM2にペーストしたい。

 Sheet1のモジュールにあるComboBox1_Changeを

Option Explicit
'========================================================

 Dim ev As Boolean 'Changeイベントの有無フラグ True--発生可能 False---発生不可
 '============================================================================
 Private Sub ComboBox1_Change()
   Dim myvalue As Variant
   Dim idx As Long
   Dim g0 As Long
   Dim rng As Range 'リストデータのセル範囲
   Dim svtext As String 'コンボボックスのTextの内容の一時保存
   If ev = True Then Exit Sub
   With OLEObjects("combobox1") '←適当な名前に変更すること
      On Error Resume Next
      idx = .Object.List(.Object.ListIndex, 1)
      If Err.Number <> 0 Then idx = 0
      On Error GoTo 0
      svtext = .Object.Text
      Set rng = Range("c4", Cells(Rows.Count, "c").End(xlUp))
      If .Object.Text <> "" Then
         If rng.Row <= 3 Then
            .Object.Clear
            Exit Sub
         End If
         myvalue = Evaluate("transpose(if(mid(" & rng.Address & ",1," & Len(.Object.Text) & ")=""" _
                             & .Object.Text & """,row(" & rng.Address & "),""" & Chr(&HFF) & """))")
         If UCase(TypeName(myvalue)) <> UCase("variant()") Then
            ReDim ll(1 To 1)
            ll(1) = myvalue
            myvalue = ll()
            Erase ll()
            End If
         myvalue = Filter(myvalue, Chr(&HFF), False)
         '↑あり得ない文字を使用してフィルタをおこなう
         ev = True
         .Object.Clear
         If UBound(myvalue) >= 0 Then
            ReDim llist(1 To UBound(myvalue) + 1, 1 To 2)
            For g0 = LBound(myvalue, 1) To UBound(myvalue, 1)
               llist(g0 + 1, 2) = myvalue(g0) - rng.Row + 1
               llist(g0 + 1, 1) = rng(myvalue(g0) - rng.Row + 1).Value
            Next
            .Object.List() = llist()
            .Object.DropDown
         End If
         .Object.Text = svtext
         ev = False
         On Error Resume Next
         If idx > 0 Then
            rng(idx).Select
            Worksheets("sheet2").Range("am2").Value = rng(idx).Offset(0, -2).Value
            '↑追加変更箇所
         End If
         On Error GoTo 0
      Else
         .Object.Clear
         .Visible = False
         .Visible = True
         .Activate
         End If
      End With
      Erase llist()
 End Sub

 ichinose 


 こんにちは。

 > コードを解析する能力も、そこを指定することも、現在の私ではとても悔しいですが出来ないのです><
 >  せめて出来るのは、拾ってきたマクロなり書式なりを、自分のBookで動くように書き換えることくらい
 >  しか出来ません。

 たぶん、自分の実力とかけ離れたことをしようとしているからです。
 悪い意味に取らないで下さいね。
 はじめてプールに入る子供に いきなりバタフライの泳ぎ方を教えるでしょうか? 教えませんね。
 でも、段階を追って少しずつ教えれば、子供もいずれバタフライを泳げるようになります。
 段階を追って がポイントです。

 VBAも同じです。自分の実力よりほんの少し難しいことを、独力で実現してみる。
 それを何度も何度も繰り返しながら、少しずつ前に進んでいくのです。
 もちろん実力とかけ離れたことを望んでいけないわけではありません。
 仕事ははかどります。
 でもそれは実力向上にはあまり役に立たないと自覚して、使い分けるのがかしこいやり方です。

 −佳−

 ichinose様、御回答ありがとうございます。

 出来ました!やっと自分のイメージ通りのBookが出来ました!長かったです、時間が空いたときに少し
 づつより良く使いやすいように作り始めて約1年たってしまいました。ここの学校に質問をしたのは、
 頭の中に「こりゃどう見ても無理だ」と感じた4回ですが、こんな私ごとの為に、貴重なお時間を削っ
 て頂き、本当に感謝しております。再度、有難うございました。

 佳様、ありがとうございます。自分の実力とかけ離れたことをしているのは重々承知です。開き直っ
 ているわけではなく、分は弁えております。ここは悔しいですが今現在は、、としておきます。御助
 言頭に叩き込んでおきます。有難うございます。     

 (ゆんぱすとーら)

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.