• ベストアンサー

エクセルのマクロ

任意のセル内の文字の一部をコピー状態にした後に、任意のセルに一文字ずつ貼り付けるマクロを作成したいのですが。 例えば、A1に"あいうえお"と入力されていて、"うえお"をコピー状態にして実行すると、貼り付ける基点となるセルをインプットボックスで指定し、B3が指定されたとするなら、B3に"う"、C3に"え"、D3に"お"が貼り付けられる。 以下のマクロで望んでいる処理が可能になるのですが。 Sub test()  Set x = Application.InputBox(Prompt:="test", Type:=8)   Range("A10").Select   ActiveSheet.Paste   y = Range("A10").Value   z = 0   w = Len(y)     For i = 1 To w      x.Offset(0, z).Value = Mid(y, i, 1)       z = z + 1     Next i   Range("A10").Clear End Sub 上記マクロでは、コピー状態になっている文字を一旦作業用のセルに貼り付けるという処置を取っていますが、そのように作業用のセルを用いないで同じ処理を行うにはどうすればいいでしょうか?

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

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

#1 です。 参照設定が必要ですが、こっちの方が楽かな? Visual Basic Editor の[ツール]-[参照設定]で  ・Microsoft Forms 2.0 Object Library にチェックを入れておきます。下記のコードで変数 strBUF にクリップボードの内容が格納されてます。 あとは、適当にセルにバラすコードを書いて下さい。 では。 Sub Sample2()   '要参照設定: Microsoft Forms 2.0 Object Library   Dim CPB  As DataObject   Dim strBUF As String   Set CPB = New DataObject   With CPB     .GetFromClipboard     strBUF = .GetText   End With   Set CPB = Nothing   MsgBox strBUF 'クリップボードの内容を表示 End Su

laminex
質問者

お礼

ご回答ありがとうございました。 大変参考になりました。

その他の回答 (3)

回答No.3

#2です。 書き違えてしまいました。  R = Selection.Row  C = Selection.Column  For i = 1 To Len(N)   Cells(R, C + i - 1).Value = Mid(N, i, 1)  Next です。

回答No.2

作業用セルを別に作るのではなく、インプットボックスで指定されたセルそのものを 利用することもできますよね。 全体を Application.ScreenUpdating = False で画面変化を止めておいて、 ペースト後、   ActiveSheet.Paste   N = Selection.Value   C = Selection.Row   R = Selection.Column   For i = 1 To Len(N)     Cells(C, C + i - 1).Value = Mid(N, i, 1)   Next   Application.ScreenUpdating = True

laminex
質問者

お礼

ご回答ありがとうございました。 大変参考になりました。

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

こんにちは。KenKen_SP です。 Excel で使用されている OFFICE クリップボードは VBA で直接データを取得できません。 ご提示のコードの様に一度作業用セルを経由させるしかありません。 作業用セルへの書き込みについては、   Application.ScreenUpdating = False として VBA 実行中の画面描写を停止してしまえば、ユーザーには気付かれませんが、どうしても作業用セルを使いたくないのであれば、こんな方法があります。API で直接クリップボードにアクセスしてます。 例外処理はしてませんので、適当に考えて下さい。 Option Explicit '// クリップボードを開く Private Declare Function OpenClipboard Lib "user32" ( _     ByVal hWndNewOwner As Long) As Long '// クリップボードを閉じる Private Declare Function CloseClipboard Lib "user32" () As Long '// クリップボードのデータハンドルを取得する Private Declare Function GetClipboardData Lib "user32" ( _     ByVal wFormat As Long) As Long '// ヒープに確保されたメモリをロックする Private Declare Function GlobalLock Lib "kernel32" ( _     ByVal hMEM As Long) As Long '// GlobalLock関数によってロックしたメモリのロックを外す Private Declare Function GlobalUnlock Lib "kernel32" ( _     ByVal hMEM As Long) As Long '// メモリサイズを取得する Private Declare Function GlobalSize Lib "kernel32" ( _     ByVal hMEM As Long) As Long '// 文字列のメモリポインタから文字列を取得する(読み書き用にAny型にする) Private Declare Function lstrcpy Lib "kernel32" ( _     ByVal lpString1 As Any, _     ByVal lpString2 As Any) As Long '// GetClipboardData wFormat 定数 Private Const CF_TEXT = &H1 '--------------------------------------------------------------------- ' @Procedure : CB_GetText ' @Description: クリップボードの文字列を読み込むユーザー定義関数 ' @Param   : 参照渡しの変数 strDATA に取得した文字列が格納されます ' @Return   : Boolean / 成功時:True 失敗時:False '--------------------------------------------------------------------- Private Function CB_GetText(ByRef strDATA As String) As Boolean   Dim lngHDL As Long   Dim lngMEM As Long   Dim strBUF As String   If OpenClipboard(0&) <> 0 Then     lngHDL = GetClipboardData(CF_TEXT)     If lngHDL <> 0 Then       lngMEM = GlobalLock(lngHDL)       If lngMEM <> 0 Then         strBUF = String$(GlobalSize(lngMEM), vbNullChar)         If lstrcpy(strBUF, lngMEM) <> 0 Then           CB_GetText = True         End If         Call GlobalUnlock(lngHDL)       End If     End If     Call CloseClipboard   End If   If CB_GetText Then     strDATA = Mid$(strBUF, 1, InStr(strBUF, vbNullChar) - 1)   End If End Function Sub test()      Dim x As Range   Dim y As String   Dim w As Long   Dim z As Long   Dim i As Long      'クリップボードの文字列をString型変数yに取得してみる   If CB_GetText(y) Then     '取得成功     Set x = Application.InputBox(Prompt:="セルを選択", Type:=8)     If Not x Is Nothing Then       z = 0       w = Len(y)       For i = 1 To w         x.Offset(0, z).Value = Mid$(y, i, 1)         z = z + 1       Next i     End If     Set x = Nothing   Else     '取得失敗     MsgBox "クリップボードから文字列を取得できませんでした", vbCritical   End If End Sub

