Excelで大量のデータ処理をしなくてはならないのですが、以下の処理をExcel VBAで自動処理できないでしょうか?
どなたかお知恵をお貸しください。
(1)A、B、C列からなるリストがあります。A,B列にはそれぞれオートフィルタが設定してあり、C列は空白です。A列、B列にそれぞれ条件を設定し、抽出したデータのC列(空白)に特定のデータを入力します。A列、B列2つの条件の組み合わせが100通りくらいあり、現在手動でオートフィルタを設定し、C列にデータを入力しております。例えばA,B列の条件の組み合わせと、それに対応するC列に入力するデータを表にしたテーブルを別に作り、A,B列の条件を自動に設定して、抽出し、C列にデータを自動に入力することを、テーブルの一番上の行から最後の行まで繰り返す、というようなことをVBAでExcelにしてもらいたいのです。自分でちゃんと勉強し、調べて、それでも分からなかったらお聞きするというのが筋だと思うのですが、今この仕事に追われて、時間がありません。(ほとんど毎日午前様です。)この仕事が片付いたら、じっくりVBAを勉強したいと思っております。どうぞよろしくお願いいたします。

このQ&Aに関連する最新のQ&A

A 回答 (8件)

修正するとすれば



条件の列がD列で、「あ」と入力したい列がG列になり
K列から始まる条件の表をなら
K1に「条件1」と名前を定義してそのセルに「4」と入力(D列)
L1に「条件2」と~     「0」と入力(無視)
M列はタイトルとデータ
G列のデータ範囲に「分類」と名前を定義

---------------------------この↓から---------------------------------
Sub 新データ処理1()
'条件1のデータの上のセルに「条件1」と名前を定義し表の左から対応するデータまでの列数を入力
'条件2のデータの上のセルに「条件2」と名前を定義し表の左から対応するデータまでの列数を入力
'入力するデータの範囲に「分類」と名前を定義
'オートフィルタは表に空白列や行があると別の表と認識するので↑の列数が違ってくる場合があります
'分かり図らい場合はA1のセルを選択後、オートフィルタをつけて▼を数えて下さい
'条件を1つにしたい場合、「条件2」は0を入力すると無視します

Dim i As Integer
Dim j As Integer
Dim a As Integer
Dim b As Integer
j = Range("条件1").Column
a = Range("条件1").Value
b = Range("条件2").Value

Range("A1").Select
Selection.AutoFilter
For i = 2 To Range("条件1").CurrentRegion.Rows.Count
Selection.AutoFilter Field:=a, Criteria1:=Cells(i, j), Operator:=xlAnd
If b <> 0 Then Selection.AutoFilter Field:=b, Criteria1:=Cells(i, j + 1)
Cells(i, j + 2).Select
Selection.Copy
Range("分類").Select

ActiveSheet.Paste
Next i
Selection.AutoFilter
End Sub
    • good
    • 0
この回答へのお礼

april21さん、本当に毎回ありがとうございます。実は今日他のリストでも試してみました。そのリストでは条件は1つで、D列がそれにあたるので、april21さんが書いてくださったコードのRangeAというところをDに変更し、Selection.AutoFilter Field:=4,、Criteria2:=Cells(i, j),を削除、Criteria1:=Cells(i, j)は、(2,7)、Cells(i, j + 2).Select を(2,8)というように変えてみました。なかなかうまくいかなくて5回くらい試行錯誤してしまいました。でもなんとこれでうまくいきました!!しかし私の修正では不安なので、早速april21さんが書いてくださったように直してみます。実行してみてびっくりしました。今まで手動でやっていたときには30分位かかっていたことが、何と1分です。素晴らしいですね。april21さんのコードがシンプルでとても軽いのでしょうね。社員一同本当に感激しております。どうもありがとうございました。今回のことでapril21さんにはたくさんの貴重なお時間を私どもの為に使っていただき、言葉に出来ないほど感謝しております。また何かありましたらどうぞご教授くださいませ。私もなるべく人に頼らなくてもVBAが使えるようにがんばります。

お礼日時:2001/04/27 23:48

>このプログラムをほかのリスト処理にも使用したいのですが、他のリストでは、条件が1つになり、


