人に聞けない痔の悩み、これでスッキリ >>

セルを結合しているセルに、値が入っていて、
その値を検索して列番号を取得したいのですが
エラーになります。

A1セルとA2セルを結合して、
「a」をいれて

Sub test()
MsgBox Cells.Find(What:="a", LookAt:=xlWhole).Column
MsgBox Rows("1:2").Find(What:="a", LookAt:=xlWhole).Column
End Sub

をしても、どちらもエラーになります。

実行時エラー91「オブジェクト変数またはWithブロック変数が設定されていません」
というエラーです。

でもB1に「a」を入れれば、問題なく2が返されます。

結合されててもセルを検索する方法を教えてください。

「vba 結合されたセルの列番号を取得した」の質問画像

A 回答 (3件)

今まで結合セルと設けたシートで検索を使ってきて問題がなかったのですが、お示しの例でやってみると確かにエラーになり、悩んでしまいました。


結論としては、結合セルの先頭セル以外のセルを起点に検索をかけようとすると、エラーになる様です。
当方の用いているワークシートでは先頭セルは結合してありませんので、問題なかったのですね。ご参考まで。
Sub test()
'a1:a2結合
Dim c As Range

'afterを指定しないと、expression(Cellsなので、A1セル)の左上セルを指定したことになる
Set c = Cells.Find(what:="a", lookat:=xlWhole)
If c Is Nothing Then Debug.Print "Test1 みつかりません"

Set c = Cells.Find(what:="a", after:=Range("A1"), lookat:=xlWhole)
If c Is Nothing Then Debug.Print "Test2 みつかりません"

Set c = Cells.Find(what:="a", after:=Range("A2"), lookat:=xlWhole)
If c Is Nothing Then Debug.Print "Test3 みつかりません"
End Sub
'結果
'Test1 みつかりません
'test2 みつかりません

Sub test2()
'a2:a3結合
Dim c As Range

Set c = Cells.Find(what:="a", lookat:=xlWhole)
If c Is Nothing Then Debug.Print "Test1 みつかりません"

Set c = Cells.Find(what:="a", after:=Range("A1"), lookat:=xlWhole)
If c Is Nothing Then Debug.Print "Test2 みつかりません"

Set c = Cells.Find(what:="a", after:=Range("A2"), lookat:=xlWhole)
If c Is Nothing Then Debug.Print "Test3 みつかりません"
End Sub
'結果
'Test3 みつかりません
    • good
    • 0
この回答へのお礼

回答ありがとうございました。

お礼日時:2013/05/02 22:25

#2です。

推敲不足で申し訳ありません。下記が正しいです。
'afterを指定しないと、expressionの左上セル(ここでは対象がCellsなので、A1セル)を指定したことになる
    • good
    • 0
この回答へのお礼

回答ありがとうございました。

お礼日時:2013/05/02 22:25

A1とA2を結合して"A"と入力しても、"A"が入力されているのはA1のみでA2は空欄のままです。

ただ、表示上結合されているだけです。

自宅PCにExcelがインストールされていないので確認してませんが

Sub test
Dim SRange As Range
Set SRange = Cells.Find(What:="a",LookAt:=xlWhole)
MsgBox SRange.Column
End Sub

で、出ませんか?
    • good
    • 0
この回答へのお礼

回答ありがとうございました。

お礼日時:2013/05/02 22:25

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q結合させた状態で、vbaで列番号を取得する方法

A1とA2を結合させた状態で、vbaで列番号を取得する方法はありますか?

この状態で
Sub Sample()
Dim 列 As Long
列 = Rows(1).Find(What:="検索文字", LookAt:=xlWhole).Column
End Sub

をすると、エラーになります。

結合を解除すれば、1が返ります。
結合させた状態でなおかつ列番号を取得する方法をご教授下さい。

Aベストアンサー

次のようにすればよいでしょう。

Sub Sample()
Dim 列 As Long
列 = WorksheetFunction.Match("検索文字", Range("1:1"), 0)
End Sub

Q結合セルの中身を検索する

お世話になっております

Excel2003でFindメソッドを使って結合したセルの中身を検索したところ、Nothingが返ってきます

結合を解くと検索できるので、コードが悪いわけではないと思います

以前教えていただいた、VBAマイグレーションには引数SearchOrderにxlByColumnsを指定すると結合セルの中身を検索できないとありますが、SearchOrderにはxlByRowsを指定しています

結合したセルの中身ってFindで検索できないんでしょうか?

Aベストアンサー

こんにちは。KenKen_SP です。

Set Rng = WS.Columns(ColNo).Find(what:=Data, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext)

