Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


5086 / 13646 ツリー ←次へ | 前へ→

【52615】Rangeの使用方法 美貴 07/11/21(水) 17:51 質問[未読]
【52616】Re:Rangeの使用方法 かみちゃん 07/11/21(水) 18:17 発言[未読]
【52634】Re:Rangeの使用方法 美貴 07/11/22(木) 13:11 質問[未読]
【52636】Re:Rangeの使用方法 かみちゃん 07/11/22(木) 21:34 発言[未読]
【52679】Re:Rangeの使用方法 美貴 07/11/26(月) 10:05 発言[未読]
【52707】Re:Rangeの使用方法 ハチ 07/11/27(火) 9:08 発言[未読]
【52708】Re:Rangeの使用方法 美貴 07/11/27(火) 10:35 発言[未読]
【52709】Re:Rangeの使用方法 ハチ 07/11/27(火) 11:14 回答[未読]
【52711】Re:Rangeの使用方法 美貴 07/11/27(火) 12:02 お礼[未読]

【52615】Rangeの使用方法
質問  美貴  - 07/11/21(水) 17:51 -

引用なし
パスワード
   こんにちはー
いつもお世話になっております。ペコリ

lookupウイザードを自前で作ろうとしたのですが、
Rangeの使い方が悪くって、先へ進めません (>_<)
オブジェクトを指定下さい。とかのエラーが
出てしまいます。
もう、何がなんだか分かりません!!
ご教示お願い致しますぅ〜


Sub lookupウイザード()
'
'
  検索行 = ""
  検索行 = Application.InputBox("検索行の先頭セルを入力して下さい。", _
      タイトル, ActiveCell.Offset(0, -1).Address(False, True, xlA1, False), _
      offset値x, offset値y, , , 8) _
      .Address(False, False, xlA1, True)
  If 検索行 = "" Then
    Exit Sub
  End If
  

  検索列 = ""
  検索列 = Application.InputBox("検索列の先頭セルを入力して下さい。", タイトル, _
      ActiveCell.Offset(1, -1).Address(False, True, xlA1, False), offset値x, offset値y, , , 8) _
      .Address(False, False, xlA1, True)
  If 検索列 = "" Then
    Exit Sub
  End If

'ここでエラー!! 

検索対象 = Range(Cells(検索行.Row, 検索列.Column), Cells(検索行.Row + 1000, 検索列.Column + 200))
対象行ベクトル = Range(Cells(検索行.Row, 検索行.Column), Cells(検索行.Row + 1000, 検索行.Column))
対象列ベクトル = Range(Cells(検索列.Row, 検索列.Column), Cells(検索列.Row, 検索列.Column + 200))


  数式 = "=INDEX(" & 検索対象.Address(True, True, xlA1, True) & ",MATCH($A4," _
        & 対象行ベクトル.Address(True, True, xlA1, True) & ",0),MATCH(E$2," _
        & 対象列ベクトル.Address(True, True, xlA1, True) & ",0))"
        
 MsgBox 数式
  ActiveCell.Formula = 数式


End Sub

【52616】Re:Rangeの使用方法
発言  かみちゃん  - 07/11/21(水) 18:17 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>もう、何がなんだか分かりません!!

モジュールの先頭に、
Option Explicit
を記述して、変数の宣言を強制的にしてください。

本当は、
変数「検索行」「検索列」の設定の仕方をもっと簡単にすることができるのですが、
まずは、変数の宣言をきちんとしてみましょう。
そうでないと、Excelも「もう、何がなんだか分かりません」と悲鳴を上げてしまいます。

とりあえず、
検索対象 = Range(Cells(検索行.Row, 検索列.Column), Cells(検索行.Row + 1000, 検索列.Column + 200))
の部分を
Set 検索対象 = Range(Cells(Range(検索行).Row, Range(検索列).Column), Cells(Range(検索行).Row + 1000, Range(検索列).Column + 200))
とすることで、とりあうず、対応できます。
以下、変数「検索行」「検索列」について、扱い方は同じ。

【52634】Re:Rangeの使用方法
質問  美貴  - 07/11/22(木) 13:11 -

引用なし
パスワード
   かみちゃん さん
ありがとうございます。