>条件の列がD列で、「あ」と入力したい列がG列になり、組合せの表もK列から始まるという風

分類用のシートにすれば修正しなくても結果は得られると思います。
他のリストからこのシートに必要な個所だけコピーして分類が出来たら他の
シートに分類の列をコピーして貼り付けます。

D列をコピーしてA列に、B列をタイトルのみで(データは空)F列を「=」に
します。
(B列も空=F列も空 になりデータの全てが対照になる)
G列をC列にコピー(ここは名前を定義してあるので「分類」にG列のデータ範囲を指定も可)
K列をE列にコピー
結果が出たらリストに貼り付け、分類用のシートはそのまま閉じれば再使用の時
セルをクリアしたりしなくて済みます。(F列に「=」を入れておけば楽かも?)
リストファイルにVBAを入れなくて済むのでファイルサイズも少しは軽い???
    • good
    • 0

「我社の製品はこの二つの条件がどのように組み合わさっても、状態維持をクリア」


↑だと10個、10個で100通りですね?

「A、B社2つの条件の組み合わせは100通りすべてあるわけではなく、こちらで必要な組み合わせだけですので」
↑のどのような組み合わせでもというのに反してますね?

それで最初のご質問をもう一度読んでみたのですが・・・。

オートフィルタのA列の▼をクリックすると重複データを除いたデータが表示されますね?
仮に「goo」というデータを1つ選択すると「goo」を含む行だけ抽出されます。
B列の▼をクリックすると「goo」を含む行のB列の重複しないデータ(excel、VBA、kiroro)が表示されたとして

A列の▼をクリックした時に表示されるデータ「goo」をA列の条件として
B列の▼をクリックした時に表示されるデータ(excel、VBA、kiroro)をB列の条件として

この時の組み合わせを
E列 F列  G列
goo、excel、 あ
goo、VBA、 い
goo、kiroro、 う
 ・  ・
 ・  ・
セルに入力させて表を作り
その表のG列にC列に入力するデータを手動であ、い、うと入力して

A列がgooで、かつ、B列がexcelならばC列に「あ」と自動で入力したいという事なのでしょうか?

この回答への補足

april21さん、早々にご返答いただきありがとうございます。また当方の説明があやふやで、april21さんを悩ませてしまったようで、申し訳ありません。

A列の▼をクリックした時に表示されるデータ「goo」をA列の条件として
B列の▼をクリックした時に表示されるデータ(excel、VBA、kiroro)をB列の条件として

この時の組み合わせを
E列 F列  G列
goo、excel、 あ
goo、VBA、 い
goo、kiroro、 う
 ・  ・
 ・  ・
セルに入力させて表を作り
その表のG列にC列に入力するデータを手動であ、い、うと入力して

A列がgooで、かつ、B列がexcelならばC列に「あ」と自動で入力したいという事なのでしょうか?

⇒⇒⇒ということです。ただ、E列 F列 G列
              goo、excel、 あ
              goo、VBA、 い
              goo、kiroro、 う
という組み合わせの表は、april21さんが最初に考えてくださったプログラムのように、あらかじめ手動入力で用意しておいて、この組合せが満たされているものだけC列に"あ"と書き込みをするという事が出来ればいいのです。april21さんが最初に作ってくださったプログラムを実行してみました。大成功でした。これで大満足でございます。私の至らぬ説明で大変ご迷惑をおかけしました。このプログラムをほかのリスト処理にも使用したいのですが、他のリストでは、条件が1つになり、条件の列がD列で、「あ」と入力したい列がG列になり、組合せの表もK列から始まるという風に、場合によって変わってしまいます。その際、april21さんが作ってくださったプログラムを適宜変更すればいろいろなリストで実行することが出来ると思うのですが、修正するのは難しいでしょうか?もしそれほど難しくないのであれば、どの部分を修正すればいいのかご指導いただけますでしょうか?もし難しいのであれば結構です。本当に無理ばかり申し上げてすみませんが、どうぞよろしくお願いいたします。

補足日時:2001/04/27 01:54
    • good
    • 0

>条件が100個というのはE列の条件データが10個、F列の条件データが10個で、100通りほどの組み合わせがあるということなのです。

