エクセル2007にて手動で数値入力をしています。
効率の悪い方法なのですが、
入力方法自体はこのまま、変えずにやりたいと思っています。
入力内容は、例えば 100x20ほどのセルのあるところ、空白のところに「2」と入れたり
しばらく後に先ほどの「2」のところに「=2+4」と付け足したり
さらにしばらく後に「=2+4+5」と付け足したりしています。

「したいこと」はある程度入力が進んだところで、
100x20ほどのセルを「マウスなどで選択」し、その選択した範囲のセルの中身の
「=2+4+5」のセルを計算し「=11」に置き換え、(左に”=”を付けたい)
「3」や「=3」「=+3」のセルを「=3」に置き換え、(やはり左に”=”を付けたい)
ただし「空白」のセルは「空白」のままにして置きたいのです。

Q1)上記の「したいこと」をVBAでできるでしょうか
Q2)Q1に加えて 「0」のセルは「=0」と置き換えられるでしょうか
Q3)間違ってイコール無しで入力した「1+2+3」も計算して「=6」(左に”=”)にできるでしょうか
Q4)VBAで実際に動くものを組んでもらえないでしょうか
後々、最終的には自分で勉強してVBAを組めるようになりたいのですが
今必要なのは上記の操作のみなので、実際にVBAで作成したものが欲しいです。

現在はマウスで選択、形式選択(値)貼り付けして、手動でその都度”=”を付け足しています

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

A 回答 (4件)

Sub macro1()


 Dim h As Range
 Dim Target As Range
 On Error Resume Next
 Set Target = Selection.SpecialCells(xlCellTypeConstants, xlNumbers)
 If Target Is Nothing Then
 Set Target = Selection.SpecialCells(xlCellTypeFormulas, xlNumbers)
 Else
 Set Target = Union(Target, Selection.SpecialCells(xlCellTypeFormulas))
 End If

 For Each h In Target
  h.Formula = "=" & Application.Evaluate(h.Formula)
 Next
End Sub


簡易版です。なので,ご質問で明記されていない入力内容が選択範囲内にあった場合は,意図しない結果となるかもしれません。

駄目な例:
="a"
と記入されていた場合など。
    • good
    • 0
この回答へのお礼

ありがとうございました。
自分で勉強してちょこっと書き足して完全版ができそうです。

お礼日時:2011/04/15 19:13

多分質問者のやろうとしていることは、数を数式にVBAで変化させ、入力待ちにして、何かの数を人間の入力で入れて計算(質問では加減どまりらしい)をしたい。


初心者の考えそうな珍奇な方法だな。
>100x20ほどのセルのうち、
質問の操作の対象セルはどうなるを書かないと質問にならないのでは。
そのセルを選択(決める)条件は何なのか。質問者の(総合的?)判断で無いと判ら無いのか?
ーー
質問の主旨を間違えていなければ、私の思いついた「珍奇な」方法
(1)テキストボックスを1つシートに設ける
(2)シートのSelection_Changeイベントに
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
ActiveCell.Formula = "=" & Val(Target.Value) & "+" & Val(TextBox1.Text)
End Sub
判らなければGoogleで「Worksheet_SelectionChange」で照会し勉強のこと。
===
テキストボックスに、加える数を入力。毎セルに置いて、先に行うこと(忘れやすいから注意)。引き算したい場合はマイナスをつけて入力。
シートのセルをクリック
そのセルの値にテキストボックスの値を加えた数をそのセルに設定(自動計算)。
空白のセルは0の扱い。テキストボックスも空白は0の扱い。
ーー
数式バーへのVBAによる入力のコントロールの方法が判らない(高等技術?API?)ので上記で辛抱。
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
自分の説明が悪くてわかりづらくてすいませんでした。
自分でも今の入力の方法がアナログな効率の悪いものだと自覚しており、
今回の回答を参考に勉強させていただきます。

お礼日時:2011/04/15 19:23

こんばんは!


