- ベストアンサー
エクセルVBA作成に関して
Wendy02の回答
こんにちは。 やはり、ほぼ解答が出てしまいましたね。 私の入門編の回答は、とっておきます。 もう、ここらで十分だとお思いなら、このまま締めてしまってもかまいません。 ただ、基本としては、 ・変数の宣言はすること。 ・プロシージャ名や変数には、ある程度、名前の付け方があって、暗黙のルールがある。* ・仮に、デフォルトプロパティでも、オブジェクトのプロパティの省略はしないこと。 ・オブジェクト(Range型等)の取得のそのプロセスに、Select は必要ない。 *ただし、Excel VBAでは、変数の命名規則(LNC)を使いすぎると、なんとなく野暮ったく感じます。 ということです。そういうルールを無視しても、VB系はコーディングが可能だということですね。VBAを知らない人に、VBAのコードはこんな風だといっても、何にもなりませんね。出来る人も出来ない人も、志を持ったら、後は、自分自身がどれほど精進していけるかということだと思います。 以下は、私の今の力で書いた実験的なマクロです。 力のレベルというのもヘンですが、このぐらいで、 http://vbae.odyssey-com.co.jp/index.htm Excel VBA エスキパート スタンダードレベル パス だと思っていいと思います。(私は、資格は持っていません。お金が惜しいからです) #2で述べた #単純に見えてそうではありません。VBAで、忠実に再現させるのは、とても難しいです。一般のVBAとは考え方が違うつくりなのです。 というのを再現させてみました。もともとの質問の趣旨のマクロとは、まったく種類の違うものですが、#2で書いたときに、おぼろげながら、こんなコードを頭に浮かべていましたので、一応、書いておきます。これは、入門レベルでは参考にはなりませんが、こういうものも、時に作らないと自分の技術の維持にはならないように思っています。 これは、SUMPRODCUCT 関数を再現しようとして作られたものです。 数式は、このように入ります。たぶん、横の配列には考慮しておりません。 =MYSUMPRODUCT(A1:A4,B1:B4) これは、横を増やすことが出来ます。 例: =MYSUMPRODUCT(A1:A4,B1:B4,C1:C4) また、こういう式も可能です。 =MYSUMPRODUCT(A1:A4,(B1:B4>3)*1) '標準モジュール '-------------------------------------------------- Function MySumProduct(ParamArray Ary() As Variant) Dim Art() As Variant Dim Ar() As Variant Dim i As Long, j As Long, k As Long, e As Integer Dim max As Long Dim n As Long Dim c As Variant Dim a As Variant Dim v As Variant Dim sbtotal As Variant Dim mTotal As Double Dim myfrml As String Dim arfrml As Variant Dim x As Variant Dim m As Integer Const vbMyError As Integer = 513 On Error GoTo Extra For Each a In Ary() If IsError(a) Then '特殊数式 Err.Raise vbMyError Ary(e) = a End If If StrComp(TypeName(a), "range", 1) = 0 Then j = UBound(a.Value, 1) ElseIf VarType(a) = vbVariant Or vbArray Then k = UBound(a, 1) End If If max < j Then max = j ElseIf max < k Then max = k End If e = e + 1 Next a e = 0 ReDim Ar(UBound(Ary())) For i = 1 To max For Each a In Ary() If StrComp(TypeName(a), "range", 1) = 0 Then Ar(n) = a.Cells(i, 1).Value ElseIf StrComp(TypeName(a), "variant()", 1) = 0 Then Ar(n) = a(i) End If n = n + 1 Next a For Each v In Ar() If VarType(v) <> vbDouble Then sbtotal = Empty Exit For End If If sbtotal = Empty Then sbtotal = CCur(v) Else sbtotal = sbtotal * CCur(v) End If Next v mTotal = mTotal + sbtotal sbtotal = Empty n = 0 Next i MySumProduct = mTotal Exit Function Extra: '配列数式の場合 If Err = vbMyError Then On Error Resume Next With Application.Caller myfrml = .FormulaLocal myfrml = Replace(myfrml, "=MySumProduct(", "") myfrml = Mid(myfrml, 1, Len(myfrml) - 1) arfrml = Split(myfrml, ",") a = Application.Evaluate(arfrml(e)) '配列を1次元に戻す If UBound(a, 1) > UBound(a, 2) Then ReDim x(UBound(a, 1) + 1) Else ReDim x(UBound(a, 2) + 1) End If m = 1 For Each v In a x(m) = v m = m + 1 Next v End With a = x On Error GoTo 0 Resume Next End If End Function
関連するQ&A
- エクセルVBAの掛け算
お世話になります。 VBA初心者です。 セルA1にはB1×C1の答え Range("A1").Value = Range("B1") * Range("C1") これを、B1が空白ならA1も空白に、そうでないならA1にB1×C1の答えを入れたいのですが 分かりません。 Range("A1").Value = "IF(B1="""","""",B1 * C1)"これだと A1に『 =IF(****** 』と関数が入ってしまいます。 どなたか 分かる方教えて下さい。 宜しくお願いします。
- ベストアンサー
- その他(業務ソフトウェア)
- エクセルVBA
A列を基準にBC列が空白ならAの数値を入れて、A>BならB列を更新、A<CならC列を更新 A列が数値以外ならその行をスキップ、という処理をしたいのですが Option Explicit Dim A As Range, B As Range, C As Range Dim i As Long Sub test() For i = 1 To 10 Set A = Cells(i, 1) Set B = A.Offset(0, 1) Set C = A.Offset(0, 2) If IsNumeric(A) Then Else Exit Sub End If If B.Value = "" Then B.Value = A.Value If C.Value = "" Then C.Value = A.Value If A.Value > B.Value Then B.Value = A.Value If A.Value < C.Value Then C.Value = A.Value Next i End Sub とすると数値以外の行の時点で停止してしまいます。 その行を飛ばして次の行に進むにはどうしたらいいのでしょうか?
- ベストアンサー
- Visual Basic
- ExcelのVBAに詳しい人に質問です
下記のURL画像のような表があります。 http://www.poverty.jeez.jp/ura/img/kenmou01000.png A列に入っている1~62までの文字(画像ではわかりやすく数字にしています。)を、右の表の番号をふっている箇所に順番通りに挿入するVBAを組みたいのですが、どのような書き方が1番効率的なのでしょうか。 例えば、一つ一つやるなら62列も一々打つことになるので手間がかかってしまいます(;´Д`) Range("B5").Value = Range("A1").Value Range("C5").Value = Range("A2").Value Range("D5").Value = Range("A3").Value 何か良い方法はありますでしょうか。数学が出来ない馬鹿な私にアドバイスよろしくお願いしますm(_ _)m
- ベストアンサー
- Excel(エクセル)
- ExcelのVBAで・・・
VBA初心者です。。 Excelのある列のセルの値が全角文字の場合に、 隣の列に全角カタカナに変換した値を転送するVBAがあります。 変換元の列の中に空白セルがあった時は変換先のセルに 文字があっても空白に置き換えたいのですが、方法がわかりません・・・。 使用しているVBAの内容は下の通りですが、どういう風に 修正すれば実現できるかアドバイスを頂けないでしょうか? よろしくお願い致します! Dim C As Range For Each C In Range("E3", Range("E65536").End(xlUp)) If C.Value <> "" Then _ C.Offset(, 1).Value = Application.GetPhonetic(C.Value) Next
- 締切済み
- その他(プログラミング・開発)
- Excel VBA の作り方について【初心者】
Excel VBA の作り方について質問させてください。 A1セルに「営業部【山本】」と入力されています。 B1セルに「01:35:24」(タイム)と入力されています。 (1)D1セルに「山本」を抜き出して表示 (2)E1セルに「95」(分数)で表示 (3)A2以降で同じ作業の繰り返し(最終入力列まで) というVBAを作成しております。 Sub macro1() '行数確認 nr = Range("A1048576").End(xlUp).Row For i = 1 To nr '名前抜き出し x = Range("A1").Offset(i - 1) j1 = InStr(x, "【") j2 = InStr(x, "】") Range("D1").Offset(i - 1) = Mid(x, j1 + 1, j2 - j1 - 1) '分表示 x = Range("B1").Offset(i - 1) Range("E1").Offset(i - 1) = Int(x * 24 * 60) Next i End Sub ここまではプログラムが完成しています。 この後、 (4)C列セルに入力されている数値をF列セルにそのまま入力 したい場合には、どの部分にどのようなプログラムを追加すればよいでしょうか? よろしくお願いします。
- ベストアンサー
- Visual Basic
- Excel VBAの繰り返し構文について
A列に日付、B列に曜日、C列に休、D列に1直、E列に2直、という形の年間シフトを作成しています。 初期値としてA2セルに数字を入力→C列が空白の時だけD列に記入するマクロを作成したと思っています。 現在仮として、 Sub C列のセルが空白の行のD列に数値を入力() 下端行 = Range("A" & Rows.Count).End(xlUp).Row '下端検出 For 行 = 3 To 下端行 '1行目から下端行まで1行ずつ繰り返す If Range("C" & 行).Value = "" Then 'その行のC列のセルの値が空白の時 Range("A2").Copy 'A2をコピーする Range("D" & 行).PasteSpecial Paste:=xlPasteFormulas 'その行のA列のセルを起点に 'して数式を貼り付ける End If Next End Sub というマクロを置いていますが、「Range("A2").Copy」の部分を 「A2を初期値として、最初にC列が空白でなくなる時まで初期値を繰り返し、次にC列が空白になった場合は初期値+1の数をD列に入力する。 ただし初期値+1の最大数は6までとする(要するに1~6の繰り返しです)」 という感じに変更したいのですが、どうすればいいのかさっぱりです…。 VBAレベルはこの質問をする程度なのでかなり初級です。
- ベストアンサー
- その他MS Office製品
- EXCEL 2010 VBAまたは関数について
こんにちは 初投稿です。 早速ですが、VBAまたは関数について質問させて頂きたいのですが・・・ 一つのセルに複数の数字と文字列がセルのE1混ざっている場合, (12345abc678cdef9ghijk)と入っている場合 にこの例で行くとセルのA1に12345セルB1に678セルC1に9というように数字で表示させたいのです が、最初関数で A1=VALUE(MID(E1,1,5)) B1=VALUE(MID(E1,9,3)) C1=VALUE(MID(E1,16,1)) と言う形で数字だけ抜き出していたのですが これだと数字の桁数が違ってくる(※正し文字列の長さは一緒 数字だけが桁が違ってきます) と表示されなくなってしまうため、 出来れば関数をいじらなくても表示されるようにしたいのです。 VBAもしくは関数でこの問題を解決出来る方がいらっしゃるなら どうぞよろしくお願い致します。 長文失礼致しました。 | A | B | C | D | E | ------------------------------------------------ 1 | 12345 | 678 | 9 | | 12345abc678cdef9ghijk | 2 | | | | | |
- ベストアンサー
- オープンソース開発
- Excel VBAで…。
データーシート(1)のデータをレイアウトシート(2)に転記するのに 例えば sheets(1).range("A1").value=sheets(2).range("C5").value sheets(1).range("B1").value=sheets(2).range("C6").value sheets(1).range("C1").value=sheets(2).range("C7").value と言うように配置しているのですが もし、シート(1)セルB1の値が空白ならば シート(1)セルC1の値はシート(2)のセルC6に配置・・・ と言うように データがない場合は、転記後の配置は詰めて配置したいのです。 どうすればよろしいでしょうか?
- ベストアンサー
- オフィス系ソフト
- エクセル SUMPRODUCT関数でこんな場合は?
Excel2000です。 添付画像のような表があります。 A列、B列に数値、C列に文字列です。 A列の数値は単なる数値ではなく、計算式で求められています。 したがって表内A列の何も表示されていないセルは、計算の結果 ="" になったものです。 B列の数値は直接入力した単なる数値です。 この表で仮に、C列がAの場合のA列合計を求めるため、D6に =SUMPRODUCT((A1:A5)*(B1:B5)*(C1:C5="A")) としてみましたが、="" を乗じているためVALUEエラーになります。 =""を排除しようと、 =SUMPRODUCT((A1:A5<>"")*(A1:A5)*(B1:B5)*(C1:C5="A")) としてみましたが、やはりVALUEエラーになります。 こういう場合はどうしたらよいのでしょうか? ="" を =0 に変えるという回答以外でお願いいたします。
- ベストアンサー
- オフィス系ソフト
- エクセルVBAとワークシート関数が違う答え?
エクセル2013です。 A1セルからA100セルにすべて1%と入力されています。 BIセルに =SUM(A:A) と数式が入っており、100%と表示されています。 A,B列のセルの書式はすべてパーセテージです。 101行以下には何も入っていません。 C1セルに =B1=1 と数式が入っており、TRUEが表示されています。 標準モジュールに Sub test01() MsgBox Range("B1").Value = 1 End Sub と書きました。 実行したところFalseが帰ってきました。 なぜ、TRUEにならないのでしょうか? なお、 Sub test02() MsgBox Val(Range("B1").Value) = 1 End Sub とすると、TRUEが帰ります。 でも、Val関数はStringを数値化するものですよね? B1セルはもともと数値なのでVal関数で答えが変わるのも不思議です。 どなたか、わかるように教えていただけないでしょうか?
- ベストアンサー
- Excel(エクセル)
お礼
プログラムまで乗せていただいてありがとうございます. ひとつの回答をいただきましたのでこれでクローズしたいと思います. 今回の質問にて自分が気がつかないことがたくさんあることに気づかされました. あらためて,ゆっくりでもよいからVBAの学習を進めていきたいと思います. 回答をくださった皆様にも感謝いたします. それでは失礼いたします.