• 締切済み

EXCELセルへのデータの貼付け

こんばんわ、下で質問していたのですが、内容を変えてもう一度 お伺い致します。 DBのデータを獲得し、セルに貼りつけます、 作るのは日報の様なものです(0~23時の時間毎のデータ) 現在はセルの位置を行列番号で指定して貼りつけています。 追加があったり、列の位置がかわった際など、改造が面倒です。 EXCELの列名、行名が使えればスマートにいくかなと思い質問させて もらったのですが、無理な様です。 貼付け開始位置セルに名前をつけて そこから行列番号を獲得し、貼り付けることができないかなと思うのですが、 こういった処理はどの様にするのがベターなのでしょうか?

みんなの回答

noname#144013
noname#144013
回答No.2

こんにちは。 #1です。 > やっぱりセル名や列名、行名は検索できないのでしょうか? 以下のように、   Cells(3月,東京).Value=25.3 Range(x)や、Cells(x.x)の引数に直接、「名前」を指定することはできませんが、 「名前定義」により、セルに名前を割り振ることはできますので、それを利用して 割り振った名前からセルをアクセスすることは可能だと思います。 例えば、一例として、 1)予め、A列の各セル(行方向)と、1行目の各セル(列方向)に「名前」を定義   しておく。    A列の各セル  ⇒ 「行名」の名前を定義    1行目の各セル ⇒ 「列名」の名前を定義 2)1)で付けた「行名」と「列名」より、対応するセル位置にデータを設定する関数   を作成しておく。 3)メインの処理から、2)の関数を呼んで、「行名」と「列名」に対応したセルに   データをセットする。 以上のような処理を行えば、擬似的に、「行名」&「列名」によるセルのアクセスが 可能だと思います。 注意点として、セルに付ける「名前」について、   ・スペースを含んだ名前(文字列)は使用できない。   ・セル参照と同じ形式の名前(文字列)は使用できない。   ・先頭文字が半角or全角の「数字」の名前(文字列)は使用できない。 というような仕様になっているようです。 ※↑はExcel2000で確認したものですが、他のバージョンのExcelでも同仕様か  どうかは判りません。 以下に、上記の処理を使用したサンプルマクロを記載致します。 下記マクロは、ワークシートの構成が下記の場合を想定しています。 <ワークシート構成 : シート名="Sheet1">      A    B     C     D     E     1  月   東京  名古屋   大阪   福岡    2  1月  XX.X   XX.X   XX.X   XX.X    3  2月  XX.X   XX.X   XX.X   XX.X    4  3月  XX.X   XX.X   XX.X   XX.X    :   :    :     :     :     :    :   :    :     :     :     :   13  12月  XX.X   XX.X   XX.X   XX.X    ・1行目  列の項目名(文字列)          ※B列以降は「都市名」          ※この行の各セル(2列目以降)に対して、名前(列名)を定義します。          ※定義する名前は、セルの値(=都市名)と同じとします。   ・A列   月名(文字列)          ※この列の各セル(2行目以降)に対して、名前(行名)を定義します。          ※定義する名前は、「"行"+番号」の形式とします。          注)この場合、セルの値(=月名)の先頭文字が「数字」ですので、            この値自体(=月名)を「名前」として定義できません。   ・B列~  都市毎のデータ ■サンプルマクロ 注1)標準モジュール用のマクロです。 注2)インデント等のため全角スペースを入れています。 <各関数の概要>  Sub SetCellName()  ・・・ 行名、列名の名前定義を行う関数  Sub SetCellData()  ・・・ 行名、列名によりデータ設定を行う関数  Sub SetDataMain()  ・・・ メイン処理 /////↓ここから////////// '== 行名、列名の登録 == Sub SetCellName()   Dim bk As Workbook   'Workbookオブジェクト   Dim sh As Worksheet  'Worksheetオブジェクト   Dim rg As Range    'Rangeオブジェクト   Dim cnt As Long    'カウンタ変数   Dim nRowMax As Long  '行数   Dim nColMax As Long  '列数   Dim sRowName As String '行名   Dim sColName As String '列名   'Workbook、Worksheetのオブジェクト取得   Set bk = ThisWorkbook   Set sh = bk.Worksheets("Sheet1")   '「A列のセル」と「1行目のセル」に設定されているデータ数を取得   '※データ(=項目名など)が設定されているかチェックする   nRowMax = sh.Range("A" & sh.Rows.Count).End(xlUp).Row   nColMax = sh.Range(Cells(1, sh.Columns.Count), _         Cells(1, sh.Columns.Count)).End(xlToLeft).Column   If nRowMax < 2 Or nColMax < 2 Then     'データが設定されていなければ戻る     Set sh = Nothing     Set bk = Nothing     Exit Sub   End If   'エラーの回避   On Error Resume Next   'A列のセル(2行目以降)に「行名」を登録   '※このサンプルでは、行名は「"行"+番号」としています。   cnt = 0   For Each rg In sh.Range("A2:A" & nRowMax)     cnt = cnt + 1     sRowName = "行" & cnt '行名:"行"+番号     bk.Names.Add Name:=sRowName, _       RefersTo:="=" & sh.Name & "!" & rg.Address   Next rg   '1行目のセル(2列目以降)に「列名」を登録   '※このサンプルでは、列名はセルの値(文字列)としています。   cnt = 0   For Each rg In sh.Range(Cells(1, 2), Cells(1, nColMax))     'セルに文字列が設定されている時のみ名前定義を行う     If Len(Trim(rg.Text)) > 0 Then       cnt = cnt + 1       sColName = rg.Text '列名:セルの値(文字列)       bk.Names.Add Name:=sColName, _         RefersTo:="=" & sh.Name & "!" & rg.Address     End If   Next rg   'エラー処理解除   On Error GoTo 0   '各オブジェクトの解放   Set rg = Nothing   Set sh = Nothing   Set bk = Nothing End Sub ' '== 行名、列名によるデータ設定 == '【引数】 ' ByVal sRowName As String :行名(文字列) ' ByVal sColName As String :列名(文字列) ' ByVal vData As Variant  :設定するデータ ' Sub SetCellData(ByVal sRowName As String, _         ByVal sColName As String, _         ByVal vData As Variant)   Dim bk As Workbook   'Workbookオブジェクト   Dim sh As Worksheet  'Worksheetオブジェクト   Dim nErr As Integer  'エラー情報   Dim nRow As Long    '行位置   Dim nCol As Long    '列位置   'Workbook、Worksheetのオブジェクト取得   Set bk = ThisWorkbook   Set sh = bk.Worksheets("Sheet1")   '行名、列名から対応するセルを取得しデータセット   nErr = 0   On Error GoTo L_ERR1   nRow = bk.Names(sRowName).RefersToRange.Row   nCol = bk.Names(sColName).RefersToRange.Column   On Error GoTo 0   If nErr = 0 Then     '正常時(対応セルがあったとき)はデータセット     sh.Cells(nRow, nCol).Value = vData   End If   '各オブジェクトの解放   Set sh = Nothing   Set bk = Nothing   Exit Sub '==エラー処理== '※行名および列名が定義されていなかった場合のエラー処理 L_ERR1:   nErr = 1   Resume Next End Sub ' '== 行名、列名によるデータ設定(メイン) == Sub SetDataMain()   '行名、列名の登録   Call SetCellName   '行名、列名によるデータ設定(1行目)   Call SetCellData("行1", "東京", 10.1)   Call SetCellData("行1", "名古屋", 10.2)   Call SetCellData("行1", "大阪", 10.3)   Call SetCellData("行1", "福岡", 10.4)   '行名、列名によるデータ設定(2行目)   Call SetCellData("行2", "東京", 20.1)   Call SetCellData("行2", "名古屋", 20.2)   Call SetCellData("行2", "大阪", 20.3)   Call SetCellData("行2", "福岡", 20.4) End Sub /////↑ここまで////////// 添付画像は、上記サンプル実行後のExcelシート画面をキャプチャしたものです。 注)上記マクロは、Excelファイル内部のVBAによる処理ですので、外部アプリ   (VB、VCなど)からExcelファイルを操作する場合に応用できるかどうかは   判りません。 以上です。参考になれば幸いです。