一例です。
範囲指定した後にマクロを実行してみてください。

Sub test()
Dim c As Range
For Each c In Selection
If c <> "" And IsNumeric(c) Then
c = "=" & c
End If
Next c
End Sub

こんな感じではどうでしょうか?m(__)m
    • good
    • 0
この回答へのお礼

ありがとうございました。
シンプルな書き方もあるんですね

お礼日時:2011/04/15 19:11

これでできましたよ。




Sub sanple()

Dim i As Range
ActiveSheet.UsedRange.Select

For Each i In Selection
i.Value = "=" & i
Next i

End Sub
    • good
    • 0
この回答へのお礼

早速の回答ありがとうございました。
自宅のPCのエクセル2002(?)では動作が違うという新たな発見もありました。
参考にして勉強します。

お礼日時:2011/04/15 19:18

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

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

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

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

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

QVBA マウスで指定した範囲を置換する方法ありますか?

文字列の置換作業を行いたいのですが、指定範囲がその都度異なります。
マウスで指定した範囲のみを置換するマクロはありますか?よろしくお願いします。

環境はexcel2007です。

Aベストアンサー

こんばんは!

すでに回答は出ていますので、参考程度で・・・
「○○」を「××」に置換するコードです。

Sub Sample1()
Selection.Replace what:="○○", replacement:="××", lookat:=xlPart
End Sub

の3行で大丈夫だと思います。m(_ _)m

QExcelのマクロ 指定した範囲のセルの処理方法

Excel2000のマクロを使って以下のマクロを作っています。

■指定した範囲のセルの値が80以上だったら色をつける

そこで質問なのですが、
range("","").select
でセルの範囲を指定して、そこから選択したセルだけを対象に処理を実行するにはどうしたらいいのか方法がわかりません。どうすればいいでしょうか?
どなたかご解答よろしくお願いします。

Aベストアンサー

↓はANo.1の改良版です。

Sub test()
Dim Rng As Range
Dim c As Range

Set Rng = Range("B2:D10") 'セルの範囲を指定

For Each c In Rng
If c.Value >= 80 Then
c.Interior.ColorIndex = 20
Else
c.Interior.ColorIndex = xlColorIndexNone
End If
Next

End Sub

>実行中にマウスで指定した範囲として処理をしたい場合

↓のようになります。

Sub test2()
Dim Rng As Range
Dim c As Range

On Error Resume Next
Set Rng = Application.InputBox("範囲を指定してください", Type:=8)
On Error GoTo 0

If Rng Is Nothing Then Exit Sub
For Each c In Rng
If c.Value >= 80 Then
c.Interior.ColorIndex = 20
Else
c.Interior.ColorIndex = xlColorIndexNone
End If
Next

End Sub

>For Each c In Rng
>とはどんな感じの処理なのでしょうか?

 セル範囲(Rng、すなわちRange("B2:D10") )内のセルすべてについて処理を行う、といった感じです。

↓はANo.1の改良版です。

Sub test()
Dim Rng As Range
Dim c As Range

Set Rng = Range("B2:D10") 'セルの範囲を指定

For Each c In Rng
If c.Value >= 80 Then
c.Interior.ColorIndex = 20
Else
c.Interior.ColorIndex = xlColorIndexNone
End If
Next

End Sub

>実行中にマウスで指定した範囲として処理をしたい場合

↓のようになります。

Sub test2()
Dim Rng As Range
Dim c As Range

On Error Resume Next
Set Rng = Applic...続きを読む

QEXCEL VBA で現在開いているブックのファイル名を取得する方法

EXCEL2003 VBAで業務を簡素化するために、現在開いているブックのファイル名を取得する方法が分かりません。
作業手順をマクロを使って処理していますが、オリジナルのワークブックをファイル名を変えて保存し、以後、このワークブックを読み込んで使用しています。
このときのVBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり、以後の業務に使用できません。
常にファイル名を取得出来るVBAをどなたか、教えて下さい。