早速会社で試してみますね。お忙しい中本当にありがとうございました。
それでは、各10個のデータから100通りの組み合わせを得るところから始めなくてはならないのでは?
↓のでは手動で設定してしていた100通りの組み合わせを事前にE列とF列に入れて処理させる時に
使いまわすだけで良いのかと思ってましたので各10個のデータを入れても10通りしか処理出来ません。
100通りの組み合わせが何なのかも分かりませんし・・・。
何らかの規則性があれば自動で生成する事も出来ると思いますが今の段階では分からないの出きません。
それに100通りに対応するC列に入力させるデータも分かりませんし・・・。

Excel VBAでデータを自動処理したい(2)には数値データだけでしたが
データって数値だけなのですか?
条件のつけ方は2個の数値に合致するだけで良かったのですか?

この回答への補足

april21さん、私の質問の書き方が悪くて申し訳ありません。補足させていただきます。具体的に申し上げますと、この処理は、我社で製造しているある製品に対して2つの別の会社にテストを依頼しているのです。A社には10通りの様々な条件でテストをしてもらっています。同様にB社にも別の10通りの条件でテストをしてもらっています。我社の製品はこの二つの条件がどのように組み合わさっても、状態維持をクリアできなくては販売できません。このテスト結果を表にまとめるための処理なのです。データは条件データもC列に入力させるデータも数値ではなく文字データです。そしてA、B社2つの条件の組み合わせは100通りすべてあるわけではなく、こちらで必要な組み合わせだけですので、april21さんが最初に考えてくださったように、事前に用意しておくことが出来ます。こんな状況なのですが、どうでしょうか?貴重なお時間をお取りしてしまって恐縮です。お時間があるとき、又木が向いたときなどにでもご返答くだされば感激ですが、どうぞ負担の感じず無視されても結構です。ここまで考えてくださっただけでも本当に感謝しております。どうもありがとうございました。まずはお礼と補足まで・・・。

補足日時:2001/04/25 23:46
    • good
    • 0

>我社にはVBAの経験者がおりません


■登録方法
[ツール] メニューの [マクロ] をポイントし、[Visual Basic Editor] をクリック。
エディタが開くので「挿入」-「標準モジュール」クリック。
VBAをコピーして貼り付けます。

エディタを閉じてエクセル画面に戻ります。
[ツール] メニューの [マクロ] をポイントし「マクロ」をクリック。
「データー処理1」と表示されてるはずなので選択して「実行」
(注意:実行する前にオートフィルタはオフにしておいてください)

■実行するには
↓の通りABC列の表とEFG列の表が必要なので
AB列に抽出するデータとC列に条件合致時に入力されるデータ領域。
EF列は条件のデータとG列に条件合致時に入力するデータ。
(条件に比較演算子などを用いる場合は左に付けて下さい。3より小さいは<3
という風に。フィルタオプションで設定できるものは設定できるはずです)

2つの条件に合致するデータが何もない場合にコピー先が変わるのを防ぐ為に
C1を利用しているのでデータ領域以外に一行必要です。
(タイトルは何でも構いませんのでタイトル行をつけてください)

C列の領域に名前を定義して下さい。
「挿入」-「名前」-「定義」で名前を分類に、参照範囲はC列のデータ領域選択。
(タイトル行を含むデータの最後までを選択、100個あるなら100まで)

ここまで出来たら↑の手順で「データ処理1」を実行してみてください。

確認するにはC列をキーにして並べ替えを行ってみると確認しやすいかも?
毎日、手作業でされてるのはC列が出来上がってるでしょうからテストしてみて下さい。

データが文字なのか数字だけなのか両方なのかまったく分からなかったし・・。
条件が100個って・・想像できません。
    • good
    • 0
この回答へのお礼

April21さん、度々の補足、またVBAの登録、実行の仕方まで丁寧に教えてくださり本当にありがとうございます。条件が100個というのはE列の条件データが10個、F列の条件データが10個で、100通りほどの組み合わせがあるということなのです。早速会社で試してみますね。お忙しい中本当にありがとうございました。

お礼日時:2001/04/24 23:51

補足