TAMEKITI7
質問者

お礼

お付き合い頂き、ありがとうございます。 現在試せる環境でないため、確認できていませんが、 早速、試させて頂きます。 なんでセル名でアクセスできないんでしょうね~ DB列名を変数で持ってセルにアクセスできれば、 コード上では貼付け位置を意識せずにすむのに・・・

全文を見る
すると、全ての回答が全文表示されます。
noname#144013
noname#144013
回答No.1

こんにちは。 ご希望のものとは違うかもしれませんが。。。 (的外れでしたら、すみません。) 前回の下記ご質問、 ・EXCELでセル名でのアクセス http://okwave.jp/qa/q5596003.html に回答しようと用意していたところ投稿前に締め切られてしまいましたので、 こちらに投稿させて頂きます。 前回は、ご提示された表の構成が、行方向が「月単位」の表のようでしたが、 今回は、「時刻単位」の表構成のようですので、作成していたサンプルマクロ も対応するものに修正してみました。 例として、ワークシートの表構成が下記のような場合だったとします。       A      B      C     D     E     F     1  月日    時分    東京  名古屋   大阪   福岡    2  1月1日   0時00分  XX.X   XX.X   XX.X   XX.X    3  1月1日   1時00分  XX.X   XX.X   XX.X   XX.X    4  1月1日   2時00分  XX.X   XX.X   XX.X   XX.X    5  1月1日   3時00分  XX.X   XX.X   XX.X   XX.X    :    :      :      :     :     :     :     :    :      :      :     :     :     :    25  1月1日  23時00分  XX.X   XX.X   XX.X   XX.X    ・1行目  列の項目名          ※C列以降は「都市名」   ・A列   月日データ          ※データ形式は「文字列」ではなく、「日付シリアル値」と仮定します。   ・B列   時分データ          ※データ形式は「文字列」ではなく、「時刻シリアル値」と仮定します。   ・C列~  都市毎のデータ   ※データは時系列(下方向に月日及び時刻が進んでいく)に並んでいるもの    とします。 上記の構成で、「月日」、「時分」及び「都市名」をキーにして、対応するセル位置 を検索し、そのセルにデータをセットするマクロのサンプルを掲載いたします。 ■サンプルマクロ 注1)標準モジュール用のマクロです。 注2)インデント等のため全角スペースを入れています。 /////↓ここから////////// '== 行列項目によるセル操作のテスト == Sub SetCell()   Dim nRow As Long   '行位置   Dim nCol As Long   '列位置   Dim rgDate As Range  '月日のセル範囲取得用   Dim rgTime As Range  '時分のセル範囲取得用   Dim rgCity As Range  '都市名のセル範囲取得用   Dim rg1 As Range   'セル取得用(1)   Dim rg2 As Range   'セル取得用(2)   Dim rg3 As Range   'セル取得用(3)   Dim vDate As Date  '検索月日   Dim vTime As Date  '検索時分   Dim sCity As String '検索都市名   '操作対象シートの指定   With Worksheets("Sheet1")     '検索キーのセット     vDate = DateValue("1月1日")  '検索月日     vTime = TimeValue("3時00分") '検索時分     sCity = "東京"        '検索都市名     '月日かつ時分が一致するセルの検索及び行位置の取得     Set rgDate = .Range("A:A")     Set rg1 = rgDate.Find(vDate, _           LookIn:=xlFormulas, LookAt:=xlWhole)     nRow = 0     If Not rg1 Is Nothing Then       Set rgTime = .Range("B" & rg1.Row & ":B" & .Rows.Count)       Set rg2 = rgTime.Find(vTime, _             LookIn:=xlFormulas, LookAt:=xlWhole)       If Not rg2 Is Nothing Then         If rg2.Offset(0, -1).Value = vDate Then nRow = rg2.Row       End If     End If     '都市名が一致するセルの検索及び列位置の取得     Set rgCity = .Range("1:1")     Set rg3 = rgCity.Find(sCity, _           LookIn:=xlValues, LookAt:=xlWhole)     nCol = 0     If Not rg3 Is Nothing Then nCol = rg3.Column     '対応セルにデータセット     If nRow >= 1 And nCol >= 1 Then       .Cells(nRow, nCol).Value = 25.3     End If   End With   'Rangeオブジェクトを解放   Set rgDate = Nothing   Set rgTime = Nothing   Set rgCity = Nothing   Set rg1 = Nothing   Set rg2 = Nothing   Set rg3 = Nothing End Sub /////↑ここまで////////// 添付画像は、上記サンプル実行後のExcelシート画面をキャプチャしたものです。 以上です。参考になれば幸いです。