Aベストアンサー

>現在開いているブックのファイル名
 ちょっと曖昧な表現かなぁという気もいたしますが、VBAが書いてあるブックのブック名は
ThisWorkbook.Name
で、現在 "アクティブにして" 操作対象になっているブックの名前は
ActiveWorkbook.Name
ですね。

 しかし、
>VBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり
というような文脈からすると、
ThisWorkbook.Name
の方ですかね。

Qエクセルで条件に一致したセルの隣のセルを取得したい

下のような「得点」という名前のシートがあります。
(「田中」のセルがA1です。)

 [ 田中 ][ 10 ][ 200 ]
 [ 山田 ][ 21 ][ 150 ]
 [ 佐藤 ][ 76 ][ 250 ]
 [ 鈴木 ][ 53 ][ 350 ]

別のシートのA1セルに、「佐藤」と入力すると、

 [ 佐藤 ]

「得点」シートから「佐藤」の列を見つけて、B1、C1に

 [ 佐藤 ][ 76 ][ 250 ]

のように表示させたいのですが、B1、C1にはどのような式を書けば良いのでしょうか。
「得点」シートでは氏名が重複する事はありません。
IF文を使うと思うのですが、いまいち良く分かりませんでした。

よろしくおねがい致します。

Aベストアンサー

こんにちは!
VLOOKUP関数で対応できます。
IF関数と併用すればエラー処理が可能です。

Excel2007以降のバージョンであれば
B1セルに
=IFERROR(VLOOKUP($A1,得点!$A:$C,COLUMN(B1),0),"")
としてC1セルまでオートフィルでコピー!
そのまま下へコピーすると行が2行目以降でも対応できます。

Excel2003までの場合は
=IF($A1="","",VLOOKUP($A1,得点!$A:$C,COLUMN(B1),0))

としてみてください、m(_ _)m

QExcelVBAを使って、値がある場合は作業を繰り返し実行するプログラムを作成したい。

以下のようなプログラムをVBAで作成したいと考えています。

A1のセルに値があれば、その値をB1に返す。
次にA2のセルに値があれば、その値をB2に返す。
A行に値がある一番下のセルまで同じようなことをさせたいと考えています。

VBAは初心者です。
どなかた宜しくお願い致します。

Aベストアンサー

#2さんと似たものですが・・・・参考にしてください。

Sub test001()
Dim i As Long
i = 1
Do While Cells(i, 1) <> ""
Cells(i, 2) = Cells(i, 1)
i = i + 1
Loop
End Sub

QエクセルVBAで、範囲指定を変数でしたいとき