laminex
質問者

お礼

ご回答ありがとうございました。 大変参考になりました。

関連するQ&A

  • エクセルのマクロ

    Sub test() x = Range("b1") z = Len(x)  For i = 1 To z   Range("a1").Offset(i - 1, 0).Value = Mid(x, i, 1)  Next i End Sub 上記は、"B1"に入力されているデータを、"A1"から下方向に一文字ずつ入力していくマクロです。 これに条件を付け加えたいのですが。 "今日(きょうは)雨[あめ]でした"のように、"( )"や"[ ]"内の文字はカッコも含めてフォントが赤(ColorIndex = 3)になるようにしたいのですが。 上の例だと、"(きょうは)"と"[あめ]"のフォントが赤になります。 おわかりの方がいましたら、お願いいたします。

  • マクロについて

    マクロでデータをクリアするコマンドボタンを作りました。でも、計算の答えがでなくなりました。 例えば、 A1:A10までの情報はクリアになります。 答えの“=SUM(A1:A10)”というCセルだけが前の情報のままになります。(Cセルはマクロに登録していません。) 全くのど素人で、マクロの登録も他の書類からコピーしてセルだけ変えました。 マクロの内容は、下記の通りです。 Sub Macro1() ' ' Macro1 Macro ' マクロ記録日 ' Sub allclear() Application.Calculation = xlManual Range("D4").Value = "" Range("B6").Value = "" Range("B8").Value = "" Range("E11").Value = "" Range("E12").Value = "" Range("F11").Value = "" Range("B21").Value = "" Range("B23").Value = "" Range("B25").Value = "" Range("B27").Value = "" Range("B29").Value = "" Range("P5:P9").Value = "" Range("Q5:Q9").Value = "" Range("P15:P19").Value = "" Range("Q15:Q19").Value = "" End Sub よろしくおねがいします。(_ _)

  • エクセルのマクロ

    Sub test() x = Selection.Row y = Selection.Column z = Selection.Columns.count Range(Cells(x, y), Cells(x, y + z - 2)).Select Selection.ClearContents End Sub 上記マクロは、同一行の連続するセルを二つ以上選択状態にして実行すると、範囲内の最も右にあるセルの値のみが残って他のセルの値は全て消去されます。 上記マクロを、複数のセレクションに対して対応できるようにするには、どうすればいいでしょうか? 例えば、c1~f1、d3~h3、e10~g10を選択して実行すると、f1とh3とg10の値のみ残って他の値は消えるということです。

  • エクセル(マクロ)置換 結合されたセルに対しての置換

    こんばんは、 今置換用のマクロをこちらで検索して使ってましたが 使用するエクセルのフォーマットが 1セルに入力されてるのではなく、3つのセルを結合されている物に入力されているもので 下記のマクロだと、正しく置換されておりません。 置換変換用のシートと、置換したいシートがある状態で、 下記のマクロだとなぜ結合されたセル内の文字は置換えできないのでしょうか? 結合されてないセルですと、置換はちゃんとされております。 Sub 置換() With ThisWorkbook If ActiveSheet Is .Worksheets(1) Then Exit Sub For i = 1 To .Worksheets(1).Range("A65536").End(xlUp).Row ActiveSheet.Cells.Replace _ What:=.Worksheets(1).Range("A" & i).Value, _ Replacement:=.Worksheets(1).Range("B" & i).Value, _ LookAt:=xlPart, SearchOrder:=xlByColumns Next End With End Sub 明日の昼までに5000個のファイルを置換えするので これが出来ればなぁと思っております。 大変お手数ですが教えて頂けると助かります では、よろしくお願いいたします。

  • EXCELのマクロに関して

    vbaのマクロに関して質問があります。 マクロをどのように作ればよいでしょうか? マクロは以下のようになっています。sheet1以外(sheet2,sheet3など)に単語を入れて、sheet1でフラッシュ単語のようにするマクロです。これに付け加えたい内容があります。sheet1のセルにある値を入れれば、sheet1以外のシートのある特定の列をフラッシュ単語としてだしたいと考えています。シートと列を指定したいと考えています。 どのように付け足せばよいでしょうか? Sub sample() Dim i As Integer i = 1 Worksheets("sheet1").Activate Do Sheet1.Range("A1").Value = Sheet3.Range("b" & i).Value '1000で1秒,oで場所,sheet2の場所 Call Sleep(1000) DoEvents i = i + 1 Loop Until IsEmpty(Sheet3.Range("b" & i).Value) '1000で1秒,oで場所,sheet2の場所 End Sub

  • セルを選択するマクロ(エクセル)

    Sub test() x = ActiveCell.Row y = ActiveCell.End(xlToLeft).Column z = ActiveCell.End(xlToRight).Column Range(Cells(x, y), Cells(x, z)).Select End Sub アクティブセルが含まれている行のみで、データが入力されている連続したセルを選択状態にするマクロとして、上記を考えました。 上記を違った形でもっと簡潔に表すことは可能でしょうか?

  • エクセルマクロで特定の範囲内の検索

    A10からA100までのセルを上から順に調べて、セルにAという文字が入力されているときに、その隣にBという文字を入力するマクロを下記のように作りました。 「セルにAという文字が入力されているとき」という条件に加え、「検索しているセルから上の9個のセル(cells(i-9,1)からcells(i-1,1)まで)にAという文字が入力されていない」という条件を加えたいのです。 Sub 検索() Dim i As Integer For i = 10 To 100 If Cells(i, 1).Value = "A" Then Cells(i, 2).value = "B" End If Next i End Sub つまり If Cells(i, 1).Value = "A" Then  の部分を If Cells(i, 1).Value = "A" かつ Range(cells(i-9,1),cells(i-1,1))にAが入力されていない Then という形にしたいのですが、表現の仕方がわかりません。 ご教示よろしくお願いします。

  • エクセルのマクロコードに付いて教えて下さい。

    下記のマクロコードがありますが、 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address <> "$A$1" Then Exit Sub x = Target.Value With Application .ScreenUpdating = False .EnableEvents = False .Undo y = Target.Value Target.Value = x + y .EnableEvents = True .ScreenUpdating = True End With End Sub セル位置の指定を変更する場合は、どの様に 書けば良いのですか? このコードですと、セルA1の入力指定でなっていますが A1~A5までとか。A1、B1,C1とかにする場合はどの様に 書けば良いか教えて下さい。 マクロに付いて、殆ど知識が無いものですので 出来れば、分かり易い説明でお願いします。 宜しくお願いします。

  • Excelマクロのことで教えて下さい

    初歩的なことですみません。 E列の値をF列に値を入れるために下記のマクロを組みました。 Sub test() Worksheets("Sheet1").Select Dim i As Long For i = 2 To Cells(Rows.Count, 4).End(xlUp).Row Range("F2").Value = "=E2/1024/1024" Cells(i, 6).FillDown Range(Cells(2, 6), Cells(i, 6)).Copy Range("F2").PasteSpecial Paste:=xlValues Next i End Sub ところがF列に「値のみを貼り付け」をした時に、途中から同じ値のみがコピーされてしまい困っています。 (画像参照) うまく貼り付けることができるマクロをお教え下さい。 よろしくお願いいたします。

  • エクセルのマクロコードについて

    お世話になります。 下記コードで、セルごとにクリアをすると、エラーなくうごくのですが、セルをまとめてセルを消すと実行時エラー13型が一致しません。とでてIf Target.Value = "" Thenがだめだよとでてしまいます。 どなたか、回避の方法をご教授ください。 宜しくお願いいたします。 Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("B2:E2,G2:J2")) Is Nothing Then Exit Sub If Target.Value = "" Then Exit Sub x = Target.Value With Application .ScreenUpdating = False .EnableEvents = False .Undo 'Range("B2").Value = x + Z Z = Target.Offset(1, 0).Value y = Target.Value Target.Value = x + y .EnableEvents = True .ScreenUpdating = True End With Target.Offset(1, 0).Value = x + Z End Sub

専門家に質問してみよう