このコードと補足いただいた状況を試しましたが、Excel2002でも Nothing に
なりますね。

どうもA列とB列の結合セルが ColNo 1 にあるのか 2 なのかうまく VBA が判断
できてないみたいです。これが規定の動作かもしれません。

回避策としては、Find での検索範囲を Cells に広げて、見つかった rng を
Intersect(rng, Columns(ColNo)) で Nothing とならなければ良し、とする方法
を考えてみました。

サンプルをアップしますが、動作するコードということで余計な部分を付け足し
てありますが、ご参考下さい。

それから蛇足ですが、Find メソッドは LookIn も明示的に指定した方が良いで
しょう。詳しくはヘルプをみて下さい。

Sub Sample()

  Dim rng   As Range
  Dim WS    As Worksheet
  Dim ColNo  As Long
  Dim DATA   As String
  Dim strFIRST As String
  Dim flag   As Boolean
  
  Set WS = Sheet1
  ColNo = 1
  DATA = "検索文字列"
  
  
  'ここから---------------------------------
  
  '一度セル全体で検索する
  Set rng = WS.Cells.Find( _
    What:=DATA, _
    LookIn:=xlValues, _
    LookAt:=xlPart, _
    SearchOrder:=xlByRows, _
    SearchDirection:=xlNext)
  
  '見つかったらそれが Intersect で ColNo の列と交差するか調べ
  '交差するばOK、、しなければ見つからなくなるまで再検索
  If Not rng Is Nothing Then
    strFIRST = rng.Address
    Do
      If Not Intersect(rng, Columns(ColNo)) Is Nothing Then
        flag = True
        Exit Do
      Else
        Set rng = WS.Cells.FindNext(rng)
      End If
    Loop While Not rng Is Nothing And rng.Address <> strFIRST
    If flag Then
      MsgBox "Found Row Number:=" & rng.Row
    End If
  End If

End Sub

こんにちは。KenKen_SP です。

Set Rng = WS.Columns(ColNo).Find(what:=Data, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext)

このコードと補足いただいた状況を試しましたが、Excel2002でも Nothing に
なりますね。

どうもA列とB列の結合セルが ColNo 1 にあるのか 2 なのかうまく VBA が判断
できてないみたいです。これが規定の動作かもしれません。

回避策としては、Find での検索範囲を Cells に広げて、見つかった rng を
Intersect(rng, Columns(ColNo)) で Nothing ...続きを読む

QExcel VBA。結合されたセルの行数を取得しその行内の列単位で検索する方法をご教授ください。

B列がところどころ結合されているデータがあります。
※ 結合されていない行もあります。

例として、B1~B4(4行)が結合されていた場合、
1行目から4行目までの範囲で列検索を行ないたいと思っています。

Dim i As Long
If Cells(i, "B").MergeCells Then

一部分のみですみません。
行検索を行ない、B列が結合セルだったら、
Rows(i)(1~4行目)の、「列単位」で検索し(列はD列以降が検索対象)、
D列(D1~D4)に一箇所でも「○」が入力されていたら、D1に「○」と入力し、
E列以降の列にも同じ処理を繰り返したいです。

いろいろ試してみたのですがうまくいきませんでした。
検索方法を教えていただけたら幸いです。よろしくお願いします。

Aベストアンサー

質問を読み違えていました。ユーザ定義関数ではできませんので、マクロでの実装です。

Sub sample()
Dim I As Long
Dim J As Long
Dim M As Long
Dim R As Range
I = 1
Do While I <= Cells.SpecialCells(xlCellTypeLastCell).Row
If Cells(I, "B").MergeCells Then
M = Cells(I, "B").MergeArea.Rows.Count
For J = 4 To Cells.SpecialCells(xlCellTypeLastCell).Column
Set R = Range(Cells(I, J), Cells(I + M - 1, J))
If WorksheetFunction.CountIf(R, "○") > 0 Then
Cells(I, J).Value = "○"
End If
Next J
I = I + M
Else
I = I + 1
End If
Loop
End Sub

質問を読み違えていました。ユーザ定義関数ではできませんので、マクロでの実装です。

Sub sample()
Dim I As Long
Dim J As Long
Dim M As Long
Dim R As Range
I = 1
Do While I <= Cells.SpecialCells(xlCellTypeLastCell).Row
If Cells(I, "B").MergeCells Then
M = Cells(I, "B").MergeArea.Rows.Count
For J = 4 To Cells.SpecialCells(xlCellTypeLastCell).Column
Set R = Range(Cells(I, J), Cells(I + M - 1, J))
...続きを読む