Rows(\"10:20\").select という記述が可能ですが、この10と20を変数ro1とro2で指定したいのですが、Rows( ro1 & ":" & ro2).select ではエラーになってしまいます。
どのようにすれば良いでしょうか?

Aベストアンサー

> エラーになってしまいます。

エラーの”内容”を書かないと。。

> 実際には、Activeシートでなく別シートの行を選択したかったので、

Select メソッドは、ActiveSheet 以外のモノに対して実行すると失敗します。
つまり、「Activeシートでなく別シートの行」は Select できません。
これは VBA の仕様です。

  Sheet1.Activate
  Rows(ro1 & ":" & ro2).Select

のように Select する直前に、Sheet1 を Active にしてやれば良いでしょう。

ActiveSheet を切り替えたくないのであれば、コードを最適化します。
例えば、行の削除なら

  Sheet1.Rows(ro1 & ":" & ro2).Delete

のように シートを Active にしたり、行を Select する必要はありません。

Qセル番号を返す関数

エクセルで、セル番号を返す関数はありますか??
セルの内容ではなくて、番号です。(A1、B3など)
調べてみましたがなかなか見つからなかったので、
わかる方教えてください。
宜しくお願い致します。

Aベストアンサー

文字として"C4"を返す。
=ADDRESS(ROW(C4),COLUMN(C4),4)

式を入力したセルの位置を文字列で返す。
=ADDRESS(ROW(),COLUMN(),4)

ADDRESSの3つ目の引数を変えると
$C$4
$C4
C$4
C4
の4つの形に出来ます。

Qある範囲のセルから任意の値を検索して、その隣のセルの値を取得するという関数はありますか?

Excelの関数について質問します。
ある範囲のせるを検索して、その隣のセルの値を取得するという関数を探しています。
なければユーザー定義で作りたいと思っています。
VLOOKUP関数では一番左端が検索されますが、
それをある範囲まで拡張して、
その右隣の値を取得できるようにしたいのです。
どうかお知恵をお貸しください。

Aベストアンサー

●X1セルの値を範囲A1:F200の中から探して、その右隣のセルの値を返す

 =OFFSET(A1,SUMPRODUCT(ROW(A1:F200)*(A1:F200=X1))-1,SUMPRODUCT(COLUMN(A1:F200)*(A1:F200=X1)))

※最初のA1はワークシートの左上隅を示すものなので、検索範囲に関わらずA1固定
※SUMPRODUCT(ROW(A1:F200)*(A1:F200=X1)) ⇒ A1:F200で値がX1と一致するセルの行番号

>その「ある範囲」の中には検索したい値が入っているセルは1つしかありません。
というのが前提です。複数のセルがHITすると関係ないセルの値が返るので、
場合によっては、IFをかぶせてCOUNTIFで確認した方が良いかもしれません。
 ex. =IF(COUNTIF(A1:F200,X1)=1,【上記数式】,"えらー")

ちなみに、VBAでやるならこんな感じになるかと。

動作の概要
 【検査範囲】から【検査値】を探し、
 最初にHITしたセルについて、右隣のセルの値を返す。
 ex. =Sample(X1,A1:F200)

'--------------------------↓ココカラ↓--------------------------
Function Sample(ByVal 検査値 As Variant,ByVal 検査範囲 As Range)
 For Each セル In 検査範囲
  If セル = 検査値 Then Exit For
 Next セル
 Sample = セル.Offset(0, 1)
End Function
'--------------------------↑ココマデ↑--------------------------

いずれもExcel2003で動作確認済。
以上ご参考まで。

●X1セルの値を範囲A1:F200の中から探して、その右隣のセルの値を返す

 =OFFSET(A1,SUMPRODUCT(ROW(A1:F200)*(A1:F200=X1))-1,SUMPRODUCT(COLUMN(A1:F200)*(A1:F200=X1)))

※最初のA1はワークシートの左上隅を示すものなので、検索範囲に関わらずA1固定
※SUMPRODUCT(ROW(A1:F200)*(A1:F200=X1)) ⇒ A1:F200で値がX1と一致するセルの行番号

>その「ある範囲」の中には検索したい値が入っているセルは1つしかありません。
というのが前提です。複数のセルがHITすると関係ないセルの値が返るので、
場...続きを読む

QExel VBA 別ブックから該当データを検索し、必要なデータを取得する方法について

部品表というブックがあります
A列に商品名、B列に商品番号が入力してあります。C列のコードは未入力です。
A列     B列     C列      
商品名  商品番号  コード
モータ  U-1325-L  
ホルダ  R-134256

また、コード一覧表という別のブックには、A列に商品番号と、B列にコードが、何千件も入力されています。

やりたいことは
部品表のC列のコード欄に、コード一覧表ブックから商品番号と一致するコードを貼り付けしたいのです。

部品表は、何百種類もありますので、関数ではなく、マクロで処理を希望します。

自分では、部品表の商品番号をコピーして、コード一覧表で検索し、検索結果の右隣のセル(B列のコード)の値を部品表のC列に貼り付ければよいかと思い、書いてみたんですが…

Sub 別ブックから貼り付ける()
  Dim 検索する As Long
Windows("部品表.xls").Activate
検索する = cells(i,2).Value
Windows("コード一覧表.xls").Activate
ActiveWindow.SmallScroll Down:=-3
Selection.AutoFilter Field:=3, Criteria1:="=検索する", Operator:= xlAnd

と、してみたものの、検索しても、その検索結果の隣のセルのコードをどうやって取得すればいいのかが、わかりませんでした。

基本事項は本で学びましたが、呪文のようなコードはよく理解できません。懸命にネットで検索して、訳して理解する努力をしてはいますが。

どうぞよろしくお願いします。

部品表というブックがあります
A列に商品名、B列に商品番号が入力してあります。C列のコードは未入力です。
A列     B列     C列      
商品名  商品番号  コード
モータ  U-1325-L  
ホルダ  R-134256

また、コード一覧表という別のブックには、A列に商品番号と、B列にコードが、何千件も入力されています。

やりたいことは
部品表のC列のコード欄に、コード一覧表ブックから商品番号と一致するコードを貼り付けしたいのです。

部品表は、何百種類もありますので、関数...続きを読む

Aベストアンサー

こんにちは。
とりあえず実用性も踏まえました。
メインの動作はワークシート関数のVLOOKUPをVBA上で使用していますので理解はしやすいかと思います。
また、質問文から察するに「部品表.xls」と「コード一覧表.xls」の両方を開いて処理されていますが「コード一覧表.xls」はプログラム内で開いて閉じているので実行するときは「コード一覧表.xls」は閉じて置いてください。
Option Explicit
Sub Sample()
 Application.ScreenUpdating = False
 Dim I As Long
 Dim xlBook
 Set xlBook = Workbooks.Open("C:\★★\コード一覧表.xls") '★要変更★
 I = 2
 Do While Range("A" & I).Value <> ""
  ThisWorkbook.Worksheets("Sheet1").Range("C" & I).Value = Application.VLookup(ThisWorkbook.Worksheets("Sheet1").Range("B" & I).Value, xlBook.Worksheets("Sheet1").Range("A2:B65535"), 2, 0)
  I = I + 1
 Loop
 xlBook.Close
 Application.ScreenUpdating = True
 MsgBox ("完了")
End Sub

こんにちは。
とりあえず実用性も踏まえました。
メインの動作はワークシート関数のVLOOKUPをVBA上で使用していますので理解はしやすいかと思います。
また、質問文から察するに「部品表.xls」と「コード一覧表.xls」の両方を開いて処理されていますが「コード一覧表.xls」はプログラム内で開いて閉じているので実行するときは「コード一覧表.xls」は閉じて置いてください。
Option Explicit
Sub Sample()
 Application.ScreenUpdating = False
 Dim I As Long
 Dim xlBook
 Set xlBook = Workbooks....続きを読む

QEXCELのVBAでRange("A1:C4")を変数にする方法を教え

EXCELのVBAでRange("A1:C4")を変数にする方法を教えて下さい。

Sub Sample1()
Range("A1:C4").Borders.LineStyle = True
End Sub

上のマクロの"A1:C4"を変数にして成立させるにはどのように設定すればいいのでしょうか?
以下の方法ではエラーになってしまうので、宜しくお願いします。

Sub Sample1()

HENSU = Chr(34) & "A1" & ":" & "C4" & Chr(34)
Range(HENSU).Borders.LineStyle = True
End Sub

Aベストアンサー

こんなので好いですか?
下記をモジュールシートへ貼り付けて試行してみて下さい。

Sub Sample2()
Dim HENSU As String '←変数の宣言をします。

HENSU = Chr(34) & "A1" & ":" & "C4" & Chr(34) ' ""A1:C4"" を返します。←NG
HENSU = "A1" & ":" & "C4" ' "A1:C4" を返します。←OK
HENSU = "A1:C4" ' "A1:C4" を返します。←OK
Range(HENSU).Borders.LineStyle = True ' HENSUの範囲に罫線を引きます。
End Sub


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

人気Q&Aランキング

おすすめ情報