色々やって無理やりできるようにはなったのですが、
検索行、検索列をアクティブでないブックのセル番地を
指定したときに、その絶対参照がNGです。
下記では、無理やりブック名、シート名を置換しています。
多分もっとスマートな方法があると思いますが
お時間ございましたら、ご教示お願い致します。^^;


'
Sub lookupウイザード()
'
'
  Dim 数式, 置換後
  Dim 検索列, 検索行, 検索対象, 対象行ベクトル, 対象列ベクトル
  Dim 原価センタ開始位置, 勘定コード開始位置, ブック, シート


原価センタ開始位置 = "E$2"
勘定コード開始位置 = "$A4"
ブック = ActiveWorkbook.Name
シート = ActiveSheet.Name


  検索行 = ""
  検索行 = Application.InputBox("検索行の先頭セルを入力して下さい。", _
      , , _
      offset値x, offset値y, , , 8) _
      .Address(True, True, xlA1, True)
  If 検索行 = "" Then
    Exit Sub
  End If
  

  検索列 = ""
  検索列 = Application.InputBox("検索列の先頭セルを入力して下さい。", , _
      , offset値x, offset値y, , , 8) _
      .Address(True, True, xlA1, True)
  If 検索列 = "" Then
    Exit Sub
  End If

置換後 = Left(Range(検索行).Address(True, True, xlA1, True), InStr(Range(検索行).Address(True, True, xlA1, True), "!") - 1)

Set 検索対象 = Range(Cells(Range(検索行).Row, Range(検索列).Column), Cells(Range(検索行).Row + 1000, Range(検索列).Column + 200))
Set 対象行ベクトル = Range(Cells(Range(検索行).Row, Range(検索行).Column), Cells(Range(検索行).Row + 1000, Range(検索行).Column))
Set 対象列ベクトル = Range(Cells(Range(検索列).Row, Range(検索列).Column), Cells(Range(検索列).Row, Range(検索列).Column + 200))


 数式 = "=INDEX(" & 検索対象.Address(True, True, xlA1, True) & ",MATCH(" & 勘定コード開始位置 & "," _
        & 対象行ベクトル.Address(True, True, xlA1, True) & ",0),MATCH(" & 原価センタ開始位置 & "," _
        & 対象列ベクトル.Address(True, True, xlA1, True) & ",0))"
        
 数式 = Replace(数式, "[" & ブック & "]" & シート, 置換後)
        
  ActiveCell.Formula = 数式


'
End Sub

【52636】Re:Rangeの使用方法
発言  かみちゃん  - 07/11/22(木) 21:34 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>色々やって無理やりできるようにはなった

モジュールの先頭に、
Option Explicit
を記述して、変数の宣言を強制的にしてみたのでしょうか?
変数offset値x, offset値y
の宣言と代入ができていないようですが・・・

>検索行、検索列をアクティブでないブックのセル番地を
>指定したときに、その絶対参照がNGです。

これの意味がわかりません。

>多分もっとスマートな方法があると思いますが

そもそもどういうことがしたいのでしょうか?

【52679】Re:Rangeの使用方法
発言  美貴  - 07/11/26(月) 10:05 -

引用なし
パスワード
   ▼かみちゃん さん

おはようございます。
お手数おかけします!^^;

>Option Explicitは、記述しました。

私がやりたいことですが、ブックを2つ開いておいて
片方(A)の行、列の見出し
原価センタ開始位置 = "E$2"
勘定コード開始位置 = "$A4"
と一致するセルをもう一方のブック(B)から取得するものです。

ブック(B)の検索範囲を特定するために
検索開始行、検索開始列のアドレス入力を求めています。

結果の数式内で、
ブック(B)のセルアドレスを絶対参照にしたいのですが、
うまく行かず、(A)のブック名、シート名が代入されてしまいます。
それで、仕方なく強制的に
 数式 = Replace(数式, "[" & ブック & "]" & シート, 置換後)
で、置換しました。

ちなみに、Excelオリジナルの「lookupウイザード」は、
検索開始行、検索開始列が、検索範囲と一体のセル範囲に固定
されていますので、使用不可なんです。
なので、今回自分で作ろうとしています。

長々とすみません。
どうぞ、よろしくお願い致します。m(__)m

【52707】Re:Rangeの使用方法
発言  ハチ  - 07/11/27(火) 9:08 -

引用なし
パスワード
   ▼美貴 さん:
>▼かみちゃん さん
>
>おはようございます。
>お手数おかけします!^^;
>
>>Option Explicitは、記述しました。
>
>私がやりたいことですが、ブックを2つ開いておいて
>片方(A)の行、列の見出し
>原価センタ開始位置 = "E$2"
>勘定コード開始位置 = "$A4"
>と一致するセルをもう一方のブック(B)から取得するものです。
>
>ブック(B)の検索範囲を特定するために
>検索開始行、検索開始列のアドレス入力を求めています。
>
>結果の数式内で、
>ブック(B)のセルアドレスを絶対参照にしたいのですが、
>うまく行かず、(A)のブック名、シート名が代入されてしまいます。
>それで、仕方なく強制的に
> 数式 = Replace(数式, "[" & ブック & "]" & シート, 置換後)
>で、置換しました。
>
>ちなみに、Excelオリジナルの「lookupウイザード」は、
>検索開始行、検索開始列が、検索範囲と一体のセル範囲に固定
>されていますので、使用不可なんです。
>なので、今回自分で作ろうとしています。
>
>長々とすみません。
>どうぞ、よろしくお願い致します。m(__)m

横から失礼します。

最終的に生成したい関数はどんな文字列になるのでしょうか?
ウィザードとして使用するなら、
UserFormで作ったほうが良いのでは?

【52708】Re:Rangeの使用方法
発言  美貴  - 07/11/27(火) 10:35 -

引用なし
パスワード
   ▼ハチ さん

ありがとうございます。

>最終的に生成したい関数はどんな文字列になるのでしょうか?

ブックAのシートaが参照元、ブックBのシートbが参照先
としますと、

=INDEX('C:\[B.xls]b'!$D$311:$AH$612,MATCH($A4,'C:\[B.xls]b'!$B$311:$B$612,0),MATCH(E$2,'C:\[B.xls]b'!$D$7:$AH$7,0))
のようにしたいです。

>ウィザードとして使用するなら、
>UserFormで作ったほうが良いのでは?
そうですね。
うなくいったら、バージョンアップしてみます ^^;

【52709】Re:Rangeの使用方法
回答  ハチ  - 07/11/27(火) 11:14 -

引用なし
パスワード
   ▼美貴 さん:

>ブックAのシートaが参照元、ブックBのシートbが参照先
>としますと、
>
>=INDEX('C:\[B.xls]b'!$D$311:$AH$612,MATCH($A4,'C:\[B.xls]b'!$B$311:$B$612,0),MATCH(E$2,'C:\[B.xls]b'!$D$7:$AH$7,0))
>のようにしたいです。

前レスに
>私がやりたいことですが、ブックを2つ開いておいて
とありますので、パス名は要らないような気もします。

>>ウィザードとして使用するなら、
>>UserFormで作ったほうが良いのでは?
>そうですね。
>うなくいったら、バージョンアップしてみます ^^;

これは「後から見直せる」という意味だけではなくて、
Application.InputBoxだと
他のBookの参照がうまくいかないからです。
(記憶違いならスイマセン)

UserFormにTextBox1,CommandButton1を配置
下記のコードを試してみてください。
モードレスにしたいのでSub Mainで呼び出してください。
エラー処理はテキトーですので、適時追加してください。

'標準モジュール
Sub Main()
  UserForm1.Show False
End Sub

'UserForm1モジュール
Option Explicit

Private Sub CommandButton1_Click()
  
  If TypeName(Selection) <> "Range" Then
    MsgBox "セルの範囲を選択してください"
    Exit Sub
  End If
  
  Me.TextBox1.Value = func_To_Adr(Selection)
End Sub

Private Function func_To_Adr(Rng As Range) As String
  Dim Str As String
  
  Str = "'" & Rng.Parent.Parent.Path 'Path
  Str = Str & "\[" & Rng.Parent.Parent.Name & "]"  'Book名
  Str = Str & Rng.Parent.Name & "'!"  'WorkSheet名
  Str = Str & Rng.Address(0, 0)  'セルのアドレス
  
  func_To_Adr = Str
End Function

【52711】Re:Rangeの使用方法
お礼  美貴  - 07/11/27(火) 12:02 -

引用なし
パスワード
   ▼ハチさん、みなさま

ありがとうございます。

UserFormだと、うまくいきますね!
しかし、手軽なApplication.InputBoxがうまくいかないのは
困りものです^_^;

どうも、ありがとうございました。

5086 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free