QEXCEL VBA:結合セルのデータを取り出すには?

結合セルに書き込まれている文字列を取得したいのですが、
何か良い方法はありますか?

以下のような方法をとってみたのですが、
イマイチうまくいきませんでした。。。

Dim iRow as Integer
Dim strData as String

iRow = 1
strData = Cells(iRow, 1).MergeArea.Value

どなたかご教授頂けないでしょうか?
何卒よろしくお願いします。

Aベストアンサー

MergeAreaで取得したセルの位置を特定しないといけませんね
通常は結合セルの先頭のみのデータが対象でしょうから
strData = Cells(iRow,i).MergeArea( 1, 1).Value
といった具合でしょう

iRowの更新は
iRow = iRow + Cells(iRow,i).MergeArea.Rows.Count
といった具合でしょう

QVBAでの結合セルのコピー&ペースト

こんにちは。
EXCELのVBAでマクロを作成しています。
セルの値のコピー&ペーストを行おうとしているのですが、結合されているセルのペーストのときに、「同じ結合セルが必要です」とエラーになってしまいます。
例えば、A1とA2が結合されたセル+A3をコピー
Worksheets(x).Activate

Range("A1:A3").Selection
Range("A1:A3").Copy

別のシートで、B1とB2が結合されたセル+B3にペースト
Worksheets(y).Activate
Range("B1:B3").Paste


セルの結合を解除すればうまくいきます・・・
セルを結合したままペーストしたいのですが、どうやら間違っているようです(ノ_・。)
どなたか教えてください。
よろしくお願いします。

Aベストアンサー

nao_linさんこんにちは。merlionXXです。

> 値だけ貼付けのオプションをつけるとエラーになってしまうのは何故なのでしょうか?

結合セルの値貼り付けは無理のようですね。↓
http://support.microsoft.com/default.aspx?LN=JA&scid=kb;ja;JP416846

Qエクセル:マクロ「Application.CutCopyMode = False」って?

エクセルのマクロを記録していると

「Application.CutCopyMode = False」

というものがよく出てきますが、これは何でしょう?
どういう意味のものかわかりません。
削除しても差し支えないのもでしょうか?

Aベストアンサー

「Application.CutCopyMode = False」の前で
セルのコピー、または切り取りを行っていると思います。
これは、その操作(セルのコピー、または切り取り)を無効にしているだけです。
------------
Range("A1").Select
Selection.Copy ← これを無効にしている
Range("A2").Select
ActiveSheet.Paste
Application.CutCopyMode = False
------------
上記の場合であれば、「Application.CutCopyMode = False」を削除しても問題ありませんが、
以下の場合、貼り付け処理でエラーになります。
------------
Range("A1").Select
Selection.Copy
Range("A2").Select
Application.CutCopyMode = False
ActiveSheet.Paste ← ココでエラー
------------
ご自分で、セルをコピーしてみると分かると思いますが、コピーした範囲が点線で点滅されます。
「Application.CutCopyMode = False」をすると、
その点滅がなくなります。

「Application.CutCopyMode = False」の前で
セルのコピー、または切り取りを行っていると思います。
これは、その操作(セルのコピー、または切り取り)を無効にしているだけです。
------------
Range("A1").Select
Selection.Copy ← これを無効にしている
Range("A2").Select
ActiveSheet.Paste
Application.CutCopyMode = False
------------
上記の場合であれば、「Application.CutCopyMode = False」を削除しても問題ありませんが、
以下の場合、貼り付け処理でエラーになります。
------------
...続きを読む

QVBA 実行時エラー1004 rangeメソッドは失敗しました。globalオブジェクトのエラー

始めまして、VBA初心者のものです。
ただいまエクセルでグラフを作成しています。作業自体は単純作業の繰り返しなのでVBAを用いてやりたいのですが、マクロを実行したときに実行時エラー’1004’rangeメソッドは失敗しました。’_global’オブジェクトとメッセージが出て、実行できません。 デバックをすると以下の5行目で黄色のバーが出ていました。自分なりに原因を考えたのですがrangeの関係するところに、Range("A8:A1587,e8:e1587")というような変数を用いないやり方でやると上手くいくので、変数に関する定義がまずいと思うのですが、それ以上の事は分かりません。どなたか、分かる方がおりましたら、よろしくお願いします。また、プログラムは以下のようになります。

