• ベストアンサー

コピーした文字列を現在開いているシート名にセットしたい

現在開いているシート名を、クリップボードにある(?)文字列に 書き換える(?)マクロをつくりたいです。例えば、 (1) セルA1に、「aaa111」と入力されているとします。 (2) A1セルをダブルクリック(ないし、数式バーから必要な文字列だけを選択)します。 (3) 「111」だけをコピー(Ctrl+C)します。 (4) 「Sheet1」のタブをWクリックします。 (5) 貼り付け(Ctrl+V)により「Sheet1」が「111」に書き換えられます。 (6) Enterキーで確定します。 参考までに今の動作をマクロ記録してみると、次のようになったのですが、 「111」だけをコピーしたつもりなのに、「aaa111」がクリップボードに 格納されてしまっています。 Sub Macro1()   ActiveCell.FormulaR1C1 = "aaa111"   Sheets("Sheet1").Select   Sheets("Sheet1").Name = "111" End Sub 任意のセルをダブルクリックして 必要な文字列(=シート名にしたい文字列)だけをコピーし、 マクロを実行(ショートカットキーを押下)するだけで サッと書き換わるイメージですが、実現可能でしょうか。 よろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.2

こんにちは。KenKen_SP です。 直接シートタブ上で Ctrl+V として貼り付けても手間は変わらない と思いますが、あえて VBA でやってみます。 VBA はクリップボード操作の命令が貧弱で、クリップボードのデータ を直接操作することはできません。 したがって、VBA でクリップボード内のデータを取得するには、 ・#1 のご回答のとおり、一度セルを経由させる ・MS Forms2 Object Library を使う ・API の GetClipboardData 関数を使う のいずれかの方法をとることになります。下記のコードでは API を 使って直接クリップボードの文字列を取得しています。 ご参考までに。 '【標準モジュール】 '// クリップボードを開く Declare Function OpenClipboard Lib "User32" ( _     ByVal hWndNewOwner As Long) As Long '// クリップボードを閉じる Declare Function CloseClipboard Lib "User32" () As Long '// クリップボードのデータハンドルを取得する Declare Function GetClipboardData Lib "User32" ( _     ByVal wFormat As Long) As Long '// ヒープに確保されたメモリをロックする Declare Function GlobalLock Lib "kernel32" ( _     ByVal hMEM As Long) As Long '// GlobalLock関数によってロックしたメモリのロックを外す Declare Function GlobalUnlock Lib "kernel32" ( _     ByVal hMEM As Long) As Long '// メモリサイズを取得する Declare Function GlobalSize Lib "kernel32" ( _     ByVal hMEM As Long) As Long '// 文字列のメモリポインタから文字列を取得する Declare Function lstrcpy Lib "kernel32" ( _     ByVal lpString1 As Any, _     ByVal lpString2 As Any) As Long '// GetClipboardData wFormat 定数 Public Const CF_TEXT = 1 '// クリップボードから文字列を取り出す Private Function CP_GetDATA()      Dim hCLP  As Long   Dim hMEM  As Long   Dim strBUF As String      If OpenClipboard(0&) = 0 Then Exit Function   hCLP = GetClipboardData(CF_TEXT)   hMEM = GlobalLock(hCLP)      On Error GoTo TERMINATE   If hMEM <> 0 Then     strBUF = Space$(GlobalSize(hMEM))     Call lstrcpy(strBUF, hMEM)     Call GlobalUnlock(hCLP)     strBUF = _     Mid$(strBUF, 1, InStr(strBUF, vbNullChar) - 1)   End If TERMINATE:   Call CloseClipboard   CP_GetDATA = strBUF   On Error GoTo 0    End Function Sub クリップボードのデータをシート名に()   Dim strSHNAME As String     On Error Resume Next   '一応改行コードをカットしてシート名とできるか   '試してみる-->できなければそのまま終了   strSHNAME = CP_GetDATA()   strSHNAME = Replace(strSHNAME, vbCrLf, vbLf)   strSHNAME = Replace(strSHNAME, vbLf, "")   ActiveSheet.Name = strSHNAME   On Error GoTo 0 End Sub

