- ベストアンサー
エクセルのマクロ
任意のセル内の文字の一部をコピー状態にした後に、任意のセルに一文字ずつ貼り付けるマクロを作成したいのですが。 例えば、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 上記マクロでは、コピー状態になっている文字を一旦作業用のセルに貼り付けるという処置を取っていますが、そのように作業用のセルを用いないで同じ処理を行うにはどうすればいいでしょうか?
- laminex
- お礼率90% (19/21)
- オフィス系ソフト
- 回答数4
- ありがとう数4
- みんなの回答 (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
その他の回答 (3)
- misatoanna
- ベストアンサー率58% (528/896)
#2です。 書き違えてしまいました。 R = Selection.Row C = Selection.Column For i = 1 To Len(N) Cells(R, C + i - 1).Value = Mid(N, i, 1) Next です。
- misatoanna
- ベストアンサー率58% (528/896)
作業用セルを別に作るのではなく、インプットボックスで指定されたセルそのものを 利用することもできますよね。 全体を 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
お礼
ご回答ありがとうございました。 大変参考になりました。
- KenKen_SP
- ベストアンサー率62% (785/1258)
こんにちは。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
お礼
ご回答ありがとうございました。 大変参考になりました。
関連する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 よろしくおねがいします。(_ _)
- ベストアンサー
- Windows XP
- エクセルのマクロ
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
- ベストアンサー
- Visual Basic
- セルを選択するマクロ(エクセル)
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列に「値のみを貼り付け」をした時に、途中から同じ値のみがコピーされてしまい困っています。 (画像参照) うまく貼り付けることができるマクロをお教え下さい。 よろしくお願いいたします。
- ベストアンサー
- Excel(エクセル)
- エクセルのマクロコードについて
お世話になります。 下記コードで、セルごとにクリアをすると、エラーなくうごくのですが、セルをまとめてセルを消すと実行時エラー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
- ベストアンサー
- Excel(エクセル)
お礼
ご回答ありがとうございました。 大変参考になりました。