Sub 繰り返し()
'繰り返し
Dim s As Integer
For s = 0 To 17
Range("cells(8,1):cells(1580,1),cells(8,s+2):cells(1580,s+2)").Select
Range("cells(8,s+2)").Activate
Charts.Add
ActiveChart.ChartType = xlXYScatter
ActiveChart.SetSourceData Source:=Sheets("20081216_210647").Range( _
"cells(8,1):cells(1580,1),cells(8,s+2):cells(1580,s+2)"), PlotBy:=xlColumns
ActiveChart.SeriesCollection(1).Name = "=""0810p2x"""
ActiveChart.Location Where:=xlLocationAsNewSheet, Name:="0810p2x"
With ActiveChart
.HasTitle = True
.ChartTitle.Characters.Text = "0810p2x"
.Axes(xlCategory, xlPrimary).HasTitle = True
.Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "t"
.Axes(xlValue, xlPrimary).HasTitle = False
End With
Next
End Sub

始めまして、VBA初心者のものです。
ただいまエクセルでグラフを作成しています。作業自体は単純作業の繰り返しなのでVBAを用いてやりたいのですが、マクロを実行したときに実行時エラー’1004’rangeメソッドは失敗しました。’_global’オブジェクトとメッセージが出て、実行できません。 デバックをすると以下の5行目で黄色のバーが出ていました。自分なりに原因を考えたのですがrangeの関係するところに、Range("A8:A1587,e8:e1587")というような変数を用いないやり方でやると上手くいくので、変数に関する定義...続きを読む

Aベストアンサー

>ご指摘を受けたところを書き換えて回してみた結果、書き換えた箇所
>でエラーがでます。(実行時エラー’1004’’cells’メソッドは失敗
>しました。’global’オブジェクト)
>しかし、何が原因でエラーになるか自分では分かりません。

≪例1≫
Range(Cells(8, 1), Cells(1587, 2)).Select
上記の例では、RangeとかCellsの上位オブジェクトであるシート名が省略されています。
ActiveSheet.Range(ActiveSheet.Cells(8, 1), ActiveSheet.Cells(1587, 2)).Select
というわけです。
マクロ実行時に、Activeな(Excelで表示されている)シートが上位オブジェクトとして、自動的に認識されます。

≪例2≫
Sheets("Sheet2").Range(Cells(8, 1), Cells(1587, 2)).Select
上記の例では、Rangeのみシート名が記述されています。
Sheets("Sheet2").Range(ActiveSheet.Cells(8, 1), ActiveSheet.Cells(1587, 2)).Select
というわけです。
Activeなシートが、Sheet2の場合はエラーになりません。
しかし、ActiveなシートがSheet2以外の場合、エラーが発生します。
直前に、
Sheets("Sheet1").Select
などとしていれば、ActiveシートがSheet1になっていますから、エラーになります。

Sheets("Sheet2").Range(Sheets("Sheet2").Cells(8, 1), Sheets("Sheet2").Cells(1587, 2)).Select
と書いておけば安心です。
Withステートメントを使えばスッキリ纏めることができます。
With Sheets("Sheet2")
  .Range(.Cells(8, 1), .Cells(1587, 2)).Select
End With

# Sheets("Sheet2")の上位オブジェクトが省略されていることにも気がついてください。

>そこで自分で基礎を勉強したいのですが推薦できる参考書などがござ
>いましたら、教えていただけませんか?
私自身は、入門書程度の雑誌を1冊買っただけです。どれが良いとかはよく分かりません。
「マクロの記録」を活用して、参考コードを取得し、汎用性のあるコードに編集しています。
新しい単語があれば、文字カーソルを単語の上に置き、F1キーを押してVBAのヘルプを必ず見るようにしています。
躓いた時は、Web検索して欲しい情報を得たり、あるいは、こうした掲示板で先輩方のお力をお借りしています。

Excel(エクセル)VBA入門:目次
http://oshiete1.goo.ne.jp/kotaeru_reply.php3?q=4651404
エクセル入門・初級編
http://www.kenzo30.com/excel_kiso.htm

>ご指摘を受けたところを書き換えて回してみた結果、書き換えた箇所
>でエラーがでます。(実行時エラー’1004’’cells’メソッドは失敗
>しました。’global’オブジェクト)
>しかし、何が原因でエラーになるか自分では分かりません。

≪例1≫
Range(Cells(8, 1), Cells(1587, 2)).Select
上記の例では、RangeとかCellsの上位オブジェクトであるシート名が省略されています。
ActiveSheet.Range(ActiveSheet.Cells(8, 1), ActiveSheet.Cells(1587, 2)).Select
というわけです。
マクロ実行時に、Activeな...続きを読む

QVBAで行コピーして挿入

1行目の内容をコピーして、他の場所に指定数分だけ
挿入するマクロを作りました。