TAMEKITI7
質問者

お礼

ご回答ありがとうございます。 セルの値を('東京')検索して、貼付け位置を獲得するということですね、参考になります。 やっぱりセル名や列名、行名は検索できないのでしょうか?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • メモ帳のデータをエクセルに貼付けしたい。

    メモ帳のデータをエクセルに貼付けしたい。 メモ帳に、コンマ区切りで書かれた多数のデータ(1行に文字列が10~100個)が、複数行あります。 これを、エクセルの各セルに、位置的に同じ位置に貼り付ける方法を教えてほしい。 しろうとですのでわかりやすくお願いします。 

  • エクセル2003 可視セルの貼り付けについて

    手順どおりに可視セルの貼付をしているのですが、成功しません。 貼り付け元のデータを4列可視セルコピーしました。 そして貼り付け先のデータはA~E列までデータがあり、D列を非表示にしています。 A~E列(非表示のD列には計算式がはいっています)4列にコピーしたデータを 入れたいのですが、非表示のD列にE列に入れたいデータが入ってしまいます。 御教授お願い致します。

  • EXCELでセル名でのアクセス

    こんばんわ 現在、試せる環境では無いので ご存知の方教えてください。 EXCEL2007のシートにVB6からデータを貼り付けています。 例)   東京 名古屋 大阪 福岡 1月 2月 3月 ・ ・ 12月 MyXl.Worksheets("sheet1").Cells(2,2).Value=25.3 とすればデータをセットできますが、 EXCELの行と列にそれぞれ名前をつけ、その行名、列名でセルに アクセスすることってできるのでしょうか? MyXl.Worksheets("sheet1").Cells(3月,東京).Value=25.3                        ↑こんな感じで・・・ よろしくお願いいたします。

  • エクセルでデータを抽出して日報を作りたいです

    今は日報を手書きで作っているんですが、今度からパソコンで作ることになり、かなり困ってます。 やりたい内容としては、エクセルで作っている顧客データがあるんですが、それの中の郵便番号を絞り込んで別ブックの日報のシートに顧客名だけを移す作業です。マクロ初心者で本を読んではいますがどうしていいのかわかりません。どなたか教えてください。 ≪顧客データ≫ A列      B列     C列     D列       顧客名  電話番号  郵便番号  市町村名    顧客データはこのような並びです。顧客名は2行目から始まっており、24000行ほどあります。 ≪日報≫ A列     B列 番号   顧客名 日報はこの並びです。日報の顧客名を移したい場所はB列の13行目から表示させたいです。 日報を作るときにできれば顧客データを触りたくないので、日報でセルに郵便番号を入れて マクロで作れるボタンをクリックして作成できたらいいかなって思っています。 ちなみに日報はデスクトップにあるんですが、顧客データは違うフォルダの中に入っています。 マクロ初心者ですがどなたかわかる方がいましたらよろしくお願いいたします。 わかりやすくコードを書いていただけると助かります。

  • EXCEL・含まれる値でセルを検索して行列名を返す

    エクセルの関数でできるかどうか分かりませんが、、 下記のように表があり、特定の値を含むセルが複数存在しています。        “A列”   “B列”   “C列” ・・・ 9/1(日)  111aaa  222bbb  333ccc 9/2(月)  444ddd   111eee  555eee 9/3(火)   666fff   777ggg  111hhh  ・  ・  ・ このときに、「111」を含むセルを検索すると そのセルが存在する【行名(日付)】と【列名】をずらーーっと 下記にように返す方法はなにかありますでしょうか?? “A列”の9/1(日) “B列”の9/2(月) “C列”の9/3(火)  ・  ・ 尚、上記のように出力できなくても、 特定の文字列を含む行名と列名が 一括で確認できれば問題ありません。 (VBAとかだとできるのでしょうか、、) 可能な限り急ぎ方法を知りたいのですが、 ググってもvlookup、indexの解説ばかりで困ってしまっていますので、 どうかアドバイスのほど宜しくおねがいします。

  • エクセルへのデータ貼り付けについて

    メモ帳のテキストデータからエクセルへのデータ貼り付けをする際の質問です。 メモ帳のデータが、 aaa bbb のように2語をスペースで区切っているようなデータです。 これをそのままエクセルに貼り付けると、1列に「aaa bbb」とデータが貼り付けられるのですが、 これをA列に「aaa」、B列に「bbb」と、スペースを区切りとして各列にコピーしたいと考えています。 どのような方法で可能でしょうか?

  • ExcelのLarge関数で抽出したセルの行/列名

    表からLARGE関数を使い上位5までの値を検索します。 この時、該当の値のセルの行項目、列項目も同時に表示したいです。 例: 検索されるセルの値=5 行名=あさひ 列名=富士 の場合に、 1セル内で、「5:あさひ/富士」という結果を返したいです。 方法をご教授ください。

  • EXCELのマクロがわかりません・・・

    現在、A列にデータが並んでいるのですが、 これを7つ区切り(例:A1~A7、A15~A21)にして、 別シートに用意した表に行列を入れ替えて、 貼り付けるマクロを作っているのですが、 なにぶんVBは素人ですので、よくわかりません。 今作ろうとしているマクロは、 「元データ」セルのA1からA7までをコピーして、 「作成データ」セルのB2を起点として、 コピーした内容の行列入れ替えを行い貼り付け、 以後、「元データ」のコピー範囲を7つづつ 下にずらし、「作成データ」の貼り付け起点を 1つづつ下にずらして、「元データ」のA列の 最後までくりかえすものです。 必ず「Range」文で引っかかってしまうのですが、 何か構文的におかしいでしょうか? かなり急ぎですので、 わかる方、よろしくお願いしますっ!! 下に、作成したマクロを貼り付けます。 Sub Macro3() ' ' Macro3 Macro ' マクロ記録日 : 2005/12/5 ユーザー名 : *** Worksheets("元データ").Activate 開始行 = -6 終了行 = 0 ペースト行 = 0 Do 開始行 = 開始行 + 7 終了行 = 終了行 + 7 ペースト行 = ペースト行 + 1 開始セル番号 = "A" & 開始行 終了セル番号 = "A" & 終了行 ペーストセル番号 = "B" & ペースト行 Range("開始セル番号:終了セル番号").Select Selection.Copy Sheets("作成データ").Select Range(ペーストセル番号).Select Selection.PasteSpecial Paste:=xlAll, Operation:=xlNone, SkipBlanks:=False _ , Transpose:=True Loop End Sub

  • エクセルのマクロでセルに入力されているセル番地に貼り付け?

    エクセルのマクロで質問です。 下記のように入力されています   A    B    C    D 1 あ   田中  2000  N3   2 い   中嶋  1500  Q3 3 う   吉田  1600  U3 4 え   石川  1800  N11 5 お   横山  1500  Q11 6 か   鈴木  1600  U11 7 き   中村  2500  N19 8 く   山田  1200  Q19 9 け   橋本  1400  U19 ・・・・(500行くらいあります) この表のA1:C1をN3に行列を入換えて貼り付け、 A2:C2をQ3に行列を入換えて貼り付け・・・ のように、ABC列の内容を、D列に入力されているセル番地に貼り付けたいのです。 INDIRECT関数など使ってみましたが、どうにも出来そうにありません。 これをなんとかマクロで出来ないものでしょうか。 困ってます。お願いします。

  • エクセルで?簡単にコピー、貼り付けしたい!

    エクセルのセルのデータを簡単にコピー、貼り付けをしたいです。 A列にタイトル B列にURL C列に本文(1つのセルに300文字適度で改行が含まれる) が約500件ほど入っているとします。 今、やっている作業はAタイトル、BURL、C本文を1つずつ手作業でコピーして別のソフトに貼り付けると言う作業を行っています。 また、Cの本文はそのままコピーして貼り付けするとダブルクォーテーションが入ってしまう為、セルの内容だけをコピーして貼り付けていると言うめんどくさい作業を行っています。 そこで質問なのですが、例えば、A1,B1,C1など各セルにカーソルにおいた状態でボタンを押せば簡単に貼り付けができるようにしたいのですが、こんな事は出来ないでしょうか? 只今、約50件ぐらいまで手作業で行ったのですが、面倒なので簡単に出来る方法を探しています。 何かいい方法はないでしょうか? よろしくお願いします。