■「条件1」「条件2」のセルは""にしないようにしてください。
スペース1コでもいいので入れてください。
■↓の2行要りません。(削除するの忘れました^_^;)
If Cells(i, 5) = "" Then Exit For
If Cells(i, 6) = "" Then Exit For
■>3は>3です(半角になってなかったです。

説明するのは作るより難しい(ーー;)まだあるかも・・。
ARCさんのもあるし・・動かなかったらゴミにだしてやってください。
    • good
    • 0

>A、B、C列からなるリスト


A  B  C・・・・←必ずタイトル行つける事
14  あ  
10  い  

条件1  条件2  分類・・・(左からE、F、G列)
10    い    1


C列に名前を定義して下さい。
「挿入」-「名前」-「定義」で名前を分類、参照範囲はC列のデータ領域選択。
上の例では =Sheet1!$C&1:$C&3 って感じに(3は使う行数によって変わります)

C1セルのタイトルはマクロ処理すると条件に当てはまらなかったデータが入力されるので変わってしまいます。(必要な場合は処理後つけてください。)

オートフィルタにはオプションで「等しい」だけでなく「より大きい」とか比較もあるので一応出来るようにしてあります。
3より大きいと条件をつけたい場合は「>3」に
(比較演算子は左に)
あで終わるものは「*あ」に
あで始まるものは「あ*」に

オートフィルタはオフにしておいてください。
---------------------ここから↓コピー-----------------------
Sub データ処理1()

Dim i As Integer

Range("A1").Select
Selection.AutoFilter
For i = 2 To Range("E2").End(xlDown).Row
If Cells(i, 5) = "" Then Exit For
If Cells(i, 6) = "" Then Exit For
Selection.AutoFilter Field:=1, Criteria1:=Cells(i, 5), Operator:=xlAnd
Selection.AutoFilter Field:=2, Criteria1:=Cells(i, 6), Operator:=xlAnd
Cells(i, 7).Select
Selection.Copy
Range("分類").Select

ActiveSheet.Paste
Next i
Selection.AutoFilter
End Sub
---------------------ここの↑まで-------------------------------------

とりあえず、確かめましたのでちゃんと動くはずですが・・動かなかったら
説明が抜けてたるのかもしれないのでどうなったかお知らせください。
100通りも条件つけては確かめてないのでバグがあったらm(__)m

文字が一致するだけでいいのであればもっと簡単に出来るので処理は速くできます。
↑のVBAだとちょっと処理が複雑になるのでデータが沢山ある場合には遅いかも?
    • good
    • 0
この回答へのお礼

April21さん、ご回答本当にありがとうございます。しかもプログラムの動作まで確認くださったなんて本当に感激です。ゴミにするなんてとんでもない!!私は今回のことでプログラミングに大変関心を持つようになりました。先のARC産の回答と同様にApril21さんのプログラムも是非使わさせていただきます。処理の速さを要求するなど私には恐れ多いことです。今手動でやっていることから開放されるだけでも天にも昇る気分です。私を含めた社員一同に希望を下さり本当にありがとうございます。我社にはVBAの経験者がおりませんので、April21さんのプログラムはきちんとしているのにうまくいかないかもしれませんが、みんなでがんばってみます。

お礼日時:2001/04/23 23:42

DGet関数を使っても何とかなりそうな気はしますが、VBAで書くとすれば以下のような感じになります。



使い方は、
DataSearch(検索する範囲, 取得する列番号, [条件1] [,[条件2]]…)
です。

例: E列に野菜名, F列に産地, G列に価格が入力されているとすると、
=DataSearch(E:G,3,"Tomato","Aomori")
で、青森産トマトの価格を返します。

=DataSearch($E$2:$G$100,1,,,1200)
で、1200円の野菜の名前を返します。(複数ある場合は、リストの上にあるものが優先)

Public Function DataSearch(DataRange As Range, FieldNum As Long, ParamArray SearchValues() As Variant) As Variant
 Dim MaxColumn As Long '最大列数
 Dim LeftCol As Long '左端のセルの列番号
 Dim MaxRow As Long '最大行数
 Dim Rng As Range
 Dim i As Long
 Dim CurrentRow As Long
 Dim Hit As Boolean
 '準備
 MaxColumn = UBound(SearchValues)
 If (DataRange.Columns.Count - 1) < MaxColumn Then
  MaxColumn = (DataRange.Columns.Count - 1)
 End If
 MaxRow = DataRange.Worksheet.UsedRange.Rows.Count
 
 'データ範囲の各行について処理
 For Each Rng In DataRange.Rows
  '準備
  LeftCol = Rng.Column
  CurrentRow = Rng.Row
  Hit = True
  '各列について判定処理
  For i = 0 To MaxColumn
   If IsMissing(SearchValues(i)) = False Then
    If Cells(CurrentRow, LeftCol + i) <> SearchValues(i) Then
     Hit = False
     Exit For
    End If
   End If
  Next i
  '終了判定
  If Hit = True Then
   DataSearch = Cells(CurrentRow, LeftCol + (FieldNum - 1)).Value
   Exit For
  End If
  If Rng.Row >= MaxRow Then
   Exit For
  End If
 Next Rng
End Function
    • good
    • 0
この回答へのお礼

ARCさん早速のご回答本当にありがとうございます。会社の同僚と一緒にがんばってみます。VBAを使えば自在にコンピュータを動かせるのですね。今回のことで真剣にVBAを勉強してみようと言う思いが強くなりました。会社の仲間たちはここ最近ゴールの見えない大量のデータ処理に終われて目が死んでいましたが、ARCさんのおかげで瞳に輝きが戻ってきました。社員一同お礼申し上げます。そして私個人としてもこのようなプログラムをこんな短時間で作ってしまわれるARCさんにご尊敬申し上げます。ARCさんのようなプロフェッショナルな技術を得るには相当勉強しなくてはならないでしょうが少しでも近づけるようがんばりたいと思います。また何かありましたらよろしくお願いいたします。

お礼日時:2001/04/24 01:10

このQ&Aに関連する人気のQ&A

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

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

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

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

QエクセルVBA 複数の条件を含む対象を抜き出す。

エクセルVBAについて質問です。
エクセルのバージョンは2003と2007を主に使用しています。

下記の様なデータがあるときに、部活が「野球」でかつクラブは「囲碁」に入っている生徒の学籍番号を別のシート(Sheet2)のB3から下に順にリスト化するマクロがどうしても出来なくて困っています。
find next等を使うのでは無いかと色々してみましたが上手く出来ない現状です。

<sheet1>
   A      B      C       D    E

1 学籍番号 学年    名前     部活   クラブ
2 2222222   1   山田 太郎  野球   囲碁
3 9854923   2   吉田 次郎   剣道   絵画  
4 1111111   3   佐藤 三郎  野球   囲碁
5 8888883   1   米山 権蔵  卓球   囲碁

Aベストアンサー

こんばんは!
Sheet1のA列(学籍番号)のみをSheet2のB3セル以降に表示すれば良いわけですね?
一例です。

画面左下のSheet1のSheet見出し上で右クリック → コードの表示 → VBE画面に
↓のコードをコピー&ペーストしてマクロを実行してみてください。

Sub test()
Dim i, k As Long
Dim ws As Worksheet
Set ws = Worksheets(2)
k = 2
For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row
If Cells(i, 4) = "野球" And Cells(i, 5) = "囲碁" Then
k = k + 1
ws.Cells(k, 2) = Cells(i, 1)
End If
Next i
End Sub

こんな感じではどうでしょうか?m(_ _)m

Qエクセルで自動処理を行いたい

MicrosoftのExcel2000で質問です。

数字のみを入力するセル(A1)があります。
このセルの値が
1の時は右のセル(B1)に斜線をひく
2の時は右二つ(B1,C1)に斜線を引く

5以上の時は行の挿入(AとBの間に)
5以上の数字から5以下の数字に変更の時は挿入した行を削除
と言う処理をやりたいのですが、マクロを使えば出来るというところまでしか分かりません。

どなたか教えていただけないでしょうか?

[ツール]→[マクロ]→…で実行するやつではなく
勝手にやってくれるようにしたいです。

Aベストアンサー

happypointさんのプログラムをベースにして作り変えて見ました。
行の追加と削除についてちょっと気になったんですが
A1の値が
5未満の時(つまり4以下の時)なにもせず
5以上10未満の時(つまり5,6,7,8,9のとき)一行追加でいいんでしょうか?

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
  Dim varValue As Variant
  Dim myRow As Long
  Dim myCol As Long
  Dim befRow As Long
  Dim i As Integer

  Const kaigyouNum = 5

  'セルA1の値の取得
  If Target.Address <> "$A$1" Then Exit Sub 'A1以外のイベントは無視
  varValue = Range("A1").Value

  '数値変換
  If IsNumeric(varValue) = False Then Exit Sub '数値以外の時は処理を抜ける
  varValue = Int(CLng(varValue)) '強制的に整数に変換しています。

  '行数の取得
  myRow = Int(varValue / kaigyouNum) '5行未満は「0」。5行以上で「1」。10行以上で「2」。
  myCol = varValue - myRow * kaigyouNum '5で割った端数

  '現在の挿入行数を調査
  befRow = 0
  Do While cells(befRow + 1, kaigyouNum + 1).Borders(xlDiagonalDown).LineStyle = xlContinuous
    befRow = befRow + 1
  Loop

  If befRow > 0 Then
    Call GyouSakujyo(befRow)
  End If

  '罫線クリア
  Range("B:F").Borders(xlDiagonalDown).LineStyle = xlLineStyleNone

  '罫線を引く(5個セット)
  If myRow > 0 Then
    Call GyouTsuika(myRow)
    Range(cells(1, 2), cells(myRow, kaigyouNum + 1)).Borders(xlDiagonalDown).LineStyle = xlContinuous
  End If

  '罫線を引く(端数)
  If myCol > 0 Then
    Range(cells(myRow + 1, 2), cells(myRow + 1, myCol + 1)).Borders(xlDiagonalDown).LineStyle = xlContinuous
  End If

End Sub

'新しい行を追加する
Private Sub GyouTsuika(sounyugyou)
  Rows(2 & ":" & sounyugyou + 1).Select
  Selection.Insert Shift:=xlDown
End Sub

'行を削除する
Private Sub GyouSakujyo(sakujogyou)
  Rows(2 & ":" & sakujogyou + 1).Select
  Selection.Delete Shift:=xlUp
End Sub

happypointさんのプログラムをベースにして作り変えて見ました。
行の追加と削除についてちょっと気になったんですが
A1の値が
5未満の時(つまり4以下の時)なにもせず
5以上10未満の時(つまり5,6,7,8,9のとき)一行追加でいいんでしょうか?

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
  Dim varValue As Variant
  Dim myRow As Long
  Dim myCol As Long
  Dim befRow As Long
  Dim i As Integer

  Const kaigyouNum = 5

  'セルA1の値の取得
 ...続きを読む

QエクセルVBAで複数の条件を満たす検索方法

エクセルのVBAを使ってデータ検索を行うプログラムを作っています

"Sheet2"は下記のように、A列に生年月日、B列に住所、C列に電話番号、D列にメールアドレスが入力されています

       【Sheet2】
  生年月日  住所    電話番号  メールアドレス
    A      B       C        D
1 1999/9/10 東京都○○ 11-111-1111 aa@goo.co.jp
2 2003/2/26 大阪府○○ 22-222-2222 bb@goo.co.jp
3 1985/6/22 福岡県○○ 33-333-3333 cc@goo.co.jp
4 1995/4/11 愛知県○○ 44-444-4444 dd@goo.co.jp


"Sheet1"のA1に生年月日、A2に住所、A3に電話番号を入力し、"Sheet2"のデータと照合して、3つの値が合致した行のD列のメールアドレスを"Sheet1"のB1に返したいと思います

上記の表だと、"Sheet1"のA1に1985/6/22、A2に福岡県○○、A3に33-333-3333と入力されている場合、B1にcc@goo.co.jpの値を返すようにしたいのです。

findを使って生年月日、住所、電話番号を検索し、行番号を取得して、3つの行番号が同じならその行番号のD列の値を返すというような方法で考えていたのですが、エラーが回避できずに困っています。
生年月日が同じ人がいたり、夫婦や親子などは住所と電話番号が同じといった場合があり、上手く検索できません。 

エラー回避の方法、もしくは他のやり方でも構いませんので
どなたかご教授願えないでしょうか?
よろしくお願いします。

エクセルのVBAを使ってデータ検索を行うプログラムを作っています

"Sheet2"は下記のように、A列に生年月日、B列に住所、C列に電話番号、D列にメールアドレスが入力されています

       【Sheet2】
  生年月日  住所    電話番号  メールアドレス
    A      B       C        D
1 1999/9/10 東京都○○ 11-111-1111 aa@goo.co.jp
2 2003/2/26 大阪府○○ 22-222-2222 bb@goo.co.jp
3 1985/6/22 福岡県○○ 33-333-3333 cc@goo.co.jp
4 1995/4/11 ...続きを読む

Aベストアンサー

ANo.2です。
すみません。ミスがありました。
Sub test()

Dim sh1 As Object, sh2 As Object
Dim d1 As String, d2 As String, r As Long

Set sh1 = Sheets("Sheet1")
Set sh2 = Sheets("Sheet2")

r = 1
d1 = sh1.Cells(1, 1) & sh1.Cells(2, 1) & sh1.Cells(3, 1)
d2 = sh2.Cells(r, 1) & sh2.Cells(r, 2) & sh2.Cells(r, 3)
Do While d2 <> ""
If d1 = d2 Then
sh1.Cells(1, 2) = sh2.Cells(r, 4)
Exit Do
End If
r = r + 1
d2 = sh2.Cells(r, 1) & sh2.Cells(r, 2) & sh2.Cells(r, 3)
Loop

End Sub

ANo.2です。
すみません。ミスがありました。
Sub test()

Dim sh1 As Object, sh2 As Object
Dim d1 As String, d2 As String, r As Long

Set sh1 = Sheets("Sheet1")
Set sh2 = Sheets("Sheet2")

r = 1
d1 = sh1.Cells(1, 1) & sh1.Cells(2, 1) & sh1.Cells(3, 1)
d2 = sh2.Cells(r, 1) & sh2.Cells(r, 2) & sh2.Cells(r, 3)
Do While d2 <> ""
If d1 = d2 Then
sh1.Cells(1, 2) = sh2.Cells(r, 4)
Exit Do
End If
r = r ...続きを読む

Qエクセルで重複しているデータの抽出のしかたを教えてください。

エクセルで重複しているデータを抽出したいのですが・・。なにぶん初心者なもので簡単な方法があればよいのですが・・。
A列に日付 B列に企業名このデータが300件ほどあります。

 Å列      B列
1月 1日    AAAA社
1月 4日   BBBB社
1月 8日   CCCC社
2月 1日   BBBB社
2月20日    DDDD社
3月 2日   AAAA社

と、あるとしてB列の企業名が重複しているものを抽出したいのですが・・・。この場合 AAAA社とBBBB社ですが。
これを簡単に抽出する方法はないでしょうか?
教えてください お願いいたします。

Aベストアンサー

企業名がセルB2からセルB300まで入力されていると仮定します。
セルC2に IF(COUNTIF($B$2:B2,B2)>1,"*","") を入力し、セルC300までコピーして下さい。すると重複したデータの二番目以降に "*" のマークが付きます。
(注) 数式を下のセルまでコピーするため、COUNTIF($B$2 は絶対参照にして下さい。

Qエクセルで文字列の右から4文字を削除してセルに表示したい

明けましておめでとうございます。宜しくお願いします。
エクセルの文字表示で、A列(A1~A20)に文字数の違う文字列が20行程入力されています。それを、A列(A1~A20)のセルに入力されてされている文字列から4文字だけ削除して、B列(B1~B20)に表示(入力)したいのですがどうすればいいのでしょうか?
例えば、A列(A1~A20)のセルにそれぞれ「今年は2008年です。etc.」とか「今年は2008年1月3日です。etc.」、、、など文字数の違った文字列が入力されているセルの右から4文字分「etc.」だけ削除してB列(B1~B20)に「今年は2008年です。」とか「今年は2008年1月3日です。」というふうに表示(入力)したいのです。テキストを読んでMID関数で出来るかなと思ったのですが、MID(文字列の、何文字目から、何文字分)というもので、文字列の左から何文字目を先頭に、何文字分を表示ということで、私のやりたい事の逆なのです。いい方法を教えて下さい。

Aベストアンサー

=MID(A1,1,LEN(A1)-4)
では?

QエクセルVBA 実行時エラー'9'の回避方法について

エクセルVBA 実行時エラー'9'の回避方法について

たいへん困っています。
あるファイルからキーワードを指定してデータを検索し数値項目に-1を掛けてすべて負数にしてから別のファイルにコピー、そのファイルを保存するという処理です。
VBAを作成し実行したところ正常に動作します。しかし、下記の条件下では実行時エラー'9'(インデックスが有効範囲にありません)が発生してしまいます。

(1)VBAを含むエクセルファイル及びデータファイルの保存先をドライブ(S)に置く。
(2)ドライブSは他のPCからアクセスできる同一ネットワークとして定義されている。
(3)ネットワーク下にある他のPCからSドライブにアクセスしVBAを含むエクセルファイルを開いてこの処理を実行する。

分からないのは、インデックス処理に関係しない箇所でエラーが発生していること、同じPC内で実行すると正常動作するのに、上記の条件下ではエラーが発生することです。
作成したVBAは下記のとおりで、Set コピー元 = Workbooks("前回_情報").Worksheets("Sheet1")の箇所でエラーが発生します。エラーを回避する方法を教えてください。

Sub Macro7()
Dim i, j
Dim コピー元 As Worksheet
Dim コピー先 As Worksheet
Dim 検索値 As String
Application.ScreenUpdating = False
Workbooks.Open "S:¥情報出力データ¥前回_情報.xls"
Workbooks.Open "S:¥情報出力データ¥前回_情報コピー.xls"
Worksheets("計算結果").Cells.Clear '結果が格納されるシートを事前にクリア

検索値 = "unit"
Set コピー元 = Workbooks("前回_情報").Worksheets("Sheet1") ← ここでエラー'9'が出る
Set コピー先 = Workbooks("前回_情報コピー").Worksheets("計算結果")
For i = 1 To コピー元.Cells(Rows.Count, 1).End(xlUp).Row
If コピー元.Cells(i, 1).Value = 検索値 Then
For j = 22 To 59
コピー元.Cells(i, j).Value = コピー元.Cells(i, j).Value * -1
Next j
コピー元.Rows(i).Copy コピー先.Cells(Rows.Count, 1).End(xlUp).Offset(1)
End If
Next i
Set コピー元 = Nothing
Set コピー先 = Nothing

Workbooks("前回_情報.xls").Close SaveChanges:=False
Workbooks("前回_情報コピー.xls").Close SaveChanges:=True
End Sub

エクセルVBA 実行時エラー'9'の回避方法について

たいへん困っています。
あるファイルからキーワードを指定してデータを検索し数値項目に-1を掛けてすべて負数にしてから別のファイルにコピー、そのファイルを保存するという処理です。
VBAを作成し実行したところ正常に動作します。しかし、下記の条件下では実行時エラー'9'(インデックスが有効範囲にありません)が発生してしまいます。

(1)VBAを含むエクセルファイル及びデータファイルの保存先をドライブ(S)に置く。
(2)ドライブSは他のP...続きを読む

Aベストアンサー

>同じPC内で実行すると正常動作するのに、上

これはフォルダーオプションの
「登録されている拡張子は表示しない」のチェックが外れてるとエラーが出ると思いますが、、、

何れにしろ、提示のコードでは

>Set コピー元 = Workbooks("前回_情報").Worksheets("Sheet1")
>Set コピー先 = Workbooks("前回_情報コピー").Worksheets("計算結果")

この2行には拡張子が省略されていますので、拡張子を入れてみたらどうでしょうか。

Set コピー元 = Workbooks("前回_情報.xls").Worksheets("Sheet1")
Set コピー先 = Workbooks("前回_情報コピー.xls").Worksheets("計算結果")


以上です。


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

人気Q&Aランキング