そのマクロ自体は、正しく動いたのですが、コピー元の1行目に
他のシートを参照する関数が入っていた場合、想定どおりの
結果を得ることができません。

[SHEET1:データのみを記載]
省略

[SHEET2]
A1セル:   =SHEET1!$A1 ←コピー元の行

[マクロ:一部抜粋]
myR = Application.InputBox("挿入する行数を入れてください", , "1")

For i = 1 To myR
  Rows("1:1").Copy
  Cells(ActiveCell.Row, 1).Select
  Selection.Insert Shift:=xlDown
  Selection.EntireRow.Hidden = False
Next i

どういう結果を求めたいかというと、たとえば、
SHEET2のA10セル上で、このマクロを実行し、 "挿入行 = 3" と指定したら

A10:   =SHEET1!$A10
A11:   =SHEET1!$A11
A12:   =SHEET1!$A12

となってほしかったのですが、結果は、

A10:   =SHEET1!$A10
A11:   =SHEET1!$A10
A12:   =SHEET1!$A10

となってしまいました。

どうにか、求める結果を得られるようにできないでしょうか?

1行目の内容をコピーして、他の場所に指定数分だけ
挿入するマクロを作りました。

そのマクロ自体は、正しく動いたのですが、コピー元の1行目に
他のシートを参照する関数が入っていた場合、想定どおりの
結果を得ることができません。

[SHEET1:データのみを記載]
省略

[SHEET2]
A1セル:   =SHEET1!$A1 ←コピー元の行

[マクロ:一部抜粋]
myR = Application.InputBox("挿入する行数を入れてください", , "1")

For i = 1 To myR
  Rows("1:1").Copy
  Cells(ActiveCell.Row, 1).S...続きを読む

Aベストアンサー

Active.Cellが同一の位置なのだから相対変位しません。

一例です。(ループは不要なので削除しました)
myR = Application.InputBox("挿入する行数を入れてください", , "1")
Rows("1:1").Copy
Rows(ActiveCell.Row & ":" & ActiveCell.Row + myR - 1).Select
Selection.Insert Shift:=xlDown
Application.CutCopyMode = False

QSub ***( ) と Private Sub ***( ) の違い

初歩的な質問で申し訳ありませんが・・・

自分でコードを書いていても、イベントが発生したりした時の処理で、コードのウィンドウで上のドロップダウンリストで選択できる時の処理などは自動的に[Private Sub Command1_Click( )]などと出てくるのでそのまま使っています。自分で別途プロシージャーを作成する時は[Sub ****( )]としています。
ですがその違いを理解しないまま、自分で作成する時は[Private Sub]ではなくて[Sub]を使っています。

Sub ***( ) と Private Sub ***( ) の違いは何なんでしょうか?
どなたか説明頂けませんか?
よろしくお願いします。

Aベストアンサー

「Sub」の部分にカーソルを置いて[F1]を押せばヘルプが起動します。
「指定項目」のところに「Public」と「Private」の説明がありますよ。
省略して「Sub hogehoge()」とした場合は「Public」とみなされます。

Publicは「すべてのモジュールから呼び出せるプロシージャ」ということになります。
Privateとすると「同じモジュールの中からしか呼び出せないプロシージャ」となります。

もしExcelをお持ちでしたらExcelのVBEで標準モジュールを追加し、「Sub Test1()」と「Private Sub Test2()」を作成してみてください。
そしてExcelの[ツール]-[マクロ]-[マクロ(Alt+F8)]でマクロ実行のダイアログを表示させてみるとわかります。
ここには実行できるプロシージャの一覧が表示されますが、Test1は表示されているけれどTest2は表示されません。
Test1はPublicで、Test2はPrivateだからです。

QExcel VBAで、ユーザーフォームの値を、モジュールで使用したい。

VBA初心者です。(おそらく)基本的な質問で、申し訳ありません。
ユーザーフォーム1には、テキストボックス1とコマンドボタン1が配置されているとします。

Sub TEST ()
Dim N
Userform1.Show
MsgBox N
End Sub

Private Sub CommandButton1_Click()
Dim N
N = TextBox1.Text
UserForm1.Hide
End Sub

Sub TESTを実行した時に、ユーザーフォーム1からNの値を引き継ぐには、どうしたら良いのでしょうか?よろしくお願いします。

Aベストアンサー

'モジュールに変数宣言(グローバル変数)
'Public 宣言すると他のモジュールやフォームと
'共有できる変数になります。
Public AA As String

'sample
'A1 を実行する。

Sub A1()
Call A2
AA = InputBox("input", , AA)
End Sub

Sub A2()
AA = InputBox("input", , AA)
End Sub


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報