litton101
質問者

お礼

KenKen_SPさん、いつもお世話になってます! > VBA はクリップボード操作の命令が貧弱で、クリップボードのデータ > を直接操作することはできません。 キーボードマクロで拾えなかった理由は そういうことだったのですが。 > ・#1 のご回答のとおり、一度セルを経由させる > ・MS Forms2 Object Library を使う > ・API の GetClipboardData 関数を使う なるほど、VBAの範疇でないことは、よそから プログラムを借りて解決できるというわけですね。 以前もマクロで質問させていただいたとき、APIを活用した 解法をご教示いただいたことがありました。 > のいずれかの方法をとることになります。下記のコードでは API を > 使って直接クリップボードの文字列を取得しています。 早速導入させていただきましたが、あまりにも 希望した動作だったので感動しました(^^; 個人用マクロブックに入れて永久保存版にさせていただきますm(_ _)m > 直接シートタブ上で Ctrl+V として貼り付けても手間は変わらない た、確かにそうかもしれませんね。 キーボードから手を離さないで済むだけでも十分に生産性は上がり ますので、活躍の場はたくさんありそうです。 本当にありがとうございました。今後ともよろしくお願い致します。

その他の回答 (1)

回答No.1

思いついたものが、1つセルを経由する(してしまう)コードです もう少しすっきり作れそうですが、取り急ぎ。 Public Sub CPB_Paste() CP_Arng = Application.ClipboardFormats For Each CP_data In CP_Arng If クリップデータ = xlClipboardFormatText Then Range("A1").PasteSpecial Operation:=xlPasteAll Sheets("Sheet1").Name = Range("A1") Exit For End If Next End Sub

litton101
質問者

お礼

komorebi99さん、レスありがとうございました。 なるほど、一回セルを経由することで 解決できるわけですね、 ご提示いただいたコードも大変勉強になります。 本当にありがとうございました。

関連するQ&A

  • 「シート1のアクティブセルをコピーしてシート2のA列の最終行+1に貼り付ける」

    「シート1のアクティブセルをコピーしてシート2のA列の最終行+1に貼り付ける」 というVBAコードが知りたいのですが Sub Macro1() Selection.Copy Sheets("Sheet2").Select Selection.End(xlDown).Offset(1).Select ActiveSheet.Paste End Sub ではうまくいきませんでした。 ・マクロを実行する前のもともとのアクティブセルはシート1の入力されたセル上にあるとします。 ・シート2のA列にはA1~A?と削除したり挿入したりで数が変わりますが何かしら文字列が隙間なく入っています。 よろしくお願いします。

  • Excelでセル内の文字列のみをコピーする方法

    Excelでセル内の文字列のみをクリップボードにコピーする方法を教えてください。 ※クリップボードにコピーをする方法であり、他のセルに値のみをペーストする方法ではありません。 満たしたい点は2つです。 ・表示している文字列のみを取得 ・複数のセルを同時にコピー 一つのセルに以下の文字列が入っていた場合(#以外) #123 #"abc" コピーするとクリップボードを文字列として取得すると以下の文字列が得られます #"123 #""abc""" これを以下の文字列が得られるようにしたいのです。 #123 #"abc" 1つのセルだけでいい場合は、セルを編集状態にしてコピーしたり アクティブセルの数式バーをコピーすればいいのですが、 これは当然、複数のセルを同時に選択する場合には使えません。 VBAを使う方法でもそうでなくてもかまいません。 (VBAの場合はコードもお願いしたいです) よろしくお願いします。

  • Excelでシートをコピーする時に「シート名が長すぎます」と表示される

    環境 OS : Win2000 SP4 Office : Excel 2000 SP1 表題の通りでシート名「P.05-2_BK(-2)」を同じブック内でコピーしようとすると「シート名が長すぎます」とメッセージが出てコピーできません。 MSのサイトではシート名は半角31文字までOKと書いてあるのですが・・・ マクロでは大丈夫かな?と思い Sub Macro1() Sheets("P.05-2_BK(-2)").Select Sheets("P.05-2_BK(-2)").Copy After:=Sheets(24) End Sub と言うマクロを実行してみましたが、2行目で同じエラーが出ます。 また、ブックが悪いのかと思い、シートを新しいブックにコピーして、その新しいブック内でコピーしようとしても同様にエラーが出てコピーできません。 何故なんでしょう??

  • シートが文字列で並び替えられて困っています。

    エクセル2003を使用しています。 シートの並びについて、文字列(名前順)ではなく、数値順に並び替えたいのですが、 どのようなマクロを組めば良いのでしょうか? ↓これですと、シートの並びが文字列(名前順)になってしまうので、ダメなんです。 ------------------------------- Sub Sort() Dim intLoopA As Integer Dim intLoopB As Integer For intLoopA = 1 To Sheets.Count For intLoopB = 1 To Sheets.Count - 1 If Sheets(intLoopB).Name > Sheets(intLoopB + 1).Name Then Sheets(intLoopB).Move After:=Sheets(intLoopB + 1) End If Next intLoopB Next intLoopA End Sub ------------------------------- 例として、 01.午前中/02.午後/100/300/50/テスト ではなく、 理想型は 01.午前中/02.午後/50/100/300/テスト の順番です。 シート名に番号+日本語を付けているのがあるのは、数字の並び順になって欲しい対策です。 分かりやすくするために簡略化いたしましたが、 実際は300ほどのシートがバラバラに出入りし、それらは連番ではありません。 数値順にするvbaをよろしければ教えて頂けませんでしょうか。 よろしくお願いいたします。

  • シートをコピー、シート名を変更

    Windows8でExcel2000を使っています。 こういうマクロはどう書けばいいんでしょうか? 同一ファイル内で、シートを複数枚コピー。 複数選択したセルに入力された文字列を、上記でコピーされたシート名に反映したい。 「原本」というシート名のシートがあり、それを元に一年分の表を作りたいのですが 今は手で11枚コピーを作った後1枚ずつ名前変更でやっています。 シート名にしたい文字列は現在なら「2015年01月」~「2015年12月」です。 セルに「2015年01月」~「2015年12月」を入力、選択した後マクロ実行で シート名変更に反映できればありがたいです。

  • セルをクリックして文字列をコピーしたい

    テーブルのセルをクリックすると、指定された文章をクリップボードにコピーするようにしたいです。 <table> _<tr> __<td class="time">12:00</td> __<td class="name"><a href="hoge">suzuki</a></td> _</tr> </table> 上の例では、12:00のセルをクリックすると、「あいうえお」という文字列をクリップボードにコピーするような感じです。 現在CSSでは td a{ display:block; width:100%; height:100%; text-decoration: none; } と設定しています。 どうやらJavascriptを使えばできるようなのですが、Javascript事態全く使ったことがないのでどう記述すればいいかがわかりませんでした。 調べてみたところ、inputタグにonclick="clipboardData.setData('text',this.value)"と入力すればできると聞きました。ですが、これはinputタグなのでこれはフォームのボタンをクリックした場合にコピーするような内容ですよね。 そうではなく、リンク先をクリックするようなのと同じような感じでセルをクリックすると、文字列をコピーできるような方法が知りたいのです。 できれば記述の方法も教えていただければ助かります。 どなたかご教示のほど、どうかよろしくお願いします。

  • 文字列を2つに分ける

    10個近くある異なるブックのシートを、新しい1つのブックにまとめてしまおうと考えています。 手動で1つのブック内の複数シートを選択して、新しいブックにコピーしようとしましたが、1つのセルに入力されている文字列の中に、かなり長い(255字以上)ものが含まれており、コピーした際にデータが捨てられてしまいます。 長い文字列を、事前にマクロで探して、2つのセルに分ける (たとえば、A1に長い文章があるなら、A2にセルを挿入して、文字列を2つにわける) ことは可能でしょうか? 分けたあとにそれぞれが255字以下になっていることも確認したいと思っています

  • ExcelVBAで文字列編集後別シートのセルにコピーしたいのですが

    Excel2000を使用しています。作業中のブックのSheet1の後ろに別のファイルをコピーすることができました。そこから(コピーできたファイル)から文字列を編集してSheet1の特定のセルに貼り付けたいのですが、未熟者でできません。以下の操作をVBAマクロで実行したいのですが解る方教えてください。 (1)コピーしたファイルのA4セルにある文字列をMID(A4,6,10)で取り出しSheet1のB21セルに貼り付ける。(日付) (2)(1)が日付なのでそれから曜日を取得し、Sheet1のE21に表示する。 (3)コピーしたファイルのA5セルにある文字列をMID(A5,8,1)で取り出し(一桁の数字)1の時は福岡、2の時は佐賀、3の時は長崎、4の時は熊本、5の時は大分、6の時は宮崎、7の時は鹿児島、8の時は沖縄とSheet1のB24セルに表示する。 (4)コピーしたファイルのA6セルにある文字列をMID(A6,8,2)で取り出し(二桁までの数字)その後ろに"本"をつけてSheet1のB24セルに表示するB28に表示する。例)12本 (5)コピーしたファイルのA2セルにある文字列をMIDB(A2,20,6)で取り出し(時刻)Sheet1のE30セルに表示させる。 (6)コピーしたファイルのA12セルにある文字列をMID(A12,11,5)で取り出し(時刻)Sheet1のE34セルに表示させる。 (7)(6)の15分前の時刻をE36セルに表示させる。 よろしくお願いいたします。

  • Excel 2007 マクロ 別ブックのシートをコピーする方法

    Excel 2007 マクロ 別ブックのシートをコピーする方法 別ブックのシートをコピーして アクティブなブックのシートにコピーしたいと思います。 下記マクロを作成しました。 貼り付ける際に、クリップボードに保存するかどうか 聞かれるメッセージが表示されてうまくいきません。 またもっとシンプルな書き方があればアドバイスお願いします。 Sub 取り込み() Dim wb As Workbook Set wb = Workbooks.Open("\") Sheets("Sheet1").Select Cells.Select Selection.Copy ThisWorkbook.Activate ThisWorkbook.Sheets("特定").Select ActiveSheet.Cells(1, 1).Select ActiveSheet.Paste wb.Close End Sub

  • エクセルの文字列置換マクロに関するご相談

    下方のマクロを実行することにより、 文字列リストの内容に基づいて、 別シート(作業)内の文字列を変換することができます。 文字列からコード値へ変換することを目的にマクロを埋め込んだのですが、 別シート(作業)の文字列をコード値に変換した際、3桁くぎりのコード値が並んだ場合に、 自動で数値として認識されてしまいます。 ※別シート(作業)のセルを文字列し設定しても発生します。 プログラムで回避手段があるようでしたらご教示いただければ幸いです。 例)文字列リストシート A B さる 10 ぞう 15 ごりら 101 きりん 102 わに 103 かば 104 マクロ実行前の作業シート A さる,ぞう ごりら ごりら,きりん,わに さる,ごりら マクロ実行後の作業シート A 10,15 101 101102103 10101 上記マクロ実行後のシートの3~4行目のように、 カンマが取れることを防ぎ、文字列として代入したい所存です。 <マクロ> Sub 文字列リストに基づき連続して置換する() i = 2 Do x1 = Sheets("文字列リスト").Cells(i, 1) x2 = Sheets("文字列リスト").Cells(i, 2) Sheets("作業").Cells.Replace _ What:=x1, Replacement:=x2, _ SearchOrder:=xlByColumns, MatchCase:=True i = i + 1 Loop Until Sheets("文字列リスト").Cells(i, 1) = "" End Sub ご教示いただければ幸いです。 よろしくお願いいたします。

専門家に質問してみよう