rivate Sub CommandButton1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) If 2 < X < 14 And 2 < Y < 14 Then Label1.Visible = True Else Label1.Visible = False End If End Sub ワークシート上に配置したコマンドボタン(縦、横共に大きさ15) 上にマウスがある場合はラベル1を表示。 ボタンの端にある場合は非表示にしたいのですがうまくいきません。 (わけあってユーザーフォームは使わずに作りたいのですが。。。←ユーザーフォーム上はmousemoveイベントがある) 透明なラベルを後ろに配置し、そこにマウスが乗った時に ラベル1を非表示にすることはできましたが、 透明なラベルをクリックすると見栄えが悪いので上記の方法を取り組んでいます。 よろしくお願いいたします。
このIF文実行できんの?
で、どう動かないの? イベントはあるんだっけ? まぁあったとして、それじゃあマウスの移動速度依存だよ .netなら入ってきた、出ていったイベント使えるけど。 だから他のコントロールと連携してマウスの動きを監視するとかしないと期待する結果とはならないです。 オレだったらそのイベント1秒後にAPIでマウス座標取るようにするかな、OnTimeで。
>>3 × If 2 < X < 14 And 2 < Y < 14 Then
○ If 2 < X And X < 14 And 2 < Y And Y < 14 Then
>>4 できる。「2 < X < 14」は「(2 < X) < 14」だから、VBAの場合は常に真になる。
わずか数ドットの範囲をチェックする方法だと、マウスを速く動かすとイベントがうまく発生しないよ
8 :
デフォルトの名無しさん :2010/04/15(木) 12:50:20
commandbottunを複数用意し、clickイベントでそれぞれのcaptionを A列の一番下の行の下に表示させたいと思っています (日記で天気を入力するような感じです 晴れ曇り雨ボタンを作成して、それぞれを記入する感じです。 またこの先も追加される可能性があります) こういった複数のボタンの動作をまとめることは可能ですか? それとクリックイベントとダブルクリックイベントもまとめたいのですが、可能でしょうか 連続で押すとダブルクリックとみなされてしまいイベントが発生せず困っています 'この三行をCommandButton2.3以降もまとめたい Private Sub CommandButton1_Click() Call tenki(CommandButton1.Caption) End Sub 'ダブルクリックも同様にまとめたい Private Sub CommandButton1_DblClick(ByVal Cancel As MSForms.ReturnBoolean) Call tenki(CommandButton1.Caption) End Sub '書き込みルーチンです。 Sub tenki(tenkihensu As String) Dim gyo As Long gyo = Range("A500").End(xlUp).Row + 1 Cells(gyo, 1) = tenkihensu End Sub
>>8 VBAでは無理。ずらっと並べて書くしかない。VBだとまとめられるんだけどねえ。
>>8 クラスモジュールを使ったらどう?
>クリックイベントとダブルクリックイベントもまとめたい
未対応です(クリックイベントのみです)
1)クラスモジュールを挿入(モジュール名 Class1)
Private WithEvents myButton As MSForms.CommandButton
Public Property Let SetButton(Button As MSForms.CommandButton)
Set myButton = Button
End Property
Private Sub myButton_Click()
Call tenki(myButton.Caption)
End Sub
2)ThisWorkbookへ記述(CommandButton1〜CommandButton10まである場合)
Private myButtonArray(1 To 10) As New Class1
Private Sub Workbook_Open()
Dim i As Integer
Dim Sh As Worksheet
Set Sh = Sheets("Sheet1")
For i = 1 To 10
myButtonArray(i).SetButton = Sh.Shapes("CommandButton" & i).DrawingObject.Object
Next
End Sub
※2)のコードは標準モジュールでもいいんだけど
このコードが実行された時点でクラスモジュールのコードが
CommandButtonと結びつき 有効(実体化)となります。
参考にしたサイト
ttp://oshiete.homes.jp/qa4601661.html
11 :
デフォルトの名無しさん :2010/04/16(金) 01:40:41
最近Excel2000 VBAを勉強し始めました。 これまではCをやってきたので、その違いに戸惑っています。そこで教えてください。 1 見やすいソースになるように、TABを使って自分なりの整形するのですが、 次の行に移ると、勝手にレイアウトが変えられてしまいます。 普通のエディタのようにレイアウトを保持することは出来ないでしょうか? 2 TABが、半角スペース4つになってしまいます。TABを保持させるには、 どの設定を触れば良いでしょうか? 3 変数宣言をしないとコンパイルエラーを起こすように出来ないでしょうか? 1文字タイプミスしても変数として動作するため、ちょっと心配なんです。 4 予約語の先頭が大文字になってしまうのですが、これを止めることは出来ないでしょうか? 5 複数行をコメントアウトするのに、行選択してボタンを押すようですが、 /* */ のような記述はできないでしょうか? 6 セルを指し示すとき、Cells( y, x )で指示するようですが、 Cells( x, y )のようにすることは出来ないでしょうか? 以上です。宜しくお願いします。
>>11 (1) できない
(2) 変えられない
(3) モジュールの先頭にOption Explicitと書く
(4) できない
(5) できない
(6) できない
座標がy, xになるのはExcelに限らず表計算ソフトのルールだから慣れるしかない。
それにy, xじゃなくてr, cと覚えた方がいい。
ソース関連は別のエディタで書いてコピペするぐらいしか根本的な解決方法がない。
VBAはあくまでもVBのサブセットだから制約がかなり多い。VBAである必要性がないのならVBを使った方がいい。
前スレで出てたけど、予約後の先頭を大文字にしない方法は一応ある。 たとえばIfをifにしたい時はdim if [Enter]と入力してからこの行を消去する。 そうするとエディタが一時的に「if」というキーワードを記憶してくれる。 とても実用的な方法ではないけどね。
(5)編集コマンドバーに、複数行をコメントにする機能ならあるけど
>>12-14 みなさん、ありがとうございます。よくわかりました。
慣れるしかないって感じですね。
エディタのツール→オプション→編集のところに「変数の宣言を強制する」というチェックボックスがありました。
これは、
>>12 のご回答「(3) モジュールの先頭にOption Explicitと書く 」と
同じ効果がありそうな、感じがします。
>VBAである必要性がないのならVBを使った方がいい。
VBにすると、私の質問の多くが解決されそうでしょうか?
特にTABの保持が実現できるなら、VB買おうかなと思います。
アプリを1から作るためのVBではなく、
トレース実行など、現在のVBAのようにExcelとの連携が密にできて、
Excel付属のVBAの使いにくさが解決できるなら、ぜひ買いたいです。
>>16 うぉーーー、これは便利です。
さっそく取り入れました。キーボードから手が離れないのが素晴らしいです。
これはいいです。ありがとうございました。すばらしい。
ちなみに、初心者質問させてください。
C言語などで言う「#include "hoge.c"」のような、ソースファイル組み込みは
VBAでできるでしょうか?
単にその位置に別ファイルのソースを挿入するだけの機能です。
1つのボタンでの処理が長くなってきたので、別ファイルに分割したいと思っています。
subにしてもよいのですが、変数をpublicで宣言したりとか、結構手間そうなので。
includeというキーワードで検索したのですが、見つけられませんでした。
そもそも#include "hoge.c"とかやるのが筋が悪い
アホか
関数呼び出し程度のオーバーヘッドが嫌なのに、VBやVBA使うの?
すみません。組み込み屋なので、マイコンのときは気にしてしまいます。 エクセルはPCなので関係ありませんが、 記述スタイルを踏襲したいんです。
頭固すぎw
コボラーがJavaやるみたいなもんか
(;゚д゚)ァ
だめだこりゃ
言語仕様や開発環境の違いをいちいち気にしてたら仕事にならない。適応力を試されてると考えるんだ。 複数の環境を使い分けられない人間はプログラマーをやる資格がない。
最近打ち合わせでは分かり切ったことは飛ばして話を進めているのに 知識として持っててあたりまえのことを質問する馬鹿が増えた
TABの保持にこだわる理由が分からん 変数の宣言位置を揃える古臭い書き方でもしてるのか?
むしろ半角スペースになった方が揃うでしょ
どんなエディタで見ても、ね もちろん固定幅フォントにする必要はあるが
2つのシートに行った来たりして、変数に数値を入れるマクロができました。 sub ○○を 標準モジュール、module1に記述しています。 ボタンを作ってクリックすればマクロが動かせると言うことで、 sheet1にボタンを作って、clickにて動くようにしたところ(コードはsheet1に移動) rangeコマンド等が、sheet1を書き換えるようになってしまいました。 sheets("sheet2").select range("A1").value = hogehoge みたいな感じにして、従来はきちんとsheet2のA1に数値が入っていたのですが、 sheet1のA1に数値が入るようになってしまいました。 with sheet1のような感じになっているのですが、 どのように対処すればいいでしょうか?
VBAを捨てる
説明がよくわからないのでその.xlsをうpしてください
>>32 その説明では状況がまったくわからないので答えようがない
withsheet2で
>>32 range("A1").value = hogehoge
のコードもsheet1にあったりする?
この状況だと対策は
Rangeへ シート指定する
or
コードを標準モジュールに戻す
>>32 それぞれのモジュールで
MsgBox Range("a1").WorkSheet.Nameとしてみな。
39 :
デフォルトの名無しさん :2010/04/18(日) 01:39:24
>>29 >TABの保持にこだわる理由が分からん
キミにはわからないだろうな、きっと。
40 :
1/2 :2010/04/18(日) 02:05:26
以下のようなランダム出題によるYES,NOクイズをつくりました。 しかし、無駄な記述が多すぎてクイズが100や200になったときには処理が遅くなる気がするのと、 もっと見易い書き方ができるような気がします。 (例えばいちいち問題文に""をつけるのは面倒くさいので、ans部分で一括してつけるとか) 修正できる方、修正お願いします。 また三択以上の問題(例.a.明智光秀、b.豊臣秀吉、織田信長)にするときの記述も思いつかないので、 そちらも教えてください。 Dim a As String Dim b As Integer Dim c As Integer b = Int(3 * Rnd + 1) If b = 1 Then a = "本能寺の変を起こしたのは明智光秀である" c = 0 ElseIf b = 2 Then a = "関ヶ原の戦いは1500年に起こった" c = 1 Else a = "平城京が移転したのは710年である" c = 0 End If ans = MsgBox((a + "?"), vbYesNo, "質問")
41 :
2/2 :2010/04/18(日) 02:06:08
If c = 0 Then Select Case ans Case vbYes MsgBox "正解" Case vbNo MsgBox "不正解" End Select Else Select Case ans Case vbNo MsgBox "正解" Case vbYes MsgBox "不正解" End Select End If
42 :
40 :2010/04/18(日) 02:11:21
なお、一から書き直した方が作りやすい場合は、 私の記述を元にせずに、そちらを書いて下さい。
無駄な記述が多すぎ 一から書き直した方が作りやすい おまえに書いてやったら何かくれるなら書いてやらんでもない
問題をプログラムに埋め込むな せっかくExcel使ってるんだから 問題文と正解・不正解を シートに記述出来るように汁
>>40 そのままでも100や200なら大して遅くはなりませんから安心して下さい。
丸写しは感心しないので、まずは二択のプログラムを作ってみせてください。
二択の問題の例
問題 本能寺の変を起こしたのは誰か?aかbで答えなさい。
選択肢 a.明智光秀、b.豊臣秀吉
解答 ( )
b
c 織田信長
俺をaとかbとか記号で呼ぶな
d. 徳川家康 e. 千利休 f. 柴田勝家
かなり既出であれば申し訳ありません VBAでPDFファイルを作成したいのですが,以下の件で困っています ・ファイル名,出力先フォルダを指定できない 1,2回であれば,手作業でもかまわないのですが, 各事業所毎に出力するため30回ちかく保存先ダイアログが出る度に ファイル名を入力して保存しています。 PCにはAcrobat,クロセPDF2などがインストールされています。 よろしくご指導ください。
51 :
1/2 :2010/04/19(月) 01:01:43
>>43-45 ありがとうございます。
参考にして2択問題をつくってみました。
vbyesnoでは作り方がわからなかったため、
ボタン式ではなくaかbを入力式にしました。
皆さんなら言うまでもなくわかると思いますが、
A列に問題文(本能寺の変をry)、B列に選択肢a(明智光秀)、
C列に選択肢b(豊臣秀吉)、D列に答え(a)がエクセルに入ってます。
Dim a As String
Dim b As String
Dim c As String
Dim ans As String
Dim d As String
Dim i As Integer
i = 1
a = Cells(i, 2).Value
b = Cells(i, 3).Value
c = Cells(i, 1).Value
d = Cells(i, 4).Value
52 :
2/2 :2010/04/19(月) 01:02:31
ans = InputBox(c + "? aかbで答えなさい。" & vbCrLf & "a." & a & " b." & b) If ans = d Then MsgBox "正解" ElseIf ans <> "a" And ans <> "b" Then MsgBox "aかbで答えて下さい" Else MsgBox "不正解" End If
クロセPDF2は使用禁止です
× クロセ ○ クセロ
>>50 出力する方法はたくさんありますし、何もかも説明するのは不可能です。
今はどんなマクロで出力していますか。保存の部分を書いて下さい。
たぶん少し修正するだけで自動化できる可能性があります。
>>51 その方法だと、三択の時は解答がE列、四択だと解答がF列になってしまいます。
目的(この場合は解答)が同じセルは同じ列にまとまるようにすれば、
プログラムを作る手間が少なくなります。もう一工夫しましょう。
Invoke()は使えますか?またはその代替
IDispatch::Invokeなら、遅延バインディングしてれば内部で勝手に使うだろ。
>>56 なるほど。
つまり、A列が問題としたらB列を解答として、
数が可変な選択肢は最後の方の列に羅列した方がいいというおとですね。
60 :
デフォルトの名無しさん :2010/04/21(水) 14:39:31
質問です VBAのFSOを使ってファイルを抽出 データのファイル名や最終アクセス日などリスト化 ここまではできたのですが指定した日付より 前のアクセス日時のものをほかの列にリスト化するということが できません、どなたか教えて頂けませんか?
それはご愁傷様です
オートフィルタ→コピー
63 :
たろう :2010/04/21(水) 19:32:46
テキストボックスの設定でコンボボタンをクリックしたらテキストぼっくっすの数値をシート1のA列に記入しなさい とまではわかったのですがテキストボックスが空白の時にデバックがかかってしまうのですが どうやればかいひできますか?
テキストボックスが空白の時にテキストぼっくっすの数値をシート1のA列に記入しないようにすればいいよ
65 :
たろう :2010/04/21(水) 19:36:52
どうすればいいですか?
そんな初歩的な・・・。
文字列をひっくり返す関数下さい in→あいうえお out→おえうあい こんな感じのです
特定の文字列を逆転させる サンプルマクロは、アクティヴシートのA1の文字列を逆転させます。 Sub Sample() Dim myStr As String Dim myLetter As String Dim i As Integer i = Len(Range("A1").Value) + 1 While i > 1 i = i - 1 myLetter = Mid(Range("A1").Value, i, 1) Select Case StrConv(myLetter, vbWide) Case "゛", "゜" i = i - 1 myLetter = Mid(Range("A1").Value, i, 2) End Select myStr = myStr & myLetter Wend Range("A1").Value = myStr End Sub
>>67 Function 反転(S)
For i = 1 To Len(S)
T = Mid(S, i, 1) & T
Next
反転 = T
End Function
VBAで出来そうで思いつかないので知恵を貸してください。 1.ある商品を数箇所に店舗に卸します。 2.それぞれの店舗のオーダー数はバラバラですが、カートンは出来るだけ共通のものを使いたいと思います。 ただし、取扱いに困るほど大きいものは使えません。 3・それぞれの店舗の発注数を入力するだけで、最適なカートン入数を弾き出せないでしょうか? <例> 靴の発注(10足〜20足入りが最適) 店舗A 120足 店舗B 82足 店舗C 118足 店舗D 180足 10足入りをメインにすると、2足と8足入りの端数が出るため3種類のカートンが必要になります。 20足入りでも同様です。 そこで12足入りにすると、 店舗A 12足入*10 = 120足 店舗B 12足入*6 + 10足入 = 82足 店舗C 12足入*9 + 10足入 = 118足 店舗D 12足入*15 =180足 ということで12足入と10足入の2種類で済みます。 こういった計算を自動でするにはどの様な式を組めばいいのか知恵を貸して頂きたく・・。 もしかしたら他スレで訊くべき内容かもしれませんが、計算に強い方がいらっしゃいましたら 知恵を貸してくださいm(_ _)m
71 :
デフォルトの名無しさん :2010/04/22(木) 14:42:20
ageさせてください!
>>70 条件が「取り扱いに困るほど大きい」では計算ができません。
いくつ以下、と具体的な数字で示して下さい。
>>67-69 Mid statementを使えば、For i=1 To Len(s)/2でできるだろ
>>70 10足分入るカートンと、12足分入るカートンの2種類があって
最適な組み合わせを調べたいってこと?
>>72 商品によって変わるので一概に言えません。
(例としては靴の場合で10-20足入としました)
とりあえず変数で示して頂ければ幸いです。
実務上では品目ごとにを許容範囲を設定し、参照する形にしたいと思います。
>>74 全数を最小の種類のカートンで出荷するには、何足入と何足入のカートンを用意すればいいのか?
ということを調べたいのです。
例では、
10足入の場合は、他に12足入と18足入の合計3種類カートンを作らなくてならないのに対し、
12足入では12足入と10足入の2種類で済むので効率的です。
実際は取引先も扱い商品も多数あり、いちいち考えるのが大変なので、
自動で最適結果を出したいと思っています。
素因数分解と最大公約数がミソだが カートン候補がありすぎるとプログラムも大変だな
まず4C2で6通りの最大公約数を求める @ この6つの公約数を見比べて、標準カートン10前後の奴の数が多い奴で1つ確定 30とか40とか大きくなったら10にするような処理が必要 それでまず2店舗〜4店舗が確定 残りの2店舗で割り切れない場合 A その2店舗の最大公約数があればそれでもう1種確定 それがなければ B @の確定カートンで割った余りを求め、その余り2つに公約数があれば確定 それもなければ C Bの商から1減らしてあまりを求め(つか、さっきの余りに@をプラスして)、その2つに公約数があれば確定 @で、標準カートンに近いものがない場合(2とか3とかにしかならない) 強引にカートンを10にしてしまいBから以下を4店舗分繰り返す
仰るとおり、因数分解と公約数だな、と思ったのですが、 これが中々難しくて・・・ アタマが痛くなってきてしまいましたw
店舗Eの発注が9足だった場合、許容範囲を9〜に下げて そして9個いりのカートンは使うってことなのかな?
力づくで計算したらいいのに For K=カートン最小値 To カートン最大値 S=必要数(K) If S > 暫定必要数 Then S = 暫定必要数 Next
>>80 1つ違うくらいならそうしたいですが、大幅に違う場合は例外として扱うことになると思います。
(1000-5000個が適用範囲の商品に、15個の発注が来た場合など)
ただ、実際にはあまり少量のオーダーは受けないので無視して良い事例かと思います。
>>78 ちょっとイメージできないので考えさせてください・・
皆さんありがとうございますm(_ _)m
VBAに関係ないことになると嬉々としてレスする奴がいるよな
単純に 下1桁が2の倍数なら、12カートンを(1桁/2)個用意すれば、残りは10カートンで済む どうせ奇数はないんでしょ?あっても繰り上げすれば済む 結論 全て12と10のカートンでおk
>>84 すみません。カートン総数も減らしたいので出来るだけ多くパッキングしたカートンを基本にしたいのです。
書いてなかったですね。申し訳ない。
奇数もありますが、ご指摘のとおり繰上げ処理でも問題ないです。
なんかスレ違いな気がしてきたので、もうちょっと考えてみますねw
スレ汚し失礼しましたm(_ _)m
↑ この書き込みの意図がわかりません
端数を切り上げてもいいんなら、12個入りのカートン1種類だけでいいじゃん なんか条件が曖昧すぎるよ コンピューターのプログラムってのは、もっと厳密に数字が決まってなきゃ作れないんだよ 条件が色々あるんなら、そのすべてをリストアップするか、法則を決める必要がある
1カートン1個なら端数は出ないし1種類で済む それでは困る場合は、「1カートンは最低でも何個以上にするか」「カートンは何種類以下に抑えたいか」 「端数がいくつまでなら切り上げ可能か」のような数字を商品ごとにすべて決めてデータベース化しないと。
>>85 商品別にカートンと個の間に、もう1つ数量の単位(組とか)を設定する。
上記例の靴だったら2個=1組
適用範囲1000〜5000個のものだったら200個=1組 みたいなかんじ。
組数以下の端数は1組として切り上げる。
こういう設定でできないかな?
エクセルが高くて買えないんですけど、タダで勉強するにはどうすればいいんでしょうか?
勉強するだけなら買わなくてもいいだろ
ネットの解説サイトを見て回ってればいい
実際に使いたいなら
>>91-93
どうもありがとうございます! タダでずっと使えそうなOPENOFFICEで頑張りたいと思います
コードを"ゴリゴリ書く"ってよく言うけど、 これってVBAにも当てはまると思う? Cやアセンブラならゴリゴリが似合うけど、 VBAならベタベタとか、ポロポロとかの方が 似合う気がするんだけど。
>>96 ゴリゴリ書くって表現は、処理の根幹部分で既存のライブラリに頼らないとか、
規模が大きかったり開発期間が短い場合に使うものだから、言語の違いは直接は関係ない。
けど、VBAはOfficeの特定の作業を自動化するのが目的の言語だから、
関数を数個書いて終わるケースが大半を占める。「ゴリゴリ書く」ことも少ないだろうね。
たまに大規模なアプリをVBAで作っちゃう人もいるけど、それはVBを使った場合にくらべて
開発効率や処理効率が悪いことがほとんど。
すべてのヘルプを読んでから質問するように
VBA初心者です この言語にはポインタみたいなのはないんでしょうか? リンクリストとかのデータ構造はどうやって実装しているんですか?
>>99 ポインタ型はありません。
リスト構造も標準では用意されていないので、実装はプログラマー依存です。
単なる整数型のインデックスと配列の組み合わせで実現することが多いと思います。
>>97 どうもありがとう。
ゴリゴリってそういう意味があったんですね。
知りませんでした。
ちょっとしたネタのつもりが良レスもらって感謝です。
教えてください。 WinXP SP3 office2000を使っています。 ボタン1とボタン2があり、どちらのボタンを押しても ボタン1の色が変わるようにしたいのです。 以下のようにして記述したのですが、色が変わりません。私は何か勘違いしているのでしょうか? Private Sub CommandButton1_Click() CommandButton1.BackColor = QBColor(10) ' ボタン1のボタン色を変える 実行される Call hoge1 ' 関数1を実行 CommandButton1.BackColor = QBColor(15) ' ボタン1のボタン色を戻す 実行される End Sub Private Sub CommandButton2_Click() CommandButton1.BackColor = QBColor(10) ' ボタン1のボタン色を変える 実行されない Call hoge2 ' 関数2を実行 CommandButton1.BackColor = QBColor(15) ' ボタン1のボタン色を戻す 実行されない End Sub 宜しくお願いします。
期待通りに動いていないんだから どうみても勘違いです ほんとうにありがとうございました
104 :
デフォルトの名無しさん :2010/04/23(金) 13:27:55
>>102 変わるぞ
三つ目を用意して
Private Sub CommandButton3_Click()
CommandButton1.BackColor = QBColor(10) ' ボタン1のボタン色を変える 実行されない
Call hoge2 ' 関数2を実行
CommandButton1.BackColor = QBColor(1) ' ボタン1のボタン色を戻す 実行されない
End Sub
試してみては
マクロはときどき壊れるからなぁ 最後に正常に動いていたときの バックアップを取るのは必定
>>104 追試、ありがとうございます。そうですか、動きますか。
もう一度やってみたのですが、僕の場合は動きませんでした。
hoge2関数の処理時間が3秒程度と長いので、
ボタンの色を変えて処理中であることを示したいのです。
しかし自身のボタン色ではなくて、他のボタン色を操作します。
もしかしたら他のボタンのことは操作できないのかと思っていました。
ボタン色の指示行の間に入れた関数処理自身は
正しく実行されるのですが、
指示したボタンの色がまったく変化しません。
まるで「どのみち元の色になるんだから、色を変えるのは省略します」と
言っているみたいです。
>>102 単に関数2が一瞬で終わってるだけじゃないか?
2003でこれ動くよ Private Sub CommandButton1_Click() CommandButton1.BackColor = QBColor(15) End Sub Private Sub CommandButton2_Click() CommandButton1.BackColor = QBColor(10) End Sub
doeventはさんでみるとか?
ホンとだ 間に処理かますと処理後の色変更しかしやがらねー
みなさん、いろいろ試してくれて、ありがとうございます。
僕は、以前に作ったExcelブックを使い回していて、必要に応じてボタンをcopyしたりして使っています。
なので自分で新規にボタンを作ったことがありません。
調べてみると、僕の使っているボタンは「オートシェープ」という部品のようです。
ボタンとオートシェイプとの違いで、できる/できない があるのでしょうか。
ちよっとパニックです。
>>110 ありがとうございます。できないですよね。
どうしてなんでしょう。もし何かヒントがあればおしえてください。宜しくお願いします。
>>111 じゃあたぶんボタンの名前を間違ってるだけだな
あとシェープじゃなくてシェイプな。大した違いではないけど何か調べるときに
検索やヘルプでひっかかりにくくなるから正しく覚えておいた方がいい
>>111 しばらく触ってなかったんでキーワードがみつからないが
色変更させてからシートなりオブジェクトなりを強制再描画させるとかの技はあるはずだ
でなきゃ点滅処理さえ効かない
>>111 hogeを呼ぶ前に DoEventsでうまくいった
>>105 マクロはときどき壊れるからなぁ
マクロはときどき壊れるからなぁ
マクロはときどき壊れるからなぁ
Mid関数と、Mid$関数の違いって、戻り値をバリアント型で返すか、文字列型で返すかだよね? バリアント型で返さないとエラーになる場合ってのはどういうとき?
>>115 あの餌で釣れるとは思わなかったんだが・・・
>>116 マクロはときどき壊れるからなぁ
マクロはときどき壊れるからなぁ
マクロはときどき壊れるからなぁ
オブジェクトブラウザで見ると、一応バリアント型とString型に分かれているけど、 評価しようとした時点で、必要に応じて自動でバリアント経由になってしまうから、 結果的に同じ意味にしかなり得ない、って感じかと。 VBA上では単にMid$がMidのエイリアス扱いの可能性もあるけど、それは判断のしようがない。 WindowsSDK付属のOLE/COM Object Viewerで「Visual Basic For Applications (Ver 6.0)」を覗くと、 Stringsモジュールに BSTR _stdcall _B_str_Mid([in]BSTR String, ... VARIANT _stdcall _B_var_Mid([in]VARIANT *String, ... の二つが見つかるのだが、これがMid$とMidに対応しているのかなあ。
みなさんのお知恵を、お貸しください。 下のようなif文を書いているのですが、まるで能が無くて、書いてて悲しいです。 nの中心付近を整数で求めたいんです。 下の例ではn=16ですが、実は250以上あったりして、これを全部手打ちで書いています。 何か規則正しいので、計算式で求められそうなのですが、うまく考えられません。 n=0, n=1は、if文で振り分けて、それ以上がなんとかならないかと。 If (n = 0) Then c = 0 ElseIf (n = 1) Then c = 0 ElseIf (n = 2) Then c = 2 ElseIf (n = 3) Then c = 2 ElseIf (n = 4) Then c = 3 ElseIf (n = 5) Then c = 3 ElseIf (n = 6) Then c = 4 ElseIf (n = 7) Then c = 4 ElseIf (n = 8) Then c = 5 ElseIf (n = 9) Then c = 5 ElseIf (n = 10) Then c = 6 ElseIf (n = 11) Then c = 6 ElseIf (n = 12) Then c = 7 ElseIf (n = 13) Then c = 7 ElseIf (n = 14) Then c = 8 ElseIf (n = 15) Then c = 8 板汚し、すみません。
>>117 , 120, 121
Mattew Curland著 「Advanced Visual Basic6」より
You should always use the $ versions of string function whenever they are available.
If a $ version of a function is available, then its non-$
counterpart actually returns a Variant rather than a String.
Although the VB compiler is smart enough to avoid duplicating
the string when assigning the return value of a Variant
function to a String variable, a significant amount of overhead and
code generation is involved in using the non-$functions.
If you think the extra character is too much trouble,
one look at the generated code wil cure your laziness.
Search for $ in the Object Browser to get a list of the $functions.
ってことで、$版使ったほうがいいという話。
ただ、VBAなんて手抜いてナンボなんで、目くじらたててやる必要もないよなあ。
>>122 c = WorksheetFunction.Ceiling(n / 2 + 0.1)
かな?
>>124 ありがとうございました。できました。
c = WorksheetFunction.Ceiling((n / 2 + 0.1),1) と、,1を追加しました。
大変助かりました。ありがとうございます。
Excelの命令が使えるこはビックリでしたが、
それよりも、VBAで切り上げ計算の演算子がないのがショックでした。
ありがとうございました。
>>126 これでもいいんじゃね
C = Int(n / 2) + 1
If C = 1 Then C = 0
128 :
デフォルトの名無しさん :2010/04/24(土) 14:33:34
>>127 ありがとうございます。
そうですね。1の特殊性がなければ、上の行1行でいいですね。
ありがとうございます。
助かりました。
129 :
デフォルトの名無しさん :2010/04/25(日) 02:38:39
教えてください。 Excel VBAのプログラムを書いて、仕事の改善に使っています。 しかし、VBAのテキストエディタが使いにくいので、なんとかできないかと思っています。 VBAエディタで不満なのは、 ・自分の好きなレイアウトでソースが書けない 半角スペース、TABが無視されてしまい、ソースが見にくい ・TABが半角スペースになってしまう。 そこで、別途VB.netなどを買えば、VBA内蔵のエディタはoffになり、 VBのエディタ(TABも半角スペースによる位置揃えも可能)が使えるものでしょうか? ブレークポイントやステップ実行なども使いたいです。
無理
>>129 そんなあなたにはExcelに埋め込むのは止めて
RubyとかPythonでWIN32COM経由で
Excel操作をすることを強くお奨めします
>>129 あなたがVBAのエディタに合わせたほうが早いです。以上。
最初はみんな用意されたものに抵抗するんだよね。
DLLで関数を公開することって出来ますか? DLLの読み込みはできるようなので ・スクリプトのDLLをロード ・セル操作などをスクリプトに公開 ・VBAからスクリプトをコール ・スクリプト内で計算 ・スクリプト内で公開されたセル操作などを使いExcelに出力 ・VBAに戻る といったことをやりたいのですが可能でしょうか?
ScriptControlで直接Excelからスクリプト呼び出しするのが普通。
もとからスクリプトサポートされてるんですねthxでした
微妙にVBAとは違うかもしれないのですがこちらで質問させていただきます ボタンを押して現在から2時間後を出してくれるように Cells(7, 3) = DateAdd("h", 8, Time) と作りセルの書式設定のユーザー定義で時間と分だけを表示するようh:mmに設定しました。 同じ日内で収まる場合なら正常に8時間後を出してくれるのですが、 日を跨いでしまうとなぜかユーザー定義が勝手にyyyy/m/d h:mmに変わってしまいます 宜しければ対処法をご教授くださいませ
>>137 Cells(7, 3).Value = Format(DateAdd("h", 8, Time), "h:mm")
>>138 無事表示してくれました
本当にありがとうございました
面接でVBAをアピールしたら「そんなもの下の下でしょ?(笑)という反応でした。 そんなに駄目っすか?だったらVBできますって言った方がまだ良い?
VBAの良さって普通の人であればあるほど知らない。 ただ、他のことも出来てVBAもできる、ぐらいじゃないと意味がない。
業種と職種による。 プログラマーならVBAは基礎知識のうちだからアピールポイントにはならない。
基礎知識なのか excelとかそもそも使わないし C++一筋だったからVBA最近まで知らなかったよ
事務員で「Excelできる人歓迎」みたいに書いてあったらVBA知ってるとかなり有利。 プログラマーならVBでもアウトだろうねえ。まあ会社にもよるだろうけど。
まあそうだけど事務員とプログラマーじゃ一応給料が結構違うし 事務員は月給12万くらいだけどプログラマーなら25万くらいあるし
客先常駐のPGだと経歴書にEXCELとかVBAを一切書いてなくても 本業の待ち時間にVBAのちょっとしたものを作らされたりするよね。
プログラマーじゃないけど出身が社内SEなんで、社内SEなら業務ツール作りで VBA使えることって便利だし重要かなと思ってアピールしたんだけどなあ・・・。 他には一応Java、Cはやってるし、鯖で必須のPerl、Python、VBSあたりも普通に 使えるんだけど、小さな会社の社内SEなんで、鯖管理で使う後者はともかく、 前者はアピールしない方が良いかと思ったんだよな。 そもそもプログラマー志望じゃないし、自社開発も無いって話だったんで、 なんか無言でシコシコ書いてるのが好きなんだろ?って思われなくなかった っていうか。
それを面接で言えばよかったんじゃないの?なんで言わなかったの?
>>148 いやあ、面接官がIT系のコンサル野郎だったでやんす。
「システム導入こそすべて」みたいな奴で、もうどうにもならんかった。
開発も泥臭いとこはやってなさそうな感じの。
まあ、そんな奴がのさばってるって時点でアレなんですが。
マ板でやれや
Excel2007です 現在MicrosoftWebBrowserを利用して 指定セル(住所が書いてある)の地点のGoogleMapが表示されるようにしてあります。 ここでもう少し高度な操作をしたいために(ピン操作やルート案内など) GoogleMapsAPIを使用したいのですが ExcelVBAでGooglemapsAPI(javascript?)をGoogleMapに投げ込んで 結果をMicrosoftWebBrowserに返すにはどうすればいいのでしょうか?
153 :
デフォルトの名無しさん :2010/04/27(火) 11:34:07
filecopyで、ネットワーク上の共有フォルダにファイルをコピーさせたいのですが、 共有フォルダにアクセスできない場合のエラー処理が出来ずに困っております。 dirでいけると思ったのですが、アクセスできない場合、dirでもエラーになってしまいます。 何かよい方法はないでしょうか。
On Error
On Error でも良いんですが接続先のサーバーやPCが落ちてるときなど タイムアウトで実際にエラー処理に移るまでに時間が掛かりすぎて困ります このエラーが出るまでのタイムアウトを短くするにはどうすればよいでしょう?
>>155 ファイル処理とかネットワーク処理は、ちゃんとやろうとすると意外と大変。
とくにVBAの関数だけではタイムアウトが制御できないから、
グローバル変数を使ったフラグとタイマーを使って時間内に終わったかどう自分で調べるような仕組みを
ちまちま作るしかない。
フラグセット→タイマーセット→On Errorで強制終了回避→ファイル処理→すぐに終わったらタイマー解除
タイマーで強制的に抜けたらフラグクリア
フラグがセットされたままだったら処理成功と判断する
みたいな手順を、よく考えて作る。
157 :
デフォルトの名無しさん :2010/04/28(水) 07:47:23
,―ヽ_(((((_、― ,/ ノ ヽ ~\ / ノ IPA ヽ ~\ / ノ ヽ、 `ヽ | ノ / ̄\ / ̄~ヽ ヽ i | ノ | ノ \ | <●> <●> ( ) \ | | | i / | / ヽ レ i (●_●) / i、 ,-――-、 ・ / i、 <(EEEEE)> ∵/ どういたしまして i、 \ ./ / \ ーー ,ノ ,,.....イ.ヽヽ、ー-―一ノ゙-、. : | '; \_____ ノ.| ヽ i | \/゙(__)\,| i |
158 :
デフォルトの名無しさん :2010/04/28(水) 16:43:11
ほんと糞言語だよな スタックないなんて 切り上げ切捨てのどっちかもないよね?
スタックっつうか配列以外のデータ構造がまともに扱えない 切り上げ切捨てはどっちも出来る
↑ 実装できないwww
糞言語だと思うなら、使わなければいいじゃん
↑ vbaは言語じゃねーよwww
連休らしくなってまいりました 構ってちゃんの季節ですね
ふぅ(´ω`)
VBに足りない機能は 全部COMという万能倉庫から持ってくればいい。
COM使うならExcel使う必要も無ければVBAを使う必要もない
意味がわからない。 そもそもVBAのグローバルコンテキスト自体がOfficeのCOM(IDispatch)だよな。 で、VB(A)以外でCOMを使うということだけど、 他言語で書いたらどれだけコーディングが面倒かご存知? まあ、WinOLE32とかいちいっちコーディングするのが面倒じゃなくて ブラウザも要らないなら、どうぞって感じなんだけど。 あと、Excelと密に連携取れないね。
え?
ExcelというアプリのUIを丸ごと再現するのは面倒だし意味ないし VBAだけではなかなかかゆいところに手が届かないし 事務員がExcelさわってる裏で事務作業の手伝いをさせるのがVBAの本来の使い方だから
まあ、ここでExcelVBAを否定しても意味ないし
たしかにRubyは面倒だな
みなさん、普段はどんな言語を使ってるんですか? ・・・と聞こうと思ったけれど、ここは事務員のが多いって話でしたね。 ということは、VBScriptとかhtmlとかJavascriptとかのエンドユーザ向け言語ですか?
またもや知ったかか
ここで一番多いのは警備会社勤務 2ちゃんの質問スレで困ってる人を見つけたら助けるふりして雑談始めるのが仕事
事務員だけどVBAできます・・・・というか、IT屋のPGとして開発経験があれば、 プロジェクト規模とかステップ数でPGとしての職歴をアピールできるのかもしれないけど、 そうでない場合はアピールしようが無いというか、何をもってできるとするのかよくわからん。
>>173 ネットが繋がらない環境でJava使ってる。
VBAは各種ファイルの生成とか、XMLやらブックの解析とか。
お話に花が咲いているところ すみません。教えてください。 office2000 XP SP3 です。 PCのCOMポートから、RS232Cで文字を受信して、Excelシートに表示しています。 while(1) if (受信文字=あり) then Cells(y, 1).Value = 受信文字 y = y + 1 endif wend という感じです。 いい感じに動作するのですが、シートの一番下の行まで行って、 次の行を書くときに、スクロールしたいのですが、 画面1行スクロールをするには、どのような記述をするのでしょうか。 宜しくお願いします。
Application.Calculation = xlCalculationManual で、関数の計算を止めた場合、 WorksheetFunction.Maxなどで関数をVBA内で使用(シートへの記載は無し)したら、 その計算結果を利用する判定時に誤作動したりするのですか? やはり直前でxlCalculationAutomaticに戻さなくてはいけないのですか?
お話に花が咲いているところ 嫌味言うなら質問するな
気の利いたこと言おうとして失敗する人っているよね。 その一言が余計、という。 「へえ。君って○○大学出てるんだ」 「いやあどうしょうもないバカ大学でお恥ずかしい(謙遜のつもり)」 「……俺の息子はその大学を第一志望にして入学したんだよ(怒)」
つ Ca
186 :
180 :2010/04/29(木) 22:37:54
どうもありがとうございます。大変助かりました。 VBAの命令は、何でもあるんですね。ビックリしました。おかげさまで、なんとか作れそうな感じです。 以下のような感じで、現在の画面の最下行数を計算して temp_str = ActiveWindow.VisibleRange.Cells(1, 1).Address ' 現在の画面の左上セルの座標「$A$123」を文字で得る n = InStr(1, temp_str, "$") ' 左の$を見つける n = InStr(n + 1, temp_str, "$") ' 右の$を見つける y = Val(Mid$(temp_str, n + 1, Len(temp_str) - n)) + Windows(1).VisibleRange.Rows.Count ' "123"を取り出し、画面の縦の数を加算 この行数と、次回の書込予定セルのy位置と比較してスクロールしながら、書き込んでいくつもりです。 ここで、もう少し教えてください。 上記の最下行の計算ですが、VisibleRange.Cells(1, 1).Address の返値が文字で返ってくるので、めんどうな文字計算をしています。 これが、直接数字で返ってくる命令はないものでしょうか。 temp_str = ActiveWindow.VisibleRange.Cells(1, 1).Address というのは、現在のアクティブウインドウに対しての命令だと思います。 しかし別シートを開いている時でも、文字書込は決まったシートに バックグラウンドで実行したいのです。 シート指定をすればいいと思って a = Worksheets("AAA").VisibleRange.Cells(1, 1).Address などと やってみましたが、エラーだと言われました。 どのように書いたら、バックグラウンドで実行できるのでしょうか。 よろしくおねがいします。
>>184 その会話で気の利いたことを言った(つもり)のはどっち?
>>186 a = Worksheets("AAA").Range(hoge).Cells(1, 1).Address
>>186 Visibleってのは「見えている」範囲のこと。ウィンドウを「切り替えたら見えるだろう」範囲ではない。
だから裏画面では意味がない。
190 :
180 :2010/04/30(金) 19:02:09
教えてくださいますでしょうか。 cells(1,1) と range("A1")という、2つの表現方法がありますが、 forで回すことを考えるとcells(1,1)のほうが都合が良いと思います。 しかし、range()も使いたいことが多いです。 そこで、この(1,1)という値を"A1"に変換するような関数はあるのでしょうか? 現在は、 dim array as string dim rng_str as string array = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" x = 1 y = 1 rng_str = mid$(arry, x, 1) & format(y) などとやっています。 何か1発でできる関数があると便利なのですが。
そうですね。できれば、aaa = Conv(1,1)みたいな感じの物がVBAに備わっていることを期待しているのですが、 やはりむずかしそうでしょうか。 あと、もう1つよろしいでしょうか。 セルを選択するのと反対に、解除するのにはどのように書けばよろしいでしょうか。 選択は、セルの周囲の線が太く見えて、解除は、セルの周囲の線が太くなくなるということです。 選択 cells(1,1).select 解除 cells(1,1).Deselect と書いたら、叱られてしまいました。
>>190 rng_str = Cells(Row, Col).Address(False, False)
とりあえずこうするといいよ。
>>187 >その会話で気の利いたことを言った(つもり)のはどっち?
二つ目の鍵カッコだよ。
この会話では、相手が不機嫌になった理由を教えてくれたから、
「ああ、俺余計なこと言ったな」と本人も気づくけど、
普通は腹の中で「この野郎」と思ってもわざわざそれを伝える人は少ない。
結果、本人はずっと「俺ってユニーク」などと思い込んだまま、
他人をイラつかせ続けることになる。
まあ、俺のことなんだが。
>>192 行列の変換は Chr(64 + y) & x
ただしZ列より右は表現できない
AA列以降もサポートしたいなら自分で関数を作ってモジュール化すればいい
セル選択の解除は不可能
196 :
デフォルトの名無しさん :2010/04/30(金) 22:01:57
>>192 一般機能で出来ないことはvbaでも出来ない。
シートの中で必ず1セルは選択されているものだから、vbaでもどこかのセルは選択しないとあかん
何でもいいけどいい加減
>>182 に答えてくれよ!
さもないと自分で調べるぞ!!
>>193 ありがとう。Row=1, Col=1 → A1 と出ました。ありがとう。
これで楽になりそうです。
>>195 ,
>>196 >セル選択の解除は不可能
>シートの中で必ず1セルは選択されているものだから、vbaでもどこかのセルは選択しないとあかん
そうなのですね。ありがとうございました。
確かに、自分でExcel使うときは、どこす1箇所選択されています。
助かりました。ありがとうございました。
199 :
デフォルトの名無しさん :2010/05/01(土) 15:32:28
>>197 調べろよw
あと手動計算にしなくても再計算すればよろし
マクロの記録でF9だ
ていうか再計算止めたからってWorksheetFunction の計算まで止まるわけないだろ。 むしろ発想自体新鮮w
/ ̄(S)~\ < > / / ∧ ∧\ \< 嫌なら見るな! 嫌なら見るな! > \ \( ゚Д,゚ ) / /< > \⌒ ⌒ / ノ Y´`Y´`Y´`Y´`Y´`Y´`Y´`Y´`Y´`Yヽ )_人_ ノ / / ∧_∧ ■□ ( )) ( ; )■□  ̄ ̄ヽ γ⌒ ⌒ヽ  ̄ ̄ノ ノ  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|
>>199-200 自分で調べるのが面倒だからこその質問スレだろうが!
情弱なめんな、ゆとりなめんな質問に答えてくれて本当にありがとうございました。
↑ 冷静な自己分析だと思うぞ
>>202 >自分で調べるのが面倒だからこその質問スレだろうが!
自分で調べてもどうしてもわからない時の質問スレだよ。
別に2chじゃなくとも、人に教えを請う時はそれが当たり前だと思うが。
↑ 2ちゃんの画一的なコメント 乙
てか教えてGooに行けばいいんだよな
-‐''''"´ ̄``ヽ、 ____ / _ ヽ //´ __,,>、 /  ̄ ̄ { /::/ / ̄:::::::::::::::\ l _ィニニア二二二ニヽ、j._ /::::l/::::::::::::::::::::::::::::::::l | 0Lj/-‐-レノ ノ_ヽ:::`ヽ l:::::::::::/l/lノノ/_イ:::::l レ:r、/ イ゚テ ピト`|::| l:::::::::/ rtテ、 .ィtq l::::::| l:lヘ '" ,j '"/ノ |::lヘ!j ´ ,j !;:::/ ヽヽ、 r‐-, /' レリー 、 ,...., lノ/ lヽ、  ̄ / `ヽ、lヽ 、  ̄ /´ _,r┴‐-`v´-‐j-、__ , -‐-、_r┴─'ー‐チト バルス!! / ̄/:.:.:.:| ̄ ̄`T ̄´|:.:.:.:l´ `ヽ / ヽ ̄`ー-‐'´`''''⌒ヽ / ,':.:.:.:.:.l l l:.:.:.l \ _r‐、-、-、r, 、 ', |:.:.:.:.:.:.! ! !:.:.l ,. -‐ゝ/// 〉 〉 〉 〉 〉 ! ', l:.:.:.:.:.:.l | l:.:.:l / 人〈〈〈〈 ' ' ' /っ l l l:.:.:.:.:.:.! ! l:.:.:.ト/ / ```´-ァ‐'''" / l 、__/:.:.:.:.:.:l | |:.:.:ヽヘ l // / _ ィノ /:.:.:.:.:.:.:! l |:.:.:.:.:l `ーヽ、_ノ´l、______/lニ二」 ____l:.:.:.:.:.:.:.| l |:.:.:.:.:! |_ ( ( ) )_〕| l l`ー‐‐'匸二l ̄ ̄l二フーイ /  ̄ `‐‐'´ ヽ |
208 :
デフォルトの名無しさん :2010/05/02(日) 15:58:59
> 意思決定までコンピューターが出来るようになると、 > 人間自体が必要なくなる。 今でもほとんど「意思決定」に人間なんか要らないだろ。 1. 提案者「こんなアイディアがあります」 2. 決定者「費用対効果を数字で示せ」 2. 提案者「費用が○○円、利益が△△円を見込んでいます」 3. ○○ < △△か? true → 4.へ false → 5.へ 4. 決定者「そのアイディアを採用する」 → 6.へ 5. 決定者「そのアイディアを却下する」 → 6.へ 6. 決定者「次のアイディアはなんだ?」 結局のところ、「意思決定」(笑)とやらをやる人間はこんなロジックで動いているんだから、 人間なんかおく必要ない。Excelどころか、20年前のPCでBASICで組んでもいいレベル。 「費用対効果を出せ」「数字で示せ」「説明責任を果たせ」、って言うと非常に説得力が あるように見えるけど、実は判断基準のなすりつけなんだよね。
>>208 んじゃそのプロセスをマクロで表現しなよ
210 :
デフォルトの名無しさん :2010/05/02(日) 21:18:22
質問させてください。 A列にx軸の値、B〜H列に7系列分のy軸の値が書いてある表で、 A,B列の値を選択してグラフを書かせるとA列をx軸、B列をy軸(系列1)としてくれるのですが、 A〜H列の値を選択してグラフを書かせるとx軸はblankで、A〜H列全てがy軸(系列1〜8)になってしまいます。 A列をx軸にして7系列分のグラフを書くにはどのように工夫したらよいでしょうか。
あなたは知らないのですか?
>>210 グラフの種類を散布図にして
元データの設定ウィンドウでY軸からA列を消して、X軸にA列を追加
エクセルのサイズが500MBに届きそうなんだがこんなもんか?
214 :
デフォルトの名無しさん :2010/05/04(火) 22:22:06
こんなもんかと聞かれても困るな w まぁ常識的に考えて肥大しすぎだとは思うが w
>>215 それやると、セルの幅はコピーされない(初期状態のまま?って言うの)んと違うかったっけ?
217 :
デフォルトの名無しさん :2010/05/04(火) 23:50:05
>>216 ? 普通に書式も一緒にコピーできるけど?
ページ設定がコピーされないんでそのまま印刷するとおかしくなるだけ
219 :
デフォルトの名無しさん :2010/05/05(水) 12:47:49
>>210 Excelは、変なお節介があり、ユーザーは動作の予想ができないので、
覚えにくいし、使いにくいですよね。
さて、具体的な方法は自分で考えてもらうとして、イメージを説明します。
グラフを作るとき、多くの場合は、希望するデータ範囲を囲って、
グラフボタンで進んで行って「グラフできたぁ」となるワケですが、
これは、EXcelのお節介な自動機能でグラフを作っているだけなので、
覚え始めのころは「このやり方が全てだ」と思い込んでしまいます。
僕もそうでした。しかし、この方法では、いつかは行き詰まります。
本来あるべき論としては、「この列のデータを、あの列のデータに対してグラフ化したい」だと思います。
このやり方が、本当のグラフ作成なのですが、
Excelのお節介で、私たちは、それが想像しにくいようになっています。
範囲を選択して、グラフボタンで、グラフウィザードを進んで行きますが、
そのウィザードの途中に、次のような画面が出てきます。
http://mcnc.hp.infoseek.co.jp/cgi-bin/img-box/img20100505123431.png この画面では、すでにEXcelが勝手に選んだ「系列1,系列2」というY軸の値が選ばれています。
まずこれを削除します。そして、その右側の「Xの値」「Yの値」の所の文字も消して、
その枠の右側の三角?っぽいボタンを押します。
すると、ウィザードを開いているのに、なぜかシートに触れてしまいますので
自分の好きなY軸の範囲を選択します。同様にして、Xの値も範囲を指定します。
これで、EXcelのお節介なく、自分の好きな軸に、自分の好きな範囲を指定してグラフが作れます。
この方法は、既に出来上がっているグラフに対しても可能でなので、
自分で調べて見てください。
僕の思うグラフの作成は、「これをXに、これをYに」という指定をするのが正しい方法、
というかユーザーがイメージできる作成方法だと思っています。
Excelやワードのお節介が減ることを期待したいです。
VBAの話をしろボケ
>>219 なかなか面白い話しやけど、確かにスレ違い。
配列に数が入っている状態で, 平均値などを計算したい場合, 一度,シートに書き出してエクセルのaverage関数を使うしかないのでしょうか?
いいえ
224 :
222 :2010/05/08(土) 17:55:03
>>223 すいません
自分で関数を定義したくはないのですが
そのようなサブルーチンがvbaにも実装されているのでしょうか?
WorksheetFunction.Averageって配列を受け付けられなかったっけ?
配列できるね。
セルにAddCommentで複数行のコメントを入れようとしてます。 vbNewLineで改行していれようとすると5行までしか入りません。 無限にいれれるようにするにはどうしたらいいでしょうか?
228 :
222 :2010/05/08(土) 19:13:18
例えば, 配列 a[100] を定義したとして,a[10]からa[i]までの平均値をだしたいのですが excelの関数で大丈夫ですか・
230 :
222 :2010/05/08(土) 19:49:42
>>229 可変長の部分をa_temp というdouble型の配列を作成,そこに格納し
ave = WorksheetFunction.Average(a_temp)
としても 0 しか返ってきません.
何か間違っていますでしょうか?
平均ぐらい自分で出せよカス
232 :
222 :2010/05/08(土) 20:13:58
>>231 枯れたサブルーチンがあるなら自分で書くよりミスは圧倒的に減るはずですよね.
なんとかなりませんか
この程度でミスしてる時点で他のあらゆるコードが信用出来ない。おまえさんはもう諦めろ
234 :
222 :2010/05/08(土) 20:19:47
>>233 vbaは何分初めてなもんで
よろしくお願いいたします
何事もほどほどにな
>>234 とりあえず、作ったプログラムを丸ごと貼り付けて
238 :
222 :2010/05/09(日) 09:59:16
お騒がせしました. 求めた平均値を入れる変数の型をlong型にしていたため, 常に0となっておりました. double型に変えると無事動作しました ありがとうございました
あるブックでマクロ実行中、他のブックを操作する方法ないですか?
>>239 もう少し詳しく書かなきゃわからんよ
他のブックを操作するとは例えばどんな事?
また、あるブックでマクロ実行中て書いてるけど
どんな処理をしている時を想定しているの
>>240 イメージとしてはExcelの二重起動でしょうか
マクロの実行中ってほかのエクセルの編集作業が全くできないと思うんですが、それをできるようにしたいです。
そのまんま、Excelを2重起動すればいい。
>>239 取りあえずDoEventsでも入れてみれば
自己解決
phpのmysql_connect()関数が使えません。 環境は、 windows7 Apache2.2 PHP5.1 mysql server 5.1 です。 普通のphpファイルは開けるのですが、 mysql_connect()を使うとブラウザでページを表示できなくなります。 なぜでしょうか?
すいません。誤爆しました
図がないシートなのに、保存しようとすると 「図が大きすぎます」エラーが出るのは どんな理由が考えられますか? VBAがたくさん使ってあるシートです。 でも、図の類は何もありません。
249 :
デフォルトの名無しさん :2010/05/12(水) 04:09:28
スタックが小さくて、まともな業務ソフトつくれないよ。 マイクロソフトは、あいかわらず、いつまでもユーザー泣かせのことやってる。
250 :
デフォルトの名無しさん :2010/05/12(水) 04:12:14
これだけメモリー搭載が増えてる時代なのになんでスタックを大きくしないのか 不思議でしようがないいよ。 故意にユーザーを苦労させ、エラー出るように設計してるとしか思えない。
251 :
デフォルトの名無しさん :2010/05/12(水) 04:14:37
なんか、日本語版だけ故意にスタック小さくしてるような感じする。
スタックが増えても、落ちるまでの時間が多少伸びるだけじゃねえのw
VCのスタックサイズのデフォルトは1MBなんだが、VBAではどのくらいなんだ?
条件式について質問です。 処理対象データ ↓ A B C D 1 あ い う 1 あ い う 2 あ い う 3 あ い う 3 あ い う 4 あ い う 4 あ い う 4 あ い う というデータがあるとします。 A列の値が同じである間、同じSheetにデータを出力できるようにし A列の値が異なる場合になったならば、別シートに出力変換したいんだけども 何かアドバイスを貰えませんか。
>>254 Aを上から見ていって、
前の値と比較すればいいでしょ。
Set procRange = [A1]
Set outputSheet =
While procRange <> ""
If procRange.Offset(-1) <> procRange Then
Set procRange = procRange.Offset(1)
Wend
途中で投稿されちゃった 動かせる環境ないから適当に直せ Dim procRange As Range Dim outputSheet As Worksheet Set procRange = [A1] While procRange <> "" If procRange.Row = 1 Then Set outputSheet = Worksheets.Add ElseIf procRange.Offset(-1) <> procRange Then Set outputSheet = Worksheets.Add End If ' なんか適当な処理 Set procRange = procRange.Offset(1) Wend
>>256 返答ありがとうございます。
高度な文面なので検索してちょっと理解深めます。
Offset〜〜に解決の糸口を見つけられそうなので
イジイジしてきます。ありがとおおおおおおおお
教えてください。 質問の概要 ワークシートの変更を禁止したいです。 説明 ・シート内にあるボタンを押すと計算が始まります。 ・その計算は、そのシート内のセル内容を読込んで計算するので、シートを変更されると、困ります。 ・そこで、計算している間は、シート変更を禁止させたいです。 計算中にシートタブがクリックされたら、このような動きにしたいです。 メッセージボックスを表示して「今はダメよ」と表示する もしメッセージボックスを表示することで、計算が狂ってしまうなどの問題があるのなら、 最低でも、シート変更を無視、無反応にし、計算を安全にしたいです。 どのようにすれば良いでしょうか? 宜しくお願いします。
Application.ScreenUpdateing = Falseじゃだめなの?
>>259 ありがとうございました。Application.ScreenUpdating = Falseにより、期待通りの動きが出来ました。
すばらしいです。
ただ、不思議なことがあります。教えていただけませんでしょうか。
以下のように、計算前にボタンの色を変えて、
計算後にボタンの色を戻すようにしているのですが、その色の変化が、うまく動きません。
従来、ScreenUpdatingを入れない時は、ボタン色が正しく変化します。
Button1.BackColor = QBColor(赤) ' 色を変える
Call KEISAN
Button1.BackColor = QBColor(白) ' 色を戻す
次のように、ScreenUpdatingを入れると、
Button1.BackColor = QBColor(赤)
Application.ScreenUpdating = False
Call KEISAN
Application.ScreenUpdating = true
Button1.BackColor = QBColor(白)
白のまま計算を開始して、計算が終わると白→赤→白と、まとめて変化します。
ScreenUpdatingを、' にすると、正しく色が変化します。(再現性があります)
どうしてこんなことが起こるのでしょうか?
宜しくお願い致します。
>>260 ボタンの背景色の変更と、その色で画面が更新されるタイミングには実際にはブランクがある為。
VBAマクロ実行中も一定の間隔で画面の更新処理は走るが、
ScreenUpdatingがFalseの時はその処理が妨げられる。
ScreenUpdatingをTrueに戻すと、とりあえず画面全体を更新しなおすので、
後述の処理だとまとめて変化したように見える。
できました
Button1.BackColor = QBColor(赤) Call DoEvent Application.ScreenUpdating = False Call KEISAN Application.ScreenUpdating = true Button1.BackColor = QBColor(白) だったかな
全然違った スマソ orz Button1.BackColor = QBColor(赤) DoEvents Application.ScreenUpdating = False Call KEISAN Application.ScreenUpdating = true Button1.BackColor = QBColor(白)
自作関数をセル上に入力すると、ポップアップで引数の説明文を表示させるようにするにはどうしたらいいのでしょうか。 例えばセル上に "=IF(" まで入力すると IF(論理式,[真の場合],[偽の場合]) と、表示されますが、 このポップアップ表示されるやつを自作関数でも表示させたいのです。 ご教示よろしくお願いします
自己解決
>>264 ありがとうございました。なんとか出来ました。
僕のExcel (office2000)だけなのかわかりませんが、教えてもらった方法だと、症状が改善しませんでした。
Button1.BackColor = QBColor(赤)
DoEvents
Application.ScreenUpdating = False
Call KEISAN
Application.ScreenUpdating = true
Button1.BackColor = QBColor(白) 動作結果 ボタンon→KEISAN→赤→白のままなんです。
Button1.BackColor = QBColor(赤)
Call KEISAN
Button1.BackColor = QBColor(白)
Sub KEISAN(){
DoEvents
Application.ScreenUpdating = False
:
:
Application.ScreenUpdating = true
End Sub
のようにKEISANの中に置くと 動作は、 ボタンon→赤→KEISAN→白となります。
でも、解決できて良かったです。どうもありがとう。感謝します。
// ------------------------------------------------------------- //
別件ですが、VBAのエディタについて教えてください。
行頭でTABキーを打つと、カーソルは4文字毎に飛んでいきます。しかし、BackSpaceキーを1回押しても、1文字分しか戻りません。
というか、TABが4スペースになってるみたいです。これを、TABのままにして、BSキー押したときに、1TAB分戻るようには出来ないでしょうか?
ところが、何かの都合?でBSキーで1TAB分戻ることもあります。もう、わけがわかりません。半分怒っています。
これは、どのような時に起こるのでしょうか?
通常のエディタのように動かないので、使いにくくて困っています。すみません。ご存じでしたら、どなたか教えてください。
つメモ帳
>>267 一般的には、TABで送ったものはSHIFT+TABで戻すんじゃね?
>>269 ありがとうございます。Shift+TABを、Excelでやってみました。
VBAエディタでは、確かに出来ました。左に1TABずつ戻ります。初めて知りました。
ところが、秀丸では、Shift+TABは、エラー。
メモ帳では、Shift無視で右にTABしていきました。
text editorは、space4個はspace4個、tabはtab、として置いて欲しいと思っています。
space4個打ったところでは、BS1回で、1spaceが消えればいいし、
tabを打った所では、BS1回でtab1個が消えればいい、というかそのほうが自然だと思うのです。
僕の価値観だけでしょうか。
でも、
>>269 に Shift+TABを教えてもらったので、今度からはストレスがぐっと減りそうです。
どうもありがとうございました。
271 :
265 :2010/05/13(木) 18:11:23
>>266 は私のレスではありません。
引き続きお願いします。
272 :
265 :2010/05/13(木) 19:04:04
>>271 は私のレスではありません。
引き続きお願いします。
>>270 Visual StudioやEclipseといった開発環境は大抵Shift+Tabで戻るよ
秀丸の場合、1文字以上選択状態にしてShift+Tabで戻る(サクラエディタも同様)
Tabキーでスペース2個とか4個とかが入力されるようにするのは
スペース派(ソースコード中にタブ文字を一切使わない)には普通のこと。
タブ文字は見る方の環境によって幅が変わってしまうので、それを嫌っている。
ただVBAは専用エディタでしか見ないだろうし、
そもそも設定変更できないのがひどいのは事実
あのエディタでリドゥのつもりでCtrl+Yを押すと悲惨な目に遭う
いやならバインディングかえればいいのに 馬鹿なの?死ねの?
死ねの?
死ぬの?─┬――死ぬよ(死ぬ派) . │ . └――死なないよ(死なない派)
時刻の条件式について質問です。 00:15 00:30 00:45 〜〜略〜〜 03:00 みたいな時間がず〜〜〜〜と続くと想定して これを開始の00:15から03:00までの間ループさせたいんだけど 時間と分を別々に分けて15分ずつ足して行く方法しかないですかね?
>>278 そうじゃないの
つまり0時1時2時3時のステップと15分30分45分00分のステップを入れ子でループするんでしょ
>>278 ですけども
分けて計算すると変数多くなってしまうと思っての質問だったのですが
分けて計算するとしたら、どういう感じのループ条件式になりますでしょうか。
重ね重ねすいません。
>>279 おおお!!納得です。
ちょっと考えてきます、ありがとございました!
エンバグの元なのに
配列のデータで一意のデータを出力させたいのですが、 以下の配列データが複数あるとします。 A(0) = 1 A(0) = 2 A(0) = 3 A(0) = 4 A(0) = 3 A(0) = 3 A(0) = 10 A(0) = 2 出力結果は A(0) = 1 A(0) = 2 A(0) = 3 A(0) = 4 A(0) = 10 こんな感じにしたいのですが、どんな感じにすればいいでしょうか
>>283 配列の全要素は0ではないです、すいません。
A(1) = 1
A(2) = 2
A(3) = 3
A(4) = 4
A(5) = 3
>>283 配列をソートして前と違うものを取り出せばよい。
あるいは最小値と最大値が極端に離れてなければBoolean型の配列を
Redim FLG(最小値 To 最大値) As Boolean
のように用意して、ループを回しながらフラッグをたて、フラッグが
立っているものを取り出してもよい。
数値にDictionaryを使うやつはアホ。
すまん、上はフラッグが立ってないときだけ取り出すの間違いね。
Dictionaryを使えばいい
>>285 配列のソートって出来るのですね。
フラッグはちょっと難しそうでしたので配列ソートの方を参考にさせて頂きます。
調べてる時Dictionaryというのも頻繁に出てきたのでこれも調べてみます。
レスありがとございました!
馬鹿の一つ覚えのDictionaryがやっぱり出てきたかw
Dictionaryの何がいけないか2行で説明してくれ
え?Dictionaryダメなの?
Dictionaryダメっていうやつはカルト宗教にはまりやすいタイプ
ダメって書くなら根拠書いて欲しい。 言いっぱなしは迷惑。
うるせーDictionaryっていっぱい連レスするんじゃねーよ
>>290 二行も必要ないなw
アホだからだよ。
無理やり二行で書くと
何で単純な整数にハッシュが必要なんだってことだな。
ハッシュなんて文字列に使うものだぞ。
そもそもDictionaryがどういう実装しているか知らないが、 (少なくともCollectionよりは効率がいいはずだが) 整数値は整数値をそのままハッシュ値にすればいいでしょ。 ていうか、そんなんでDictionary否定してたの?
ダミだこりゃ。 お手上げだね。
なるばくDictionaryを多く使ったほうがいいよ
何にでもDictionaryの人って大和の吊るし柿みたいに味のあるコードを書く人多いよね。
正直Dictionary回避してまで手に入れたいものって何?
インタプリタでソートしたりなんかしたりして遅くなるより ネイティブなDictionaryでやったほうがいいね
ほんとアホばっかだなw
>>299 そういう皮肉は今の人には通じないって。
場合によって使い分けるのが一番
VBA関係ないし
Rangeオブジェクトについてなんですけども、 複数モジュールがある中で共有して扱わないとエラー出てしまったので subとかが書かれてるよりも一番上(グローバル宣言?)にしたらエラーが出ませんでした。 これって外道ですかね?
何の話ざんしょ。もっとわかりやすくしてね。
Rangeオブジェクトの変数についてですけども、Moduleが1〜3あったとします。 Module1 Module2 dim aaRange as Range call ユーザ定義関数(aaRange) Module3 ユーザ定義関数(aaRange)記載 上記のようにModule2でRangeオブジェクトを宣言し、ユーザ定義の引数で貰ってるとします。 頻繁にユーザ定義関数を実行するのですが、aaRangeの値を常に保持していたくてグローバル宣言(呼び方あってるのかな) してしまったと言う訳ですが!!! 糞設計でしょうか!!
うんkです
デナオシテキマス
16進数苦手。 イミディエイトウィンドウで ?hex(50000) だと C350 と出ます。 でも ?&hC350 だと -15536 と出ます。 何で?? 50000に戻したいのに・・・。 因みに ?-15536=50000 False ?hex(-15536)=hex(50000) True と出ます・・・。
>>310 50000はIntegerの範囲に収まってないのにIntegerに変換しようとしてそうなる
?&hc350& でLongに変換すればちゃんと50000になる
最後の&はLongを表す文字な
エクセルVBA開発のコーディングルール作ってるんだけど、意見聞かせて欲しい ちなみに、会社で後任に引き継ぐのを想定してるだけなんで、ガチガチにする必要なし みなさん設計する時どんなことに気をつけてます?
元々緩やかな下降線にはあったけど、人が減った事によって それまでは人混みに隠れていた工作員の存在が目立つようになったのが致命傷だったな 工作員の誘導を嫌って参加者が減り、他所からの工作員を排除しようとして規制をするから 参加機会が奪われて更に参加者が減るという負のスパイラルにおちいってる
>>312 関数の引数は基本的にByValにするとかかな。
速度的にはByRefが望ましいんだけど。(特に文字列)
Option Explicit強制とか、
空文字の代わりにvbNull使うとか、
$バージョン関数があるなら$バージョン関数使うとか、
改行文字の種類も揃えたほうがいいかも。
変数名のつけ方をシステムハンガリアンにするなら
統一したほうがいいね。
Option Explicit以外、何一つ共感できない
なるほど 空白よりvbNullで統一したほうがいいな そういやOption Explibt忘れてたわ……入れとこう 命名規則はアプリケーションハンガリアンにする予定 触る人のレベルなんかわからないし、プロジェクトごとの理解をまず深めて貰わないといけない 頭文字のみ大文字、単語ごとにアンダースコア、2バイト禁止 変数・プロジェクト名が長くなるから、頭文字大文字が必須になる 自分で慣れてないから書き換える手間が半端ないっていう
・VBA禁止
319 :
314 :2010/05/17(月) 13:35:57
>>315-316 共感するしないじゃなくて、具体的な案とか意見書いてくれ。
問題点があるならそれもよろしく。
なぜそこまでしないといけないんだ
共感できないというなら理由ぐらい示せってだけだよ。
めんどくさい
役に立たないなあ…
別に役に立ちたくないし
共感とか意見とか議論とか以前にルールに作るのになんかない? って質問に答えてるのが
>>314 だけじゃねえか
人のレスにいちゃもんつけるくらいしか出来ねえのか三流プログラマども
俺も
>>315 には共感するけどそれはそれとして
関数の前には必ず説明のコメントを書く。書式も統一して、検索しやすいようにする 何より 手段と目的が逆転しないように気をつける
変数名は大文字で始める?小文字で始める? システムハンガリアンとかいうのは小文字だよね?
Dim hoge$ と書くか Dim hoge As Stringと書くか
普通は小文字で
大文字にしておくと、小文字で打ったときに自動訂正してくれる だから大文字含めた変数名にしておくと、タイプミスが少なくなる
小文字の変数名にすると、ある型の名前を変数名にしてしまったときに 型が勝手に小文字になって困ってしまう 例えば、rangeとかdateとかを変数名にすると、全体的に型のRangeが 勝手にrangeに変わってしまう なんとかならないんだろうか
VBAはシンボルを大文字小文字で区別しないんだから気にしなけりゃいいんじゃね あとはかぶらない名前にするか
>>332 Option Explicitとか宣言の強制使え
>>333 システムで宣言済みの名前を使うな
予約後を変数で使おうとする気持ちがよくわからない。
特定の型の名前を予約語とは言わない。
特定の型の名前を(ry
Javaの場合なんだが、Eclipseとかの代表的なIDEは、変数の名前補完のデフォルトが クラスの小文字名だよ
その人の行動は「プライバシー問題に関して無頓着」で一貫しているように 見えるので理解してもらうのは難しいと思う。新しい概念を習得してもらうには 少々歳を取りすぎている。掲示板にもらった手紙の全文を掲載した時点で 気が付くべきだったのかも。 「プライバシー問題に関して無頓着」な人は親しくない相手にも平気で年齢や 職業を尋ねる傾向があるようなので注意したほうがいいです。
>>335 デバッグするまでスペルミスのリスク抱えてろってのか?
タイプミスじゃなくて思い違いだったりすると、毎回変数名間違うことになる
一ヵ所ならまだしもデバッグ時に複数箇所とか煩わしすぎ
頻度の少ないコードとか気付かなかったり、確実にデバッグ出来るってわけでもないし……
日本語最強。 Dim 氏名 As String
2バイト表記はエラー起こす処理がMS公式であったはず なんだか忘れたが、2バイト名関数を呼び出した時いらない参照呼び出して不具合引き起こしてたような 対応する気ない見たいだから、でっかいシステム組むのにはエラーでる覚悟はしとくべき
344 :
315 :2010/05/18(火) 16:38:12
・関数の引数をByValにするのかByRefにするのかは、関数の仕様による。どちらかに決めうち するような性質のものではない。 ・空文字列とvbNullは同じものではない。VarType()してみればわかる。 ・いちいち$バージョンの関数があるかどうか調べるのはめんどくさいので使わない。 そもそもmid()とmid$()とかは別物なのか?とかいうのも調べるのがめんどい。 ・改行文字の種類も揃えたほうがいいかも <= 意味不明。vbCrLfを使いましょうってことだとしても、 別にそろえる必要性を感じない。 ・システムハンガリアンは使わない。
345 :
315 :2010/05/18(火) 16:40:05
ちなみに、俺が昔作ったVBA用コーディング規約で、 「変数の定義はできるだけ遅くやる(使用する行/ブロックの直前でやる」 と決めたら、誰一人共感してくれなくて、驚くほどの反発があったことを思い出したよw
コーディング規約というかコーディングガイド的なものとして、こんなの提示したことあった。 ・アーリーバインドをなるべく使う ・イベントプロシージャの中に処理を直接書かない ・変数は一行一個で宣言しろ ・Publicな関数はPascalCaseで ・Const使え こんな感じだったか。
あ、そうそう、俺はシステムハンガリアンも使って良い派で、使うならfrmとかを決めてた気がする。
文字列をByValで渡した時って、先頭のポインタが値渡しされるの? それとも、文字列全体がまるまるコピーされるの?
参照渡し プロシジャに値を渡す時、値そのものではなく、値が格納されている 変数のアドレスを渡す 呼び出し先のプロシジャで引数として宣言している変数の値を変更する と、その引数に指定している呼び出し元の変数の値も変更される 値渡し プロシジャに値を渡す時、値そのものをコピーして渡す。 呼び出し先のプロシジャは、渡された値のコピーを受け取るだけなので 呼び出し先のプロシジャで引数として宣言している変数の値を変更して も、呼び出し元の変数は一切影響を受けない。 だったかと
>>349 で、ポインタの値渡しなの?中身の値渡しなの?
>>350 コピーされる。
ちなみにVBの文字列の型はBSTR。
先頭に文字列長、末尾にヌル文字のUTF16文字列だったかな。
手元の本によると プロシージャの引数の文字列がコピーされるのは以下のタイミング。 ・ByRefだと文字列定数を渡した時 ・ByValだと常時 もちろんポインタのコピーじゃなくて文字列をフルコピー。 VBの文字列はImmutableじゃない。
>>351-352 ありがとうございます。
VBAについてそこまで深く書いてある本もあるんですね
>>344 ・引数にByRef|ByValを指定しなければByRefになる。
アホが引数を書き換えるとわかりづらいバグに発展する。
普通の関数であれば値渡しでいいはず。参照渡しを積極的に使う場面は少ない。
・ごめん。vbNullじゃなくてvbNullString。
・$・非$関数は別物。$じゃなければVariantが帰ってきている。
普通はVariantには用がないはず。作者も$の方使えって言ってる。
・それならばvbCrLfとvbNewLineどちらを使うのか。
・システムハンガリアンはどうでもいいや。
作者って誰だよ VBの作者か?
厳密にいうとVBにIntelliSenceつけたチームの中の人だな。
VBEの自動構文チェックって邪魔にしか思えないんだが、あれが便利で使ってるって人いる? なんであんなものがあるのか不思議でしょうがない
どっかのペインにちょこっとアクティブに表示してくれるだけなら 便利な機能だけどダイアログで出るのが最高にウザいよなw
>>354 普通の関数であれば参照渡しでいいはず。
値渡しが必要な場合にのみByValを使え。
midとmid$のパフォーマンス気にする奴が、常にByVal使えとか笑えるわ
まあそれもそうだね。 ただ、両バージョン混在してるなら$にしろって言うけどね。 参照渡しは本当に理解してないのが多い(特にCとかJavaとかの人)
俺はかっこ悪いから$とかつけない ByValもつけない
変数宣言とか関数宣言だと使うよ。 いちいちAsなんて書いてられない。
兎に角、統一してあればそれでいいや
Typename(Mid("a",1,1))ってやるとStringって言われるんだけど、 実際はVariantだってのはどこ見ればわかるのか知りたい。
第一引数を数値にしてみたけどやっぱり戻り値はStringだなあ ?Typename(Mid(123,1)) String
そもそもTypeNameってVariant自体は表示しないでしょ
midとmid$の差なんて、100万回実行して0.1〜0.2秒位の差しかないよ。 その程度の差が利いてくるほどの計算量が必要な処理なら、そもそもVBAで やるのがどうかという話もある。 まぁ一般プログラマは気にしなくて良いレベル。
Mid$()って、MS BASICあたり位からの互換性のためが主な目的な気がする。 そんな細かいことより、文字列の連結方法を教えといた方がいいよね。
連結方法ってカッコ付ける奴かな。
>>368 何書いてあんの?
何を読ませたいの?
英語の勉強からするのも面倒だし
ネットに書いてあるとか言うの教えてよ
別にvbCrLfとvbNewLineが混在してても気にならない。 けど、普通はどっちか一つしか使わんだろ。気分でvbCrLf/vbNewLineをごちゃまぜに使うような奴なら、プログラマ としての素質を疑うよな。 プロジェクト全体として(というほどの大きなプロジェクトがVBAで構築されることがあるのかどうかは知らないが)、 統一されてなくてもかまわんよ。 例えば、CでいちいちNULを'\0'と書けとか言われたら切れるな。0で済むところは0で書くし。 0と'\0'が混在してても気にならないし、0とNULLが混在してても気にならない。
上で出てた参照渡しについて 引数として用意した変数に格納してから渡したほうがいい? call 処理(変数) ↓ 引数 = 変数 Call 処理(引数) 変数 = 引数
>>375 こんなレベルの奴がいるなら、基本ByValで渡せというのもうなずけるな。
なに一人で戦ってるんだ? 手を貸してやろうか?
いつもながら、誰がどの発言なのか良くわからずぐだぐだ
constさえあれば良かった。
じゃあ俺も314で
>>375 エスパーすると
Q:
hoge1,hoge2,・・・hogeN
それぞれ何度も演算したり入れ換えたりした後に関数を呼び出し
関数の中でも同じ変数名でスパゲッティ大盛り
引数のhogeA,hogeBを間違えて渡した時の修正コストが半端ない
だから呼び出し前にそれぞれ変数に値を入れておけば、その部分だけ修正すればいい
よって
>>375 ですか?
A1: つ 参照
A2: つ 規約
A3: そんな時は大抵他の場所でも入れ違いがあるんじゃね
VBAコーディング規約は、こんな項目を含めるといいかも。 ・Option Explicit必須 ・デフォルトコントロール名(Text1など)の使用禁止 ・伝統的なループ変数(i, j, k, ...)以外の一文字の変数名禁止 ・ByVal/ByRefの省略禁止 ・変数宣言/定義時は、Variantであっても必ず型名を付ける ・一行の「If ... Then」禁止 ・Goto/Gosub禁止 ・IIf禁止 ・Call禁止(書くな) ・While ... Wend禁止(代わりにDo ... Loopを使え) ・$付き関数がある場合はそれを使え ・「=""」「<>""」の代わりにLenBを使え
>>383 >Goto/Gosub禁止
On Error は除いてくれ
Call禁止 反対 サブプロシジャ呼び出しであることを明確にしたい
>「=""」「<>""」の代わりにLenBを使え 俺普段=””使ってるわ。。。
Integerを使わずLongを使え、というのを足しても良いかもな。
足してもいい。Integerが32bitだと思ってる厨房が多い。
VBAでオセロでも作ってみようと思うんだけど、まったく分かりません 要点としては @ゲーム開始ボタンを押した後、盤目をクリックしたら駒を描写する所 A一度置いたところにもう置けない判定 B駒を挟んでひっくり返す判定 どうかご教授ください
>>388 1. Cells(2, 2).Value = "●"
2. If Len(Cells(2, 2).Value) > 0 Then Debug.Print "おけない" End If
3. Cells(2, 2).Value = "○"
つか、VBAじゃなくて他の言語でオセロ書けるのかよ?
セルの数字を文字列に変換するマクロを考えていますが、この場合は元の数字に「’」をつける 形で良いのでしょうか?それともCstr を使用した方が適当なのでしょうか?
>>385 > >「=""」「<>""」の代わりにLenBを使え
>
> 俺普段=””使ってるわ。。。
おいらも。こっちのがタイプ量少ないし。
LenBだといいことあるの?
>>391 Len 6命令 <=> LenB 5命令
ちょっとだけお得。
これよりもうちょっとコストが付くのが空文字列の比較。
速度で言えば、LenBが最速。
>>390 Cells(2, 2).Value = Cells(2, 2).Value + ""
>>394 Cells(2, 2).Text & ""
396 :
391 :2010/05/21(金) 00:02:51
>>393 なるほど。性能か。シビアな場合もあるのかもね。
文字列連結も+使うんじゃなくて領域確保した上でMid()使えとか。
おいらはとりあえず性能関係シビアな用途に使っていないし「= ""」 で良いや。
>>396 普段使うVBAなんて最速で書けた方が偉いからね。
差が出るほど大規模なプログラムをVBAなんかで書くのか…
If文書いてて条件の否定を付けるために カーソル移動するのがめんどいから Xor Trueなんて行末に書き足すのは俺だけでいい
>>398 プログラムの規模じゃなくてデータの規模が問題なんだよ。
>>383 DoUntill...Loopもだめ?
>>398 ループ内で、普通に文字列連結とかしてたら死ぬときがあるよ
文字連結で何故死ぬの?
406 :
デフォルトの名無しさん :2010/05/22(土) 16:35:49
すいません、しょうもないことと承知で質問します。 xlnoneとは何をするのでしょうか?
何もしない ただの書式設定のプロパティ値 罫線描画を線無しにする時とかにプロパティをこれに設定する
Listviewのリストは、縦には出せないのでしょうか?
わかりづらかったですね。 Listviewは、縦スクロールにならないのでしょうか?
変数の規約について 例えば出勤日リストの行を定義する変数名 Shukkin_row_count_ ってするより、 S_r_c_ ' Shukkin_row_count_ としたほうが、タイプミスや誤読が減って設計コスト下がるよね むしろアンダーラインなくして頭文字を大文字で対応すべきかなあ コードが長くなると変数の意味が散逸しかねないけど……
そんな意味ならコメントは日本語でよくね?
>>410 ワケ判らん変数名は付けるな
下手に短い名前なら意味が判る長い変数名の方がよぉ〜っぽど良いわ、ヴォケ
問題は長い短いじゃなくて俺の命名センスにあるのかな
300行くらいの短いコード書いてみたが、変数名省略しなくても慣れたらすらすら書けた
コメント部分が200行くらいになったが
>>411 うん、コード書く時は日本語コメントは当然付ける
それに追加で、省略前の変数名明示ってことで
他の項目にS_r_o_とかあったら死ねるな。 COBOLに侵され気味な俺だと、 SHUKKINrowCountかSHUKKIN_rowCountって感じかなあ。 ベタローマ字は全て大文字というのが俺的基本法則。
俺ならVBAとC#では気にせず変数名や関数名に日本語使う それで可読性や開発効率が上がるなら別にいいじゃんてスタンス
>>413 その省略前の変数名という考え方がわからん
s_r_c_'出金の行数
とかでいいと思ってしまう
S_r_c_と言う記号で見るのと Shukkinn_row_count_と言う意味で見るのを比べれば、 保守する時の可読性、認識レベルが異なる だから逆に、接続を長くして意味を持たせるか、後で読み返した時の読みやすさを高めるために省略するかで迷ってる 日本語変数を使うってのが両方満たして楽なんだが……予期しないエラー引き起こすリスクもある
母音省略でいいよ。 sknRowCnt
あれ、回答レスになってないな? 省略前って言うのは、今Shukkinn_row_count_って変数があるけど、これをS_r_c_に省略した場合 ってことで使ったんだが、↑のように保守作業時に変数の意味を理解させるって側面もある
ソースは他人が見てわかるように書くべし そして「明日の自分は他人」 結論。好きにしろ
421 :
sage :2010/05/23(日) 23:37:36
すみませんが、どなたか教えていただきたいことがあるのです。 エクセル2003でADOを用いてアクセス2003のデータを抽出したいのですが、 抽出条件で「・・・を含む」としたいのですが、上手くいきません。具体的には .Source = "SELECT * FROM テーブル1" & _ " WHERE 日時>=" & 開始日 & " AND 日時<=" & 終了日 & _ IIf(Range("B10") <> "", " AND 依頼者='" & Range("B10").Value & "'", "") & _ IIf(Range("B12") <> "", " AND 項目='" & Range("B12").Value & "'", "") となっておりまして、テーブル1というアクセスのテーブルから、日時と依頼者と項目を完全一致で抽出することはできました。 この中から依頼者と項目に関して、「・・・を含む」条件にしたいのですがLIKE演算子等入れても上手くいきません。 どなたか教えていただけますでしょうか。
>>421 上手くいかないとき、Sourceにどんな文字列が入っているのか出力して見てはいかが?
424 :
421 :2010/05/23(日) 23:53:16
>>422 問題はSQL何ですかね?だとすると手がつけられません。
>>423 デバックしたときに見た文字列は上手くいっていました。
ということは外部データの取り込みではLIKE演算子は無理なのでしょうか・・・
425 :
デフォルトの名無しさん :2010/05/23(日) 23:54:57
むり
あれ?できなかったっけ?
427 :
421 :2010/05/24(月) 00:05:18
たとえば IIf(Range("B10") <> "", " AND 依頼者='" & Range("B10").Value & "'", "") & _ のところを、 IIf(Range("B10") <> "", " AND 依頼者 Like'%" & Range("B10").Value & "%", "") & _ へ変えてみても上手くいきませんでした。 もしかして書き方が間違ってますか?
>>424 デバッグで見ただけでは分かりにくいエラーは有るよ
俺はSQL文をテキストファイルに出力するプロシジャを作って
別途確認する様にしてる w
>>427 Value & "%" の%の後ろのシングルクォートは?
あと一応Like演算子と文字列の間にスペースを入れようか。
それとセルの内容エスケープしてないのはわざとだよね?
マンドクセだから確認してないけど 先に抜き出す条件を文字列でSQLにぶちこんでみ それで出来ないなら構文かデータベースチェック
431 :
421 :2010/05/24(月) 00:28:19
できました!。皆さんありがとうございます。
特に
>>427 さん
大変ありがとうございます。
恥ずかしながら、後ろ側のシングルクォーテーションが必要とは知りませんでした。
また、Likeの後にスペースを入れていないことも原因のひとつでした。(本当に情けない。。)
>>427 さん
後学のため教えていただけますか?
>それとセルの内容エスケープしてないのはわざとだよね?
具体的にはどういったことでしょうか?
432 :
421 :2010/05/24(月) 00:30:22
興奮してレスを間違えました。
429のレスは427ではなく
>>429 さんへのレスでした。
>>431 エスケープっていうのはたとえば、Range("B10")の内容に
シングルクォートが含まれていたりしたらSQL文として
文法エラーになるよ、っていうだけの話。
Like '%'%' みたいになったらシングルクォートの閉じ位置が
変わるので文法エラーになる。
まあ、自分で使うツールってだけならあんまり気にしなくていいよ。
434 :
421 :2010/05/24(月) 00:40:20
>>433 なるほど・・・
たしかにそうですね。勉強になります。
今回は時間の都合上、運用面で対処したいと思いますが、
今後はそういったことを含めて構築していきたいと思います。
とにかくありがとうございました。
435 :
デフォルトの名無しさん :2010/05/24(月) 08:17:43
D-SUB9ピンのRS-232Cで接続するバーコードリーダーから文字列を入力する方法を教えてください TELNETで認識するところまでは出来たのですがそこまでしか出来ませんでした
だれかイミディエイトウィンドウを画面右側にぴったりフィットさせる方法を教えてくれ。 前はいろいろいじくってたらなんとかできたんだけど、今どうやっても上手くいかない。
しばらくここ読んでなくて乗り遅れたが、空文字の代わりにvbNullStringって書いたやつ誰だよ。 どういう場面を想定したか知らんがrange("a1").value=vbnullstringなんてのは間違いだよなぁ。
2ch もう終わってるね
そんなことを言う人は破門です
LenBがLenより速いとか書いたやつもしっかりString型の時と書かなきゃいかん。 Excelでよく使うVariant型では逆になるぜ。
436 ぐっとしてきゅって右下にばっする
>>440 くどくなるので必ずこうしろと言うわけではないが、Variant型の2次元配列の
各要素の型が何型か判定する場合が多いと思うが、判定して文字列だったら
String型の一時変数に格納して処理した方がベター。
そうすればLenBが確かに速い。
数値などの他の型でも一時変数に移した方がいいのは同じ。
444 :
436 :2010/05/24(月) 10:26:51
>>442 d
でけたぜ!
右下にってのがコツなんだな。
正直、=""とかLenBとかにこだわってるのはほとんど無意味だぜ そんなの、長い文字列を連結したり、RangeのCopyメソッドを使った瞬間に 無意味になる
446 :
デフォルトの名無しさん :2010/05/24(月) 14:06:07
Public Type A ID As Integer Name As String End Type Public Type B ID As Integer Name As String ByRef A As String <-ここでエラーが出る End Type Sub main() Dim TableA() As A Dim TableB() As B ・・・・ End Sub TableBでTableAのメンバーの一つを参照させたいのですが、上記のような記述だとエラーが出ます。 構造体のメンバーに参照(ポインタ)を使いたいのですが方法はないものでしょうか?
447 :
436 :2010/05/24(月) 16:53:58
>>447 文字列の連結に単純連結がいけないのはほとんどの人が知ってるだろ?
あとはいかにスマートにMidステートメント使うかが腕の見せ所。
まぁ今はバカでも使えるJoinがあるので楽になったけどな。
単純な文字列連結にこだわりすぎるやつも馬鹿だな 文字列連結なんて大抵は短い文字列同士の連結にしか使わず さらに回数もたいしたことないのが普通なんだから その辺をわかってて使うなら普通の簡潔な記述の方が優れてる
>>448 んなこたー当たり前。
回数の多い例が出てたんでね。
こんなのほとんどの言語で共通だと思うが、未だに知らない人もいるみたいなんでね。
長さ0の文字列かどうかならLenとかLenBの方が""と比較するよりいいかも知らんが、セルが空白かどうかを調べるだけならIsEmptyが一番軽いだろうねぇ。 俺は大体""と比較するけどな。
そういうチマチマした高速化の技術はどうでもいい 高速化で本当に困るのはそんなところじゃない 上で出てた文字列連結の知識や、valueを配列に一気に出し入れする技、 WorksheetFunctionを使う技などをまず覚えるべき
>WorksheetFunctionを使う技 意識したことないけど、これどんなん?
>>451 そんな低レベルな話してもしょうがねぇなぁ。
お前の文字列連結を手直ししてやるからここで書いてみ?
A1:A60000の値をカンマで連結するコードを書け。
ただし
おっと途中で送信したぜ。 ただしJoinはなしな。 これは猿でもできるから。
高速化言うんならCとかでDLL作って呼び出したらいいんじゃね VBAですることじゃない
何で書こうと回数の多い連結を単純に連結しては駄目だわな。 以前VBAを馬鹿にした酔っ払いSQL厨がいたが、アルゴリズムも知らない馬鹿だったぜ。
>>453 の素晴らしい回答にご期待ください。
俺は猿でもできるJoin使うけど。
適当に A6000までコピー クリップボードから変数に抜き出し Replaceでvblfを,に変換 書き出し そこそこ早いかな?
>>456 回数だけではない
どちらかというとむしろ、文字列が長いかどうかが重要だな
回数というのもどちらかというと、「ペース」と置き換えるべきだし
連結してねえw
A60000だった 列Aでもいいな
お前と連結したいよ
ウホッ
プログラムとしては面白いが、解答としてはどうなの 実際に文字列連結する場合、配列でもなんでもいいけど書き出してからその処理するのは流石に時間かからないかな 見てないけど
もう連結ネタ飽きたのでそろそろ別のネタ始めてクレクレ
ネタも何も質問スレなんだから質問ありきだろ
素直にJoin使えばいいのに、禁止する意味がわからない 何がしたいの
任意の型の空の配列を作成する方法ってありますか? String型ならSplit()で行けるし、Variant型ならArray()でいけますが、 他の型はどうやって作成すればよいでしょうか?
>>458 DataObject使うのか?
でもReplaceが遅いからなぁ。
試しに
A1
A2
.
.
A599999
A600000
と2文字〜7文字の60万セルでやってみたら2.8秒だったぜ。
DataObjectとSplitとJoinの併用でもほぼ同じ。
一方Midステートメントは0.6秒。
ループ回して一次元配列に移してJoinは微差でMidステートメントに負けるようだが俺ならJoin使うな。
なんたって楽だからな。
上は連結文字列の作成だけで書き出しは入ってないからね。
60万行じゃなく6万行でやってみたら
>>458 のDataObjectが一番速いな。
Dictionaryと似たような特性だな。
数万データならそこそこ速いが数十万になるとウンコってやつ。
で、結局どんな答えを想定してたんだ?
クリップボード経由で数百万語を一変数に押し込む処理ってCPUとメモリに依存しそうだが
まだまだCPUやメモリは速くないなと思ってしまった。
思いつきで書いただけだが、「エクセルVBAテクニック」としてなら有りな感じ? 限定条件下になりそうだけど
Mid$とclsConcatenate使って、 vbCrLfは10と13だから、SelectCaseでそれぞれ処理し、 2文字ずつカウントする ……と、多分こういう解答を求めてたんだろうか
Mid$以外使う必要がないでしょ clsConcatenateってなんだろうと思って検索したら 独自に作ったStringBuilderもどきがひっかかった もし、そういうのを使うならclsConcatenateだけでいいし vbCrLfでSelect Case云々言ってるのは、なんでそんなことをしてるのか ちょっとわからない
初歩的なことなのだが教えて欲しい。 Public変数は、プロシージャの処理終えると値消えてしまうのか?
基本的に残るけど、一定のタイミングや、 Endステートメントを実行すると初期化されなかったっけ。
VBAの本でいい本ってある?
なんか、サンプル載せましたよ
みたいな本ばっかりで、このスレに書いてあるようなことが載ってる本
見たこと無いんだけど
例えば、
>>481 に書いてあるようなこととか、つい最近話題になった
文字列連結のことだとか、そういうことすら、書いてある本を
ほとんど見たことがない
フェイタンと師団長だったら、別に師団長が強烈な発を持っていなくても 勝負はわからんよなw
最近かってためになったのは ExcelVBAスキルアップテクニック Excelプロフェッショナルエンジニアテクニック かな
>>482 VBAはVB6と言語としては全く等価だから
VB6で探したほうがいいね。
これ出来ないのかな、と前から何度も思ってた事なのですが、 テキストボックスとテキストボックスなら、図形の矢印で結ぶことができて、 片方のテキストボックスを動かしたら、矢印の線も一緒に動くじゃないですか。 これを、 セルとテキストボックスでやることは出来ないのでしょうか? つまり、テキストボックスから、矢印を延ばして、あるセルにくっつけます。 そして、どっちを動かしても、矢印で繋がったままにしたいのです。
489 :
デフォルトの名無しさん :2010/05/30(日) 12:41:07
質問です。。 ユーザーフォームのラベルでバック半透明で文字だけをくっきり表示させたいです。 どうすればよろしいでしょうか?
VBAでマウスカーソルをピクセルで指定してクリックさせるにはどうするのが良いのですか? 今はShellを使って別プログラムから呼び出してますが、処理が遅くなるので もっとスマートなやり方があれば教えて下さい。
491 :
デフォルトの名無しさん :2010/05/31(月) 05:10:33
うんこ
>>488 VBAで作るとすると
1.矢印の起点・終点(高さ)を取得
セルなら(i-1)までの.RowHeightの合計プラス(iの.RowHeight)/2
テキストなら位置プラス(高さ)/2
2.横位置を取得
同様に
3.左右のオブジェクト判定
セル、テキストボックスの右端位置を比較
4.1と2を元に矢印の位置設定
>>499 ラベルのプロパティ→項目別→表示
で好きなの選ぶ
493 :
デフォルトの名無しさん :2010/06/01(火) 01:02:31
>>489 の質問は492で解決になっているのか??
表示の中に半透明の設定なくない?
494 :
デフォルトの名無しさん :2010/06/01(火) 07:19:17
EXCEL2003、XPsp2です。 EXCELのVBAだけを使って、インターネット(TCP/IP)通信をする プログラムは作れるのでしょうか? 難易度は問いません。 よろしくお願いします。
ぐぐったらフォームの半透明化が見つかった 窓側のコントロールのカスタム描画を使うAPIだな 半透明ってのがイメージ湧かないが
496 :
487 :2010/06/01(火) 12:52:30
ありがとうございました
Docmd.RunSQLってマルチプルINSERT対応していますか? DBはMySQLです。
498 :
497 :2010/06/01(火) 17:19:55
あ、ここAccessじゃなくてExcelでした。 すみません。
Formulaで数式埋め込もうとすると短い式なら問題ないんだが、 複雑な(長い)式になるとTRUEを返される。 何だこれ?
もっと色んなパターン試せばどうだろう 別の長い式作って
501 :
デフォルトの名無しさん :2010/06/01(火) 22:46:14
EasyCommっていうフリーウェアをインポートして 装置からデータをRS-232C経由で取り込むプログラムを書いたんですが、 プログラム動作中はストップキーも聞かず、入力を受け付けてくれない ようです。これってそういう仕様とあきらめるしかないのでしょうか。
DoEventsじゃなくて?
真偽返すのはどっか引数が抜けてるんじゃね
>501 んなこたぁない。
505 :
デフォルトの名無しさん :2010/06/02(水) 20:39:09
エクセル2000では動く、エクセル2007では 動かないマクロがあるんだけど。 考えられる原因ってどんなのがあるの?
大抵は、変更とか削除された機能を使っていたとかじゃないか? 2007で旧時代の機能は大分整理されたみたいだからな。
507 :
499 :2010/06/02(水) 21:57:24
解決した。 結局TRUEが返される理由はわからんが、 思い通りの結果が出たのでまぁ良しとする。
508 :
デフォルトの名無しさん :2010/06/02(水) 22:08:20
>>506 そうなん?ってことは2007で動くように
作りなおさなきゃってこと?
そのまま使える方法ってないのかなぁ?
ない 2003と2007はまったく別のソフトだと思った方がいい 何も全部作り直さなくても、たいていのマクロは少し修正するだけで使えるようになるはず
510 :
デフォルトの名無しさん :2010/06/03(木) 19:45:17
両方で動くようにはできないってこと?
それは内容による 速度やExcelそのものの制限に関係なく、 両方で結果が同じになる関数ばかり使ってればいい
512 :
デフォルトの名無しさん :2010/06/04(金) 06:30:29
両方で結果が違う関数なんてあるんだぁ たとえばどんな関数?
version
おおっと
Versionはプロパティ
WorksheetFunction
エクセルver2002を使っています。 印刷設定について教えていただきたいのですが、 一枚77行で縦に任意の枚数(2枚なら77*2行)にあわせて行を77行ごと追加する マクロがあるのですが、この作成された任意の枚数の表の印刷範囲についてなのですが、、、 表作成後に表全体を選択して印刷範囲設定しているのですが With ActiveSheet .PageSetup.PrintArea = Range(."表全体").Address End With ※縮尺73%、A3、品質300dpi プリンターの種類、印刷品質、余白の設定で印刷行数が77からずれることがあります。 【質問】 1.マクロで、縮尺はきにしないで常に77行目に印刷境界線をもってくることはできますでしょうか? 2.また、縮尺50%にしても77行ごとに印刷境界線をもってくることはできますでしょうか? よろしくお願いいたします。
ipadでExcelVBA動くようにならんかね
>>517 77行毎に一旦別のシートにコピーして
印刷
その後そのシートは削除するとか
>>518 つ Citrix Receiver for iPad
>>517 印刷境界線ってのは何をさしてるんだ?
印刷範囲を77行までにするなら
ActiveSheet.PageSetup.PrintArea = "$1:$77"
78行の前に改ページ入れたいなら
Rows("78:78").Select
ActiveWindow.SelectedSheets.HPageBreaks.Add Before:=ActiveCell
とりあえずマクロの記録でこうなった
522 :
517 :2010/06/06(日) 14:03:42
>>517 です。
分かりにくい説明ですみません。
縦に1〜77と数字を入れたとして、次ページでまた1〜77といれる。
【縮尺100%】
1
2
3
・
・
76
77
--------改ページのライン
1
2
3
・
・
76
77
-------改ページのライン
523 :
517 :2010/06/06(日) 14:05:33
【縮尺90%】 1 2 3 ・ ・ 76 77 1 2 --------改ページのライン 3 ・ ・ 76 77 1 2 3 4 --------改ページのライン 縮尺が100→90%になったときに改ページラインがずれてしまいます。(列側のラインも同様にずれます) また印刷の余白を変更したり、解像度を変更したりしてもずれます。 複数シートに同じような表があり、マクロで一括で体裁を整えたいのですが、 上記のようなとき、手動で改ページラインを77と1の間にもっていけば 自動的に100%になり綺麗に印刷することができます。 この時手動であれば90%のままで77行ごとにもできます。 これをマクロで印刷範囲を77行ごとにしたいのです。 ※縮尺は問いません。(縮尺指定できるのであればやり方だけでも教えていただけたらと思いますが・・・)
だから、77行目ごとに改ページ入れたいんだろ
>>521 の後半でわからない?まったくの初心者か?
その77行ごとにデータ入れるマクロで、改ページも入れるようにすればいいだけなんだが
わからんようなら、A列から1を探してその手前に改ページ入れるマクロ書いといてやる
Dim row
ActiveSheet.ResetAllPageBreaks
row = 1
Do
row = row + 1
If Cells(row, 1).Value = 1 Then
ActiveWindow.SelectedSheets.HPageBreaks.Add (Cells(row, 1))
End If
Loop Until Cells(row, 1).Value = ""
2007で作ってるけど、たぶん2002でも動くと思う
暗黙の型変換気持ち悪いとかいう突っ込み禁止
525 :
517 :2010/06/06(日) 17:26:45
>>524 さん
ご指摘ありがとうございます。
マクロはネットで調べながら覚えたもので、勉強不足ですみません。
そして、謎が解けました!
ActiveSheet.ResetAllPageBreaks
の時点で自動で縮尺が100%になるんですね。
この後に縮尺を90%にしてから
HPageBreaks.Add
で改ページをいれてあげたらうまくいきました。
ありがとうございました。
下記のデータが仮にあったとします。 ユーザーフォーマットを使用してコンボボックスにユーザーID(A列)を 配置し、指定されたA列のB列、C列データを呼び出し変更を加えれるようにしたいのですが、 コンボボックスとテキストボックスをどのように紐つければよいのでしょうか? A B C 1 犬 雄 2 猫 雄 3 鳥 雌
更新後処理
アドインを2つ作りました。 中のプログラムはモジュール名から何まで全く同じで、 途中で参照するファイル(テキスト)だけが異なります。 別の業務をしている人向けに、それぞれに作ったのですが、 兼業する人が両方のアドインを追加すると、うまく動きません。 具体的には、最初に動かした方のテキストをずっと読んでしまうようです。 どこを変えれば動くようになるでしょうか。
空が青いなぁ。
全部同じなら中の人も見分けつかないだろうな 処理なり使ってるシステムから切り替え出来ないの?
531 :
デフォルトの名無しさん :2010/06/07(月) 21:22:06
既にシート中にある、表の中身(文字列)を二次元配列として変数に代入して 他のシートのセルに場合わけして入れる場合、どのように書いたらよいのでしょうか?
Hairetu = range( , ) ループ処理 Hairetu(i,n)の条件分岐でHairetuBにでも格納 sheets( ).rante(,) = HairetuB
>>532 さん、ありがとうございます。
最初の変数の代入は、どのように記述すればよいのですか?
二次元配列を宣言してx(i,n)でstring型で宣言したのですが、
データ数が多いのでfor文で回して代入したいのです。、
range("A1")を代入するとしたら、for文はどうなるのですかね??
For i = 1 To 18000
For j = 1 To 18
x(i,j) = Range(i, j)
Next j
Next i
こうじゃないですよね。。
Hairetu = range("A1:Z99")
ありがとうございます。 すみません、最後の別シートの格納の仕方についてなのですが… 例えば、x(2,3)の内容をRange("C2")に入れるなど、所定の場所に格納 する際に、for文で回して入れる方法はあるのでしょうか?
>>533 ワークシートの内容を配列に入れるには、配列を二次元のVariant型にしておけば、セルがいくつあっても一気に代入できる。
Forを使うより何倍も速いしプログラムも簡単。
String型にしてしまうとFor〜Nextを使うような遅い方法しか使えなくなる。
>>535 そりゃ
Range("C2") = x(2, 3)
だろう。
ほかのデータはどこに入れるの?規則的に並んでなければForを使うのは面倒だよ。
別の配列に入れ替えればいいだろに
質問なのですが、 セル範囲を一括で配列に格納した場合の添え字を 0からスタートさせることは出来ますか? 普通に格納するとx(1,1)から数値が入ってしまうところを x(0,0)から数値が入るようにしたいのです。 今は別の配列に入れ替えてるのですが、ちょっと不便で・・・ よろしくお願いします。
Excel2007 テキストボックスのScroolBarsプロパティをfmScrollBarBothに設定しているんですけど、 ホイールマウスの真ん中のホイール部分を回転させても有効になりません。 有効にする方法ってありますか?
>>539 無理。
VBAでは、0オリジンに拘るよりも、1オリジンを素直に受け入れた方が何かと楽だよ。
まだ勉強しだして一週間なんですが教えてください AとBにそれぞれ1〜50の数字を代入し AとBを掛け合わせた数を縦方向にペペペと貼り付けを繰り返したいんですが 1×2と2×1は答え同じなんで重複を無くすために 代入する数値を【A>B】と定義するのってどうしたらいいんですか ↓こんな感じでやってます Dim A Dim B for A 1 to 50 for B 1 to 50 (右クリックコピーでペペペと貼り付けるマクロ省略) Next B Nezt A
やりたいこと(出来上がりイメージ)がよくわからん上に 大事なとこが省略されてる気がする とりあえずA>Bのときだけなんかの処理をしたいのなら Dim A Dim B for A=1 to 50 for B=1 to 50 If A>B Then (右クリックコピーでペペペと貼り付けるマクロ省略) End If Next B Next A こんな回答しかできません 出来上がりのイメージとかあればもうちょいマシな回答できるかも
>>542 とりあえず質問そのままの解答だと
If A > B Then ぺぺぺ
だけど、条件がA>Bだけだと6*1と3*2が同じ答えで重複するし
50*50は1回しか出てこないのに条件から外れちゃうよ?
いちいち調べなくても必ずA>Bになってるプログラム
For B = 1 To 49
For A = B + 1 To 50
ぺぺぺ
Next A
Next B
それから右クリックコピーってなんだ?
セルに数値を入れるだけなら右クリックも貼り付けも必要ないんだが。
Dim A&, B&, rowCnt&, colCnt& rowCnt = WorksheetFunction.Max(A,B) colCnt = WorksheetFunction.Min(A,B) もしくは If A < B Then Dim swap& swap = A A = B B = A End If ってやりたいだけか?
Sub Hoge(inRange as Range, outRange as Range) 上記のようなインターフェースのサブルーチンがあるとします inRangeのデータに何らかの演算をしてoutRangeにコピーします このサブルーチンをワークシートの上のほうにある関数入力部分に =Hoge(A1:B2, C1:D2) のように入力したのですがうまく動いてくれません 引数付きのサブルーチンをワークシート上で手動呼び出しするにはどうすればいいんでしょうか?
インターフェースのサブルーチン だぜ
シート1からシート7までのb242:u242のセルをコピーして シート11のb2からb8まで順番に貼り付けるにはどうすればよろしいのでしょうか?
シート上に CommandButton を 2 つ配置し、 それぞれ CommandButton1, CommandButton2 とします。 CommandButton1 をダブルクリックして、次のコードを書きました。 Private Sub CommandButton1_Click() CommandButton1.Enabled = False CommandButton2.Enabled = False MsgBox "now processing..." CommandButton1.Enabled = True CommandButton2.Enabled = True End Sub ここで CommandButton1 をクリックしてダイアログボックスが出ているとき、 CommandButton2 の文字が黒のままで False になっていないように見える のは、なぜですか? MsgBox の行にブレークポイントを仕掛けて CommandButton1 をクリック したときは、きちんと CommandButton2 の文字も灰色になります。 (WinXPSP3/Excel 2003)
>>546 SubをPublic Functionにしろ。
あとワークシートにVBA記述すんな。モジュールに書け。
関数の入力のダイアログでユーザ定義関数の一覧部分に
自分の定義したFunctionが出てるか確認しろ。
以上。
551 :
デフォルトの名無しさん :2010/06/10(木) 07:04:06
RS485を入出力したいのですが、RS232Cとかでよく使われるMScommを利用しようと思っています。 ところが、「ActiveXはオブジェクトを作成できません。」とエラーが出てしまいます。 RS232Cの入出力でも同様に出てしまいました。 VB6.0ランタイムはインストール済です。参照設定もしています。 どうしてでしょうか?解決策は?
ワークブックXには、2つのワークシート(以下WS)があります。 ・ワークシートA(以下WSA)は日次報告の原紙が作成済み ・ワークシートB(以下WSB)の列Cには日次報告の対象となる日付(MMDD形式)が入力済み 上記の2つのシートを使い、 1.「WSA」を「WSB:C列に入っている日付の個数分作成」し、 2.1.で作成されたWSのシート名を「WSBの日次報告の対象となる日付」に変更 するというマクロはどのように組めばよいのでしょうか?
>>553 Dim r
r = 1
Do Until Sheets(2).Cells(r, 3) = ""
Sheets(1).Copy After:=Sheets(2)
Sheets(3).Name = Sheets(2).Cells(r, 3).Text
r = r + 1
Loop
シートの1枚目が原紙、2枚目が日付の入ったシートって前提な
C++とかでDLLを作ってそのDLLの関数からRangeを操作したりって出来ますか?
IDispatch::Invokeとか直接呼ぶ羽目になりそうな気もするけど、 一応可能じゃないかと。
558 :
553 :2010/06/10(木) 23:26:31
>>552 すみません…
駆け出しなもので、余計なコードが入ってしまうと理解に時間がかかるため
エディターで編集しています
>>555 ありがとうございます!
少し参照するシートや列を変更してみたら、自分の環境でも動くようになりました
ちなみに、こんな感じです↓
Sub ワークシートコピー()
Dim r
r = 1
Do Until Worksheets("日付データ").Cells(r, 9) = ""
Worksheets("原紙").Copy After:=Worksheets(Worksheets.Count)
ActiveSheet.Name = Worksheets("日付データ").Cells(r, 9).Text
r = r + 1
Loop
Application.DisplayAlerts = False
Worksheets("原紙").Delete
Dim p As String
p = Worksheets("日付データ").Range("A6").Text
Dim n As String
n = Worksheets("日付データ").Range("A7").Text
ActiveWorkbook.SaveAs Filename:=p & "\" & n & ".xls"
Application.Quit
End Sub
>>542 書いてみた
Sub main()
Dim C As Range
Dim strC(2500, 0) As String
For Each C In Range("A1:AX50")
strC(C.Row * C.Column, 0) = C.Row * C.Column
Next C
With Range("A1:A2501")
.Value = strC
.RemoveDuplicates Columns:=1
End With
Rows(1).Delete
End Sub
書き直した Sub main() Dim C As Range For Each C In Range("A1:AX50") Cells(C.Row * C.Column, 1) = C.Row * C.Column Next C Range("A1:A2500").RemoveDuplicates Columns:=1 End Sub
バグがあった・・・Orz Sub main() Dim C As Range For Each C In Range("A1:AX50") Cells(C.Row * C.Column, 1) = C.Row * C.Column Next C Range("A1:A2500").SpecialCells(xlCellTypeBlanks).EntireRow.Delete End Sub
Excelで勤怠表を作成する時、必ず問題になるのが、 深夜割増、早朝割増、深夜休憩、早朝休憩の計算方法だと思うんだけど、 これってVBA使わずに完全に解決してる例がみつからない。 ここまできっちりやるならVBAもしくはシステム化が普通なのかな? タイムカードは基本的には休憩時間を考慮しないし、そのへんなかなか難しいね。
>VBA使わずに完全に解決してる例がみつからない。 君の能力の問題じゃね?
> 君の能力の問題じゃね? 俺のググる能力が足りなかったのか!!
>>562 そういうの作った人が、やめちゃってわかんないから、バグとってくれって頼まれたことがある
まあ、ものすごく長い式が詰め込まれとったわ
VBA使わずにできなくは無いのは確かだけど
VBA使えるならそのほうが圧倒的に楽
>>565 読む方からしても、関数よりVBAの方がわかりやすいってことあるよね。
うちにもExcel2003の列数の制限いっぱいまで式が詰め込んであるワークシートが
複数枚、さらに記録機能で作っただけのマクロも大量の悲惨なやつがあるんだが、
とてもじゃないが解析する気にならない。当然作った人は辞めてる。
しかも経理用のだからよくわからん。
ただ、VBAとかマクロを使わずにワークシート関数のみを駆使したシートを
作ると自己満足度が高いので、気持ち的にはわかることはわかる。
どんな就業規則なのかしらんけど、区切り時間とか計算式が変わる境界値を設定して、 一列に一個**時間を計算して、そのsum()なんかを設定値と比較して条件式なんかを 設定した方が、VBAでごちゃごちゃやるよりシンプルだと思うのは俺だけか。
おまえだけ(´ω`)
>>567 まあ、そう思うなら
区切り時間15分、夜間割り増し、深夜割り増し、早朝割り増し、休日割り増し、休憩(外出)時間分減算
こんくらいでいいから、どんだけすっきり書けるか、挑戦してみw
(余力があるなら、さらに休日の夜間深夜早朝とかも入れてね)
入力はタイムカードの時間記録4個ね(出社、退社、時間内出、入)
>>567 平日の深夜早朝の手当は就業規則関係ないだろ。
>>569 休日の深夜早朝は法律には無いと思うので、
そういう就業規則があるところは羨ましいな。
やってみるとめんどくさいのがまともな勤怠表。
Excelの自動計算機能を使ってもめんどくさいのに、VBAだと簡単にできると主張する不思議
「完全に解決してる例」が見つからないのは、その手の奴は会社ごとに異なるから 汎用性のあるものを作るのはむずかしいし、自分の会社用の奴をごりごり作ったとしても 公開しないからじゃないの?
>>562 逆にVBAじゃないと完全に解決できないと思う理由は何なの?
そりゃVBAはなくてもできるだろうけど使った方がずっと簡単 俺なら迷わずVBAを使う
>>571 エクセルの式は基本的に1行にまとめないといけないから複雑なことをするには向いてない
無理にやろうとすると大変な思いをする
大量の計算を1行に詰め込むのはプログラミング的にはクソの代表だしさw
VBAならそんな制約は無いし元々そういうややこしいことをするための物だから楽にできる
使える人にとってはね
使えない人がこれから覚えてでも楽かと問われれば微妙w
使えるようになるまでが大変だから(その人のセンスしだいってとこもあるけど)
ワークシート関数では手間のかかることってのが 計算の途中経過を保存したり再利用すること 場合分けすること だから、これらの処理が必要ならVBAを使った方がいい 計算式が独立してて一つ結果が出たらそれで終わりって場合はワークシート関数でやる
ワークシート関数を激しく多重ネストして可読性を下げるくらいなら、 ユーザー定義関数をワークシートに張った方がずっと良いと思う。 マクロ有効にしたくない?知らんがな。
俺は勤務表のカレンダーをExcel関数で作ってきたけど、カレンダー作成マクロでも組んだ方が楽だよな。 Excel関数だと無駄な同じ式を30日分入れとかにゃならんし、休日判定なんかもめんどくさい。
VBAでカレンダーを作る一番簡単な方法 ネットにアクセスしてYahooカレンダーからデータを抜き出す 祝日法が改正されてもYahooが潰れない限り全自動で対応できる
休日は算出できんものな。 法律が出来ても変わるし、天ちゃんが死んでも変わる。
VBAってなんて文書性の高い言語なんだといまさらながら感動 ワークシートコピー() とは rは変数だよん r に1を設定 ワークシート("日付データ")のセル(r,9)が""でない限り ワークシート("原資")をワークシートコレクションの現在の個数番目の ワークシートの後に複写, 現在のシートの名前をワークシート("日付データ")のセル(r,9)に書かれている 文字列に設定, rにr+1を設定 以上繰り返し エクセルの警告表示をオフに ワークシート("原紙")を削除 pは文字列変数だよん pにワークシート("日付データ")の範囲("A6:A6")の文字列を設定 nは文字列変数だよん nにワークシート("日付データ")の範囲("A7:A7")の文字列を設定 現在のブックをp&"¥"&n&".xls"という名前で保存 エクセルを終了 わかった?
エスパーに質問。 ほとんどのPCで1分程度で終わるマクロが、あるPCだけエラーは吐かないものの数時間待ってても返ってきません。 デバッグモードに入りどこで止まっているかを見ても無限ループに入っているわけではなさそうです。 PCのスペックは同等、エクセルとVBのバージョンも一緒です。 考えられる原因はなんでしょうか?
>>583 on error resume next でエラーループさせてるとか。
レジストリ書き換えが上手く行って無いとか。
iniの読み込みがいつまでもtrueにならないとか。
エラー吐かない、と書いてるならば on error resume next は入れて無いよね?
デバッグで止まっているなら、そこが問題なんじゃないか?
do loop 使ってる?
いかんせん情報が少なすぎる。
Debug.Printまみれにしてやれ。
当然ウイルス対策ソフト切って試してるんだろうな
yahooのカレンダー取得せんでもアクセスカレンダーって使えなかったっけ あれは祝日がないのか?
>>584 Windowsのバージョンが変わった場合とか、そもそもMacが共通だとか、
環境によってはライブラリが無いとか、そういう制限て無いの?
>>588 もう祝日は数年分の祝日リストをワークシートに書いといてそれを見るようにすればいいんじゃね?
配布が簡単なところがExcel開発の良いところだし。
祝日法はアルゴリズムそのものだからなあ 多分フリーで最新の祝日反映されたカレンダー一覧がごろごろ堕ちてるだろ
>>589 ほとんどがXML(or SGML)ファイルなので大丈夫と思うよ。
欠点はスキーマが統一化されてない事かな。
594 :
デフォルトの名無しさん :2010/06/13(日) 11:10:35
事務職レベルなのですごく初歩的な質問します。 EXCELでもACCESSでもいいんですがVBAを書くとき、 ネットとか既存のシステム?からVBAを借用してきて、自分用に編集することってあります? それとも、全部一から書きますか?
>>594 ネットにあるサンプルを利用するのは凄く勉強になるけど、
必ず自分で手打ちする事が大切かな。
面倒かもしれないけど、コードを印刷して自分で手打ちするのと、
ただコピペして終わりにするのでは、大きな差があると思う。
自分の物にしたいなら、コード手打ちが良いよ。
もちろん1から組めるに越した事はないけどね。
ライブラリならともかくコピーして編集って怖くね? なんかものすごいバグが紛れ込みそうで不安
メソッドの用法を調べて、後は自分で組めるレベルまで頑張るしかない。
>>597 ライブラリとしてまとまってるクラスや関数を使うのと
実装をいじるのでは全然違うでしょ
600 :
デフォルトの名無しさん :2010/06/13(日) 12:20:17
自分で作ったものだったら何をやってるか判ってるからそのまま流用っつーのはよくある。 ネットで拾った物は自分で、その部分のみをテストして納得したら 編集し直して使うのはある。 (変数名を自分がわかり易い名前にするとか
プログラム書く癖ってあるじゃん。 定数化のルールとか、インデントの入れ方とか。 range("A1") で書く人もいれば、cells(1,1) で書く人もいる訳で。 そう考えると、やっぱり自分で書きなおした方が良いな。
>>599 たいしてかわらん
そのまま使えるものをコピペしてくるなら
ライブラリだろうが、実装だろうが変わりないじゃん
アレンジがひつようなら、やっぱりかわらんじゃん
603 :
デフォルトの名無しさん :2010/06/13(日) 12:41:12
レスありがとうございます。 今まで、会社で既存のものを流用したり、ネットから一部コピーや 本に書いてるのを打ち込んだりしてました。 知識不足のため、全部自分で考えてやると時間がかかり過ぎて・・・ でも、ちゃんと覚えていくしかないですね。
604 :
デフォルトの名無しさん :2010/06/13(日) 12:42:46
>>602 そのまま使えて、副作用もないコードならコピペでもいいかもね
でもまずは副作用がないことを確認して、アレンジするなら新しい副作用が出ないように書かないといけない
規模が小さければどうって事ないが、普通これは結構な手間になり、見逃せばバグにもなる
ライブラリはそういうことも実装する側が考えている(というか考えるべき)からその手間もリスクも少ない
特殊なアドインを自動操作する方法を検討してます。 手動でやるときは、メニューバーから選択して、一連のキー入力をするだけなんですが、 vbaでこのような処理を自動化するにはどうすればよいでしょうか? もちろん、本来はアドインのインタフェースを調べてそれを呼ぶべきなんでしょうが、 仕様がまったく不明なので、手動処理をなぞれないかと思っています。
addinで定義されてるルーチンなり関数なりを呼び出せば良いだけでは?
>>606 VBAじゃなくて、なんかの自動化ソフトを使ったら?
なんで「調べてます」って書かないで「検討してます」とか書くんだろう
>>606 決まった順番でキーを押すだけならSendKeysという命令があるけど
副作用も多いので使えるかどうかはよく検討する必要がある。
アドイン自体を操作するのに使える?
参照はAddFromFile アドインもなんかなかったっけ
あ、いやそういう意味じゃなくって、メニュー操作してアドインに制御がわたった後でも、 そのアドイン自体の操作をSendKeysでできるのかなってこと
そのアドインが階層メニュー使ったり、ダイアログ表示したりする奴だったら、多分SnedKeysじゃ信頼性なくて 駄目だと思う。
今このVBAをそのまま流用して改造してるんですが、
http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_110_080.html 選んだ階層以下すべてのファイルを、特定のURLを先頭につけて抽出したいのですが、うまくいきません。
いじったのは以下のところだけですが、ファイルがある場所のみしか抽出されないのと、フルパスをうまく吐いてくれません。
(ファイルのあったディレクトリィだけ出る)
どこがまずいでしょうか。
' 現在フォルダをシート上に表示
g_cntPATH = g_cntPATH + 1 ' 参照フォルダ数を加算
FilePaths = "
http://wwww.test.com " & FilePaths & "/" & objPATH.Name & "/"
' ■先ずサブフォルダを探索するループ処理
For Each objPATH2 In objPATH.SubFolders
' フォルダ単位のサブ処理(再帰呼び出し)
Call SEARCH_SUB_FOLDER(objPATH2, GYO, COL)
Next objPATH2
' ■本フォルダの各ファイルをシート上に表示するループ処理
COL = COL + 1 ' カラムを加算
For Each objFILE In objPATH.Files
g_cntFILE = g_cntFILE + 1 ' 参照ファイル数
GYO = GYO + 1 ' 行を加算
With objFILE
' ファイル名+(最終更新日時+ファイルサイズ)
Cells(GYO, COL).Font.ColorIndex = 1
Cells(GYO, COL).Value = FilePaths & .Name
If 25000 <= .Size Then
Cells(GYO, COL).Font.ColorIndex = 3
End If
壊滅的に説明が下手なので、コード読む気にすらならない
>>615 本当にそこしかいじってないんなら、変数FilePathsが宣言も初期化もされていないから
フルパスが出るわけない
> 選んだ階層以下すべてのファイルを、特定のURLを先頭につけて抽出したい 「抽出」の意味が不明。(コード見ればわかるかもしれんが) > ファイルがある場所のみしか抽出されない 「ファイルがある場所」以外は、一体どこの何を抽出したいのか? 「選んだ階層以下すべてのファイル」が対象ではないのか。
>>618 宣言はしてあります。
ただ、全部コピペすると書き込めなかったので・・・。
>>619 そうです。その通りです。
選んだフォルダの階層以下すべてのファイルのフルパスを、
エクセル上に書き出したいんです。
今のままだと、ファイルのあるフォルダしか書き出されない上に、
そのファイルのあるフォルダよりもっと上の階層がなぜか消えてしまってるんです。
>>620 byval と byref を間違えてるに一票
>>615 リンク踏んだけど、そもそもそのページが読む気失せる作りだわ
>>615 暇だったのでやてみた
FilePaths をグローバルに宣言して
全体処理のほうにこれを書いて
FilePaths = "
http://wwww.test.com/ "
再帰のほうのこれを修正
FilePaths = "
http://wwww.test.com " & FilePaths & "/" & objPATH.Name & "/"
↓
FilePaths = FilePaths & objPATH.Name & "/"
で、カラム位置は別として、希望の文字列が得られてると思うが?
だめなら、元のソースが壊れてると思われ、コピペからヤリナオスベシ
>>622 ページの作りはどうでも、書いてるコードの内容が全体的にヘタクソ杉。
よくあんなの公開できるもんだと感心する。
参照を受け取るときにC++でいうconstみたいな指定子ってある?
>>623 >>623 おっと、バグッテた
再帰のプロシージャの中で
dim tmp しといて
FilePaths = FilePaths & objPATH.Name & "/"
↓
tmp = FilePaths
FilePaths = FilePaths & objPATH.Name & "/"
出口で
FilePaths=tmp
これでいけるわ
>>624 悪口しかいえないやつより100万倍まし
>>625 c++を知らないvb使いとしては、参照を受け取るときのconstの意味がわからん
どういう動作なのか説明してくれたら、VBではこうだと言えるカモ
>>628 例えば配列やクラスをディープコピーして渡すのはコストがかかるので参照で渡す
けど参照で渡したときに間違って書き込みをしたくない場合につけるセーフティみたいなもんです
ようするに読み取りだけできて書き込みはできない引数のことです
>>626 あ〜そだ、グローバルで宣言したFailePathsを引きずり回してダサダサなので
ソースをかっこよくしたいなら、引数のほうに入れたほうがいいね
自分でやってね
>>626 ありがとうございました!
グローバル変数の存在を思いっきり忘れてました・・・。
634 :
デフォルトの名無しさん :2010/06/18(金) 00:58:58
初心者で申し訳ありません 今A1からD10まで数字が埋まった表があります このうちB1〜B10を選択し、コピー、F1〜F10に貼り付けするとします このB1〜B10を選択するときに、直接"B1:B10""指定でなく、「表上の左から2列目、一番上から一番下までの範囲を選択」、 としたいのですが、どのように書けばよろしいのでしょうか? 表はいくつかあり、それぞれ縦のデータ数が10だったり15だったりまちまちなため、セル指定だと対応できないので困っています・・・
>>634 「表上の左から2列目、一番上から一番下までの範囲を選択」
だと
途中に空白セルがないなら
Range(Cells(1, 2), Cells(1, 2).End(xlDown)).Select
とかする
個人的には好きではないけど
途中に空白セルがあった場合なんかは
Range(Cells(1, 2), Cells(65536, 2).End(xlUp)).Select
の方がいいかも
>>634 B1からデータの入っているセル範囲を自動的に求めてコピー
Intersect(Range("B1").CurrentRegion, Range("B:B")).Copy
もっと単純に、 Columns("B:B").Select とか Columns(2).Select とかで良いんじゃ? んで Selection.Copy でコピーして Columns("F:F").Select でF列選択 ActiveSheet.Paste ではりつけ つかまずはマクロの記録
>>636 こんなやり方初めて知った。
でも、空白セルがあるとそこで途切れてしまうから、結局
>>635 のほうがいいのかな。
65536って入力するより、rows.countのほうがいいだろうけど。
B列全体をコピーしてもいいのかどうか。空白セルをコピーすると何かまずいことがあるのか。 途中に空白が入ってデータが飛び飛びになることはあるのか。 このあたりが条件として欲しいところだな。 それによって手間や方法が変わってくる。
640 :
634 :2010/06/18(金) 20:50:20
みなさんさまざまなアイディア、ありがとうございました 以下のように組むことで、一応目的達成することができました ActiveCell.CurrentRegion.Select Selection.Offset(0, 0).Columns(2).Copy ActiveCell.Offset(0, 5).Select ActiveSheet.Paste
>>640 それでいいんなら1行にまとまるよ
ActiveCell.CurrentRegion.Columns(2).Copy Destination:=ActiveCell.Offset(0, 5)
>>634 セレクトしてる意味がない
これで充分
Columns(2).Copy
Columns(2).Offset(0, 5).PasteSpecial
zip 内のファイル一覧を取得したいのですが、 サンプルが見つからなくて何とか以下のようなものはできました。 どこか問題はないでしょうか?とくに item.GetFolder が正規のメソッドとして 存在するのかが気になっています。 また、Folder3、FolderItem2のリファレンスはありますでしょうか? Option Explicit Dim m_fso Dim m_shell Sub main() Set m_fso = CreateObject("Scripting.FileSystemObject") Set m_shell = CreateObject("Shell.Application") ZipList "c:\test.zip" End Sub Function ZipList(FileName As String) Dim folder Set folder = m_shell.Namespace("c:\test.zip") ZipListSub folder End Function Function ZipListSub(folder As Variant, Optional path As String = "") Dim item For Each item In folder.Items If item.IsFolder Then ZipListSub item.GetFolder, item.path & "/" Else Debug.Print path & item End If Next End Function
>>643 とりあえず、Shell.Application絡みのドキュメントはここ。
http://msdn.microsoft.com/en-us/library/bb773938 (v=VS.85).aspx
FolderItem2はShellFolderItemとしてエイリアスされている。
Folder3のヘルプは見つからないな。
更に詳細が知りたければ、参照設定で「Microsoft Shell Controls And Automation」を足すと、
大本のタイプライブラリの内容が確認できる。Folder3は一応ここに出てくる。
WindowsSDK等に付属している「OLE/COM Object Viewer」で
「Type Libraries」-「Microsoft Shell Controls And Automation (Ver 1.0)」を表示させれば、
FolderItem2のエイリアスとかまで確認できるな。
>>643 それ以前に.ZIPがShellで処理される保障はないと思うがそれはいいのか?
つかエクセル関係ないからスレ違い
テンプレなくなってるんだな
zipがshellで処理されないOSって何?
2000とか98,98SEとか
>> 647 Windows 3.1+Excel 5.0の考慮も必要だね!
Windows8とか
>>643 × Set folder = m_shell.Namespace("c:\test.zip")
○ Set folder = m_shell.Namespace(FileName)
651 :
643 :2010/06/21(月) 23:37:34
>644 ありがとうございます。 残念ながら英語版しかないようですね。 >645 zipfldr.dllが解除されている場合とかでしょうか? >650 テストしたのをそのままあげてしまいました。 そこですが、fso.GetAbsolutePathName で取得したものを 渡さないと時々取得できないことがあるようです。 原因はさっぱりわかりません。
>そこですが、fso.GetAbsolutePathName で取得したものを >渡さないと時々取得できないことがあるようです。 >原因はさっぱりわかりません。 なぜだろうね
AbsolutePathNameじゃないからだろ
Stringで渡すとだめで、VariantならOKのようです。
Set folder = m_shell.Namespace((FileName))
それは意味ない
意味あったけど
659 :
デフォルトの名無しさん :2010/06/24(木) 19:49:57
初心者なんですが、皆さんの力を貸してください。 下記で困ってます。orz 【実現したいこと】 ワークシートにグラフを追加し グラフのX軸の目盛位置(wkChart.Axes(xlCategory).Left)ピッタリに四角シェイプを配置したい。 配置先は、グラフ内ではなくワークシート上。 【多分必要だと思うこと】 グラフ内の座標から、ワークシートの座標に変換する必要がある? 【試したこと】 グラフ内の座標==ワークシート上の座標でシェイプを追加したにもかかわらず 見た目上ズレている。 【コード】 'チャート内に四角シェイプを追加して選択 wkChart.Shapes.AddShape(msoShapeRectangle, 30, 100, 20, 30).Select 'ワークシート上に四角シェイプを追加して選択 ActiveSheet.Shapes.AddShape(msoShapeRectangle, 30, 100, 20, 30).Select
APIで座標を調べるのがあったな。
>>659 グラフ内の座標ってChart自体の (0, 0) から始まるわけじゃなかったような気がするけど、ひょっとしてそのこと?
wkChart.Shapes.AddShape(msoShapeRectangle, 30-wkChart.ChartArea.Left, 100-wkChart.ChartAreaTop, 20, 30).Select
ActiveSheet.Shapes.AddShape(msoShapeRectangle, 30, 100, 20, 30).Select
>>659 A1セルの大きさが基準になる。手順は以下。これで、(10,10)セルにグラフを移動とか出来る。
但し、全セルが同じ大きさであることが重要。
詳細は忘れたから調べてwww
@A1セルの大きさを変更 or 全セルの大きさを整える
AA1セルの縦横サイズを取得
B座標位置(左上位置になる)を指定する
663 :
662 :2010/06/26(土) 23:33:24
すまん。グラフの位置決めのことで、チャート内ではない。 まじすまそ
664 :
デフォルトの名無しさん :2010/06/27(日) 01:30:22
正規表現で置換するだけの処理なんですが上手くいきません ご教授願います Sub sample01() Dim re As Object, n As Object Dim Match As Object, Matches As Object Dim Val As Variant '配列 Dim i As Integer 'カウンタ Val = Worksheets("Sheet1").Range("A1:A5").Value Set re = CreateObject("VBScript.RegExp") For i = 1 To 5 Step 1 MsgBox "対象セルの文字列は" & "【" & Val(i, 1) & "】" re.Pattern = "\d{1}" '検索する正規表現パターン re.Global = True '検索範囲はグローバル re.IgnoreCase = True '大文字・小文字を区別する Set Matches = re.Execute(Val(i, 1)) '■HITしたらああああに置換↓ここが上手く動いてくれない■ Val(i, 1) = re.Replace(Val(i, 1), "ああああ" & i) 'Set re = Nothing Next i MsgBox i - 1 & "件マッチ!" End Sub
>>664 動いてますよ?
もしかして、ワークシートに書き込みたいのなら
Range("A1:A5") = Val
を最後に足しとけばOKかと
666 :
664 :2010/06/27(日) 02:07:06
>>664 だけでは説明不足だったので付け加えます
ソースの置換処理内容だけ見るとわざわざVBAでやる必要ない感じですが
実際は複雑な正規表現処理を入れる予定です
上記ソースよりも簡単に指定したセルを正規表現で置換できる処理がありましたら、
合わせてご教授頂ければと思います
667 :
デフォルトの名無しさん :2010/06/27(日) 02:24:08
>>665 おっしゃる通りでした
Range("A1:A5").Value = Val
でワークシートに置換した値が入りました
ありがとうございました!
所で、forのループ外で宣言している re をループ内で開放しちゃってるけど大丈夫?
あ、コメントアウトされてたのね。 老婆心ながら、setしたobject型変数は最後に開放しておいた方がいいよ。 end subのすぐ前でOK。
>>老婆心ながら、setしたobject型変数は最後に開放しておいた方がいいよ。 なんで? 不要だろ
ここから先しばらく不毛な論争が続きますので質問者の方は無視してくださいな
672 :
664 :2010/06/27(日) 15:51:40
Set re = Nothingを入れる事でメモリ解放するって事ですかね? 個人的にはそんな事より"A1:A5"の範囲ならまだしも セル範囲が増えた場合オーバーフローしないか心配です 何か良い方法ないですかねぇ 配列を使わずにセル範囲を一つ一つループで置換orスルーできるような処理があれば1番なんですが
Nothing入れないと自動変数の領域がキャッシュされてるため いつまでもオブジェクトが削除されないとかVB.netで聞いた事ある
.NETからExcelを操作した時のアウトプロセス解放関連の話と 勘違いしている予感。
COMのGCって参照カウンタでしょ。 それに反しなければわざわざリリースなんて要らん。
678 :
672 :2010/06/27(日) 16:26:01
>>674 ちょっとまだ試行中なのですが、例えば配列数を膨大な数にした場合や
各配列内のデータ(取得したセルの値)、文字数が多い場合等です
Variant型を超える事はないと思ってはいますが、
少し今のやり方だと心配なんですよね
>>675 キャッシュ(笑)
VB.net(笑)
適当なこと言ってんなハゲ
「行儀が悪い」 これならどうだ
681 :
デフォルトの名無しさん :2010/06/27(日) 18:46:33
煽りとかでは無くて純粋に教えてほしいんだけど、 setした物はnothingにして終わらせる、って教わったんだ。 当時聞いた話では、メモリを占有し続けるからって感じで納得してたんだけど、 これは嘘なのかな? マナーとしてnothingを代入してやるのか、それとも技術的な理由があるのか、それが知りたい。 nothing入れてやる必要が無いなら、余計なコード書きたくないし、教えてください。
>メモリを占有し続けるから これは嘘ではない
nothingを代入しなくて、その変数が生きていれば、メモリが開放されることはない nothingを代入しても、そのメモリがいつ開放されるかは定かではない nothingを代入しなくても、その変数が無効になれば、その領域は自動的に開放される 原則はこういうこと 昔は使い終わったらすぐにnothing代入して、開放可能にしましょうってのが主流だった 今は特殊なオブジェクトでもない限り、あんまり気にしなくていいと思うぞ
テンプレに書いてくれ 無駄なもの 最後にnothing 最後にerase とか 他にもあるんだろうけど
>>682-683 ありがとう。
俺、後輩にいつもnothingで終わらせろって言ってた・・・。
先輩の指導を鵜呑みにして、自分で調べなかったのが凄く恥ずかしい。
nothing忘れると、先輩が口を酸っぱくして指摘してたんで、そうと信じてた。
>nothingを代入しなくても、その変数が無効になれば、その領域は自動的に開放される
VBAの場合はend subを通った時点でdimが無効になるから、基本的にはset nothingいらないのかぁ・・・。
本当にありがとう。
SQLServerのJOBにActiveXスクリプト書くときは Nothingしないと警告でるよ
そういや、fjのmalloc/free論争はどう決着したんだっけなあ
>>685 俺は無駄なNothing代入はいらない派だが、またそうやって人の言うこと鵜呑みにするなよ?
VBAは参照カウント方式だから、参照がなくなった時点で自動的に解放されるが、
循環参照(オブジェクトAとBがお互いの参照を保持しちゃってるような場合)があるときは
明示的に解放してやらないとメモリリークする
とりあえずNothingで終わらせておけば問題は発生しないし思考停止できる、というのも一つの考え方ではある
俺も無駄なNothing代入はいらない派だが
>>688 メモリリークといっても、エクセルの使用メモリが増えていくだけで
エクセルを終了させれば開放される
>Nothingで終わらせておけば問題は発生しないし思考停止できる
ちなみに変数をNothingにしてもメモリリークは防げないこともある
Sub test()
Set x = CreateObject("Scripting.Dictionary")
Set y = CreateObject("Scripting.Dictionary")
Call x.Add("y", y)
Call y.Add("x", x)
Set x = Nothing
Set y = Nothing
End Sub
このプロシジャ呼ぶとちょっとずつメモリ使用量が増加していくぞ
だからさあ、いらないって言うやつは自分が作るときに使わなきゃいい いるってやつは自分が作るときに使えばいい わざわざ他人のコーディングを否定すんなよクズども いい加減この無限ループやめろっての ここまでテンプレ
質問スレだから 質問されたら答えるだけ 間違いを教えていいわけない 結論はどっちでもいいと答えるのかもしれないけど
692 :
デフォルトの名無しさん :2010/06/28(月) 09:06:38
全角英数字を半角英数字にする関数ってありますか? Case文で全文字毎に置換するしかないですかね?
はいいえ
695 :
デフォルトの名無しさん :2010/06/28(月) 11:02:28
>>692 記号もカナも、半角に変換できる文字は全部変換してもいいんならStrconv
英数以外は変換したくないんなら1文字ずつやるしかない
相互参照になった場合は?
二つの文字列で変換テーブルを構成して、 一文字ずつInStrで評価、ってのが定番か。
一文字ずつifで回せばいいんでない?
701 :
692 :2010/06/28(月) 21:05:33
>>696 なるほど、文字列内に全角記号や全角カタカナもあるので一文字ずつの処理になりそうです
文字列に規則性がないので正規表現も微妙です
一度全てストラコンブで半角にしてから一文字ずつ半角カタカナの文字コードを
全角カタカナの文字コードに置換するのが早いのかなぁ
素寅昆布 w
703 :
デフォルトの名無しさん :2010/06/28(月) 22:06:57
頭悪そうだから止めようぜ 昭和の屋ンキーみたいだ
>>701 1文字ずつやるとしても、文字コード使って判定させるよりは、
正規表現で判定させた方が楽でない?
1文字ずつ別の変数に格納していくルーチンで良いような気がする。
1文字ずつループで回して、0-9a-zA-Zで文字の範囲を判定してからStrConv
案ずるより産むが易し For i = 1 To Len(str1) c = Mid(str1, i, 1) If "0" <= c And c <= "9" Or "a" <= c And c <= "z" Or "A" <= c And c <= "Z" Then Mid(str1, i, 1) = StrConv(c, vbNarrow) Next
707 :
デフォルトの名無しさん :2010/06/29(火) 08:56:46
>>706 文字列にイコール以外の比較演算子が使えるのは盲点でした
比較演算子の部分を正規表現でスマートにしてもいけそうですね
ありがとうございました
教えてください。 以下のソースは、VBで書かれた、ネットワーク上のIPアドレスに対して、データ送受信をするものです。 これをExcel VBAで行うことはできるものでしょうか? Excel VBA自身はちょくちょくやっているのですが、 ネットワーク関係はやったことがなくて、 VBならVBAでもできないかな?という安易な発想で質問をしています(すみません) 宜しくお願いします。 VBのソース(関係ない部分は削除しましたので、このままでは動きません) Imports System.IO Imports System.Net Imports System.Net.Sockets Imports System.Text Public Class Form1 ' 特にクラスを使わなくても良いです。 Private Sub sendcmd(ByVal ipstring As String, ByVal Rcmd As Byte・・・・ Dim Xpsocket As Socket Dim xpstream As NetworkStream Dim Binwriter As BinaryWriter Dim Binreader As BinaryReader Xpsocket = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp) Xpsocket.Connect(ipstring, 30704) xpstream = New NetworkStream(Xpsocket) Binwriter = New BinaryWriter(xpstream) Binreader = New BinaryReader(xpstream) Binwriter.Write(Sdat) Binwriter.Flush() Xpsocket.Close() End Sub End Class
できる
出来る
わからん_| ̄|○
出来る
みなさん、ありがとうございました。なんか出来そうな感じで嬉しいです。 その後の調べで、「VB6のランタイムライブラリ」が必要 と言う情報を得ました。 私は、パソコン詳しくないし、VBは持っていないのでわからないのですが、 VB6のランタイムライブラリというのは、たぶんライブラリファイルですよね。 これはVB6を買わないといけない物なのでしょうか? それとも、コピーしても違法じゃないよ、というものなのでしょうか? ちなみにVB6って、売ってないんでしょうか。探しても見あたらないんです。
ランタイムライブラリというのはコピーしても違法じゃないよ >VB6のランタイムライブラリというのは、たぶんライブラリファイルですよね。 どっちかというと違う
715 :
デフォルトの名無しさん :2010/06/29(火) 14:36:02
教えてください XP + EXCEL 2000 長文のVBAをいじっていたら、formula bar と heading欄(A B C D ...)の間に =============日 ・ E F G H (heading欄) 上記(1)のようなオブジェクトがあらわれました。 日のなかの-(マイナス)をクリックすると F欄が隠れて 田 E G H となります。+をクリックすると(1)に戻ります。 この動作をマクロで録ろうとしましたが記録できません。 このオブジェクトの消し方と、現しかたを教えてください。
>>715 にちょいと便乗。
きっと、グループ化のことだと思われる。
単純に機能として削除したいのなら、「データ」→「グループとアウトラインの設定」で設定できる。
マクロは全てを解除する方法しかわからん。
シート内の2番目のグループのみを開くっていう方法あったら誰か教えてください。
718 :
717 :2010/06/29(火) 17:58:08
ちなみに、グループ化解除は Selection.ClearOutline もしくは、Range(範囲).Ungroupでできる。 開く、閉じるっていう動作がわからんです。
719 :
デフォルトの名無しさん :2010/06/29(火) 18:33:54
失礼します。range型変数にsetする際の挙動について教えてください。 Sub test() Dim WB1 As Workbook Dim WB2 As Workbook Dim Rng1 As Range Dim Rng2 As Range Set WB1 = Workbooks.Open("c:\book1.xls") Set WB2 = Workbooks.Open("c:\book1.xls") 'WB1.Activate 'アクティブにするとsetでエラー出ない 'Set Rng1 = WB1.Sheets(1).Cells(1, 1) 'Cells(1,1)ならエラー出ない Set Rng1 = WB1.Sheets(1).Range(Cells(1, 1), Cells(3, 3)) Set Rng2 = WB2.Sheets(1).Cells(1, 1) End Sub このようなコードで、開いたブックのrangeをsetしようとしているのですが、 range(cells(1,1),cells(3,3))の時は、対象のブックをアクティブにしないとエラーが出ます。 rangeを使わず、cells(1,1) のみであれば、アクティブじゃなくてもきちんとset出来ます。 rangeを使って指定する場合だけアクティブである必要があるのでしょうか? ヘルプを見ても分からなかったので、教えてくださいませ。 よろしくお願いします。
>>719 Cellsの前になにもつけなければActiveSheetに対しての意味になる
Cells(1, 1) と ActiveSheet.Cells(1, 1) は同じ
Set Rng1 = WB1.Sheets(1).Range(WB1.Sheets(1).Cells(1, 1), WB1.Sheets(1).Cells(3, 3))
とすべし
長くしたくなければ
With WB1.Sheets(1)
Set Rng1 = .Range(.Cells(1, 1), .Cells(3, 3))
End With
か
Set WS1 = WB1.Sheets(1)
Set Rng1 = WS1.Range(WS1.Cells(1, 1), WS1.Cells(3, 3))
721 :
デフォルトの名無しさん :2010/06/29(火) 22:58:42
>>720 ああ、ActiveSheetが規定値と言うイメージなのですか。
これですっきりしました。
やはり、Activeにして実行すべき物だったんですね。
本当にありがとうございました。
>Activeにして実行すべき物だったんですね。 違うだろ スクリプトで記述するときはActiveSheetなどに依存せず、処理の対象を明に指定しとけってことだろ
723 :
720 :2010/06/30(水) 00:17:16
>>721 >Activeにして実行すべき物だったんですね。
ちがう
そもそものエラーの原因は
WB1.Sheets(1)のセル範囲(Range)指定に他のシート(ブック)のセルを使ってしまうからエラーになった
シート(ブック)を"明示したもの"と"指定しないもの"を 混在してしまうとエラーの原因になる
また今回のような他のシート(ブック)を扱う処理となると
ActiveSheetに依存してしまうとやはりエラーの原因になりうる
と言う事で
Set Rng1 = WB1.Sheets(1).Range(WB1.Sheets(1).Cells(1, 1), WB1.Sheets(1).Cells(3, 3))
と示したように
WB1.Sheets(1) の Range(....
WB1.Sheets(1) の Cells(....
という風に全てどこのシート(ブック)かを明示した方がよいと言う事
724 :
デフォルトの名無しさん :2010/06/30(水) 02:33:48
Excel VBAのテキストエディタの TABをタイプしても、4スペースになってしまうのですが、 TABはTABとして保持するように設定出来ないでしょうか?
VBの設定で2文字にするか タブコードを2文字に置き換えるか
727 :
デフォルトの名無しさん :2010/07/01(木) 12:44:53
セルの範囲をString型変数に入れて利用する事が出来ないのですが、仕様何でしょうか? Dim targetCell As String targetCell = "Cells(8,1),Cells(30,83)" Worksheets("Sheet1").Range(targetCell).Value = "マムコ"
>>727 君は普段Excelで数式書くときもCells(8,1)なんて書いてるの?
セル範囲って種類のバリアントですので仕様です
730 :
727 :2010/07/01(木) 13:13:50
>>728 ワークシートのセル上で他のセルを参照する時は(A8)等ですね
>>730 じゃあtargetCell = "A8"って書けばいいんじゃないの??
"R8C1"でもいいけど。
733 :
デフォルトの名無しさん :2010/07/01(木) 17:35:44
よろしくお願いします。 記号の評価・比較って、コツがあるのでしょうか? 前方一致をしたいのですが、以下で失敗します。 記号で開始するのは失敗する「##」で始まるものだけで、 英語・数字・日本語の比較は正常に行えます。 記号を利用する場合、何か特別な処理が必要なのでしょうか? フィルタオプションでも、##から始まる文字列を取得することはできませんでした。 dim Str1,Str2 as string Str1 = "##TTT*" Str2 = "##TTTAAABBB" If Str2 Like Str1 Then MsgBox ("前方一致しています") end if
どうでもいいけど、Str1ってVariantになってない? 記号についてはコツとかではなく Like演算子のヘルプ開けば分かるでしょ。 LikeにカーソルあわせてF1押しなさい。
regexp使うのも良し
>>733 ヘルプ読んだ?
Str1 = "[##TTT]*"
737 :
デフォルトの名無しさん :2010/07/01(木) 20:43:10
>>729 なるほどCells自体が関数だからString型で呼び出せないんですね
つまり
Dim targetCellStart As String
Dim targetCellEnd As String
targetCellStart = "8,1"
targetCellEnd = "30,83"
'下のような指定の仕方なら可能って事ですね?
'Range.Cells(targetCellStart),Cells(targetCellEnd)="マムコ"
>>731 英字のセル指定を使わずに数字で指定したい理由は
その数字を利用してFOR文のカウンタを生成したいからです
英字から数字に変換するのが手間なので…
因みにわざわざ変数にしたい理由は、この座標がユーザサイドで指定できるようにする為です
738 :
デフォルトの名無しさん :2010/07/01(木) 21:31:12
>>717 , 718
ありがとうございます。
「データ」→「グループとアウトラインの設定」→ Clear Outline
で解消しました。
Shape オブジェクトのグループ化を何度も行うマクロをいじっていたので
すが、マクロのミスで列がグループ化されたということでしょうか・・・
>>737 横から失礼します
実行してみた? 希望した結果にならないと思うけど
>英字から数字に変換するのが手間なので…
そんなに手間かな
targetCellStart = "A8"
Target_row = Range(targetCellStart).Row
Target_col = Range(targetCellStart).Column
で変換できるけど
>英字のセル指定を使わずに数字で指定したい理由は
>その数字を利用してFOR文のカウンタを生成したいからです
指定した範囲に対して一セルづつ処理したいなら
targetCellStart = "A8"
targetCellEnd = "CE30"
For Each TargetCell In Range(targetCellStart, targetCellEnd)
'処理
Next
ってのもできるよ
741 :
740 :2010/07/01(木) 23:25:44
補足 変数TargetCell は Dim TargetCell As Range ね
>>737 英字から数字とか変なこと言うと思ったから、
R1C1形式も書いておいたのに…。
743 :
733 :2010/07/02(金) 12:15:27
733です。 皆さんどうもありがとうございました。#はワイルドカードだったのですね。。 リストは社内にあるPCから集めたアプリケーション名で配列なのですが、 今回は#を置換して、Str1 = "[#][#]TTT*"とすることにしました。 データ内にどんな記号がいくつあるかも不定なので、?や*についても処理しておきたいと思います。 正規表現についても、時間を見て勉強したいと思います。
744 :
デフォルトの名無しさん :2010/07/02(金) 13:08:44
>>740 一セルづつ処理をする部分で、どうやったら
そのセルの中身を取得できますか?
Dim TargetCell As Range
targetCellStart = "A8"
targetCellEnd = "CE30"
For Each TargetCell In Range(targetCellStart, targetCellEnd)
'処理
Next
デフォルトプロパティで.valueすらいらないな
>>740 range型変数なのにsetしなくても良いの?
A1形式だと大丈夫とか?
良く分からないんで教えてほしいの。
デフォルトプロパティは省略しない。 それが俺の流儀だーーーー!!!
749 :
740 :2010/07/02(金) 20:20:53
>>744 For Each を Excelのヘルプで調べてみよう(ぐぐってもいいけど)
>>747 上に同じ
750 :
デフォルトの名無しさん :2010/07/02(金) 23:08:05
初心者で申し訳ありません、たとえば A1〜A200に商品Aを作るための材料がそれぞれ記入、 B1〜B150に商品Bを作るための材料がそれぞれ記入されたデータがあります 商品A,Bの材料の中には共通するものがあり、それらを抜き出したいのです・・・ 現段階で @A1〜A200を切り取って、B150の下に貼り付け AC1に=countif(C$1;C&350,C1)を入力させて、それをC350までオートフィル Bオートフィルター使って、Aのcountifが"2"の値のやつだけ抜き出し、コピーしてD行に貼り付け CD行について、advancedfilter使ってunique:=trueを指定し、重複したデータを一つとして扱ってE行に貼り付け というのを作ったのですが、処理が多すぎて?非常に重く使い物になりません・・・ どなたかいいアイディアなどお持ちでないでしょうか?
751 :
デフォルトの名無しさん :2010/07/02(金) 23:09:39
すみません、Aは=countif(C$1;C$350,C1)です
>750 set d = createobject("Scripting.Dictionary") for i = 1 to 200 d(cells(i,1).value) = 1 next i j = 1 for i = 1 to 150 if d.exists(cells(i,2).value) then cells(j,3) = cells(i,2).value j = j + 1 end if next i
>>750 VBAじゃないきがするけどこんなんいかが?
どこまで軽くなるかしらないけどね
@C1に =IF(ISNA(MATCH(B1,$A$1:$A$200,0)),0,1) を入力させて、それをC150までオートフィル
Aオートフィルター使って、C列が"1"の値のB列だけ抜き出し、コピーしてD行に貼り付け
考え方として B列の材料と同じ材料がA列にあるかどうか判定すれぱいいんだから
(もちろんその逆でもいいけど)
(1)(4)しなくてもC1〜C150に=COUNTIF($A$1:$A$200,$B1)をオートフィルで 1のを抽出でいいんじゃない?
全然VBAじゃないけど、ソートして空きセルに1つ上と同じかどうかの式を入れて TRUEなもの抜き出すだけでは
756 :
750 :2010/07/03(土) 00:45:43
みなさんさまざまなお力添えありがとうございます 実際のデータはA1〜A10000やB1〜B20000などと桁数のずっと多いもので・・・ できたらcountifの記入やautofilterを使わないようなやり方があるといいのですが
そんなに件数あるんなら DAO 使ってSQLで抽出した方が早いのでは
A1〜A10000に商品Aのデータ B10001〜B20000に商品Bのデータ C列に=A1+B1と入れてC列でソート この方法なら一瞬でできる
760 :
750 :2010/07/03(土) 03:00:21
>>752 さんのプログラム使うと本当にあっという間に計算できました
set d = createobject("Scripting.Dictionary")
for i = 1 to 200
d(cells(i,1).value) = 1
next i
j = 1
for i = 1 to 150
if d.exists(cells(i,2).value) then
cells(j,3) = cells(i,2).value
j = j + 1
end if
next i
上記のcells(i,1)やcells(i,2)の1や2を変数に変えて、A行ーB行以外でも任意の二行で行えるようにしたいのですが
Dim myrows As Integer
Dim myrows2 as integer
myrows = selection.rows
myrows2 = selection.offset(0,1).rows
の様に変数を宣言しても(?)、cells(i,myrows)やcells(i,myrows)の様には使えないようです
無知で申し訳ありません、もしよろしかったらご指導願えないでしょうか・・・?
まず金輪際特別な理由がない限りIntegerを使うのを辞めなさい。 遅い上に最近のExcelだと行数すら桁あふれで格納できません。 代わりにLongを使いましょう。
>>760 myrows = Selection.Row
myrows2 = myrows + 1
列数に使用するカウンタ変数をintegerで宣言してるな、俺。
Excelっていまでも 最大255列65535行 じゃないのかな
どゆこと? 2007は16384列1048576行だよ
Excelっていまでも 最大255列65535行 じゃないのかな
VBAのデバッガでウォッチ式に変数を指定してオブジェクトの中身を見ようとしたとき コンテナの要素数が一定数以上だとツリーに現れないみたいなのですが 全要素を見たい場合どこでデバッガの設定を変更すればよいですか?
768 :
750 :2010/07/03(土) 13:03:28
みなさんご迷惑お掛けしました
>>760 で動かなかったのは、私がrowとcolumnを間違えていたからでした
以下の様に書き換えたところ、無事動かすことができました
本当にありがとうございました!
Sub 共通材料抜き出し()
Dim myrow As Long, myrow2 As Long, myrow3 As Long
Dim mycolumn As Long, mycolumn2 As Long, mycolumn3 As Long
myrow = Selection.Row
myrow2 = Selection.End(xlDown).Row
myrow3 = Selection.Offset(0, 1).End(xlDown).Row
mycolumn = Selection.Column
mycolumn2 = mycolumn + 1
mycolumn3 = mycolumn + 2
Set mydictionary = CreateObject("Scripting.Dictionary")
For i = myrow To myrow2
mydictionary(Cells(i, mycolumn).Value) = 1
Next i
j = myrow
For i = myrow To myrow3
If mydictionary.exists(Cells(i, mycolumn2).Value) Then
Cells(j, mycolumn3) = Cells(i, mycolumn2).Value
j = j + 1
End If
Next i
End Sub
いまだに、range型変数をsetしないで良い原理が分からない。
>>769 For Each のインデックス変数 のどこで SET を使えと?
>>769 Excelヘルプ VBAリファレンスより抜粋
For Each...Next ステートメント
配列やコレクションの各要素に対して、
一連のステートメントを繰り返し実行するフロー制御ステートメントです。
次の方法は Range プロパティで返されるセルのコレクションと
For Each...Next ループを組み合わせて操作します。
For Each...Next ループでは、ループで繰り返されるたびに、
オブジェクト型変数に次のセルが自動的に設定されます。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Setなんてデフォルトプロパティのために 生まれた単なる代入時に出現する歪だから 必要のない部分では文法的に削れてて当然。
>>744 の
targetCellStart = "A8"
targetCellEnd = "CE30"
で、range型変数に代入してるけど、setしてないんだけど、
これがOKとされてるのが分からないのよ。
イテレータでrangeコレクションを回してるなら、setの必要無いけど、
その前に、rangeに代入してる時にsetしてないのが凄く違和感あってさ。
日本語がおかしかった。ごめんね。 ×代入してるけど ○代入してるのに
どうみてもStringに代入しているようにしか見えないが
ぐは・・・俺がバカだった。 大恥晒してしまった・・・。 反省文レベルの大恥です。本当にお恥ずかしい。 スレ汚し、大変失礼しました。
777 :
740 :2010/07/04(日) 20:02:40
>>773 ,776
先日から
setしなくても良いのって聞いていたのこの事なの?
ずるって感じだわ
いいんだ… 誰にだって間違いはある… 大切なのは間違いを繰り返さないことだ… ____ /_ノ ヽ、_\ ミ ミ ミ o゚((●)) ((●))゚o ミ ミ ミ <Range型変数だっておwww /⌒)⌒)⌒. ::::::⌒(__人__)⌒:::\ /⌒)⌒)⌒) | / / / |r┬-| | (⌒)/ / / // | :::::::::::(⌒) | | | / ゝ :::::::::::/ | ノ | | | \ / ) / ヽ / `ー'´ ヽ / / | | l||l 从人 l||l l||l 从人 l||l バ ヽ -一''''''"〜〜``'ー--、 -一'''''''ー-、 ン ヽ ____(⌒)(⌒)⌒) ) (⌒_(⌒)⌒)⌒)) バ ン
779 :
デフォルトの名無しさん :2010/07/04(日) 20:12:00
>>776 晒し上げ
まぁ肩持つ訳じゃないけど、Stringに"A1"を代入するのは気持ち悪いね。
780 :
740 :2010/07/04(日) 20:17:49
>>779 気持ち悪いかもしれんが
もともとの質問者
>>737 が
>因みにわざわざ変数にしたい理由は、この座標がユーザサイドで指定できるようにする為です
って所から始まった事なので
781 :
デフォルトの名無しさん :2010/07/04(日) 21:55:37
前に Range("A1", Range("A65536").End(xlUp)).Copy 教えてくれた人にお礼言ってなかった、ほんとにありがとう!!!
Excel2000がフォアグラウンドであれば動くんですが、 バックグラウンドにするとCPU使用率が0になり、止まってしまいます。 escキーで中断してみると 「実行時エラー1004 アプリケーション定義またはオブジェクト定義のエラーです」 という表示が出ます。 別のパソコンのExcel2003で試したところ、バックグラウンドにしても動くのですが、 escキーで中断してみると、やはり、同じ場所で同じエラーの表示になります。 下はエラーが再現する範囲で無駄を削ったマクロです。 ここをこうすれば良いとか、 そもそも、エラーがあるのになぜマクロが動くのか? などについて、お気づきの点がございましたら教えてください。 Sub エラーがある部分() Dim i As Integer Dim U As Worksheet, S As Worksheet Dim PM As Variant Set S = Sheets("Sheet1") Set U = Sheets("Sheet2") For i = 1 To 1000 PM = Range(S.Cells(3, 1), S.Cells(502, 50)).Value Range(U.Cells(3, 1), U.Cells(502, 50)).Value = PM 'Escキーで中断するとここで止まる Next i End Sub
>>782 Range(U.Cells... の部分を
U.Range(U.Cells... に修正する。
PM = のところもPM = S.Range(に修正しておいてね。
786 :
デフォルトの名無しさん :2010/07/05(月) 20:13:28
EXCELの最終ページ(印刷プレビュー時)数は、取得は可能でしょうか?
Application.ExecuteExcel4Macro("get.document(50)")
>>782 「実行時エラー1004 アプリケーション定義またはオブジェクト定義のエラーです」
これは コード自体が悪いというより
range(U.Cells(3, 1), U.Cells(502, 50)).Value = PM
の処理途中で(全部書込みが終わらないうちに)
ESC(中断)が押されたから 発生しているんじゃないかな。
>バックグラウンドにするとCPU使用率が0になり
ここはわからん
789 :
デフォルトの名無しさん :2010/07/05(月) 21:14:54
左隣の行の最終列取得してそこまでオートフィル続けさせるの組んだんだけど、 データ数多くなるとかなーり重くなってしまう Dim mysel As Object, mycol As Long, mylr As Long Set mysel = selection mycol = selection.column mylr = selection.Offset(0, -1).End(xlDown).Row selection.AutoFill Range(mysel, Cells(mylr, mycol)) End Sub これ以上軽くするのは無理ですかね・・・?
790 :
デフォルトの名無しさん :2010/07/05(月) 22:19:03
selectionをobject型にsetしても動くんだね。 知らなかったです。
>>789 時間がかかってるのはAutofillの1行だけだから、これ以上軽くするのは難しいと思う
画面の書き換えを抑制しても変わらんだろうし
それよりも、変数myselの使い方が無駄すぎる
やるならせめて
mycol = mysel.Column
みたいにしないと
793 :
789 :2010/07/06(火) 10:35:54
文減らしてすっきりさせてみたけど、 sub テスト() selection.AutoFill Range(selection, Cells(selection.Offset(0, -1).End(xlDown).Row, selection.column)) end sub 速度に特に変わりはなかったもうだめp
オートフィルじゃなきゃ行けませんか? オートフィルさせる内容は書けませんか? 内容が分かればオートフィル以外の代替案を出せる人が居るかも知れませんよ
795 :
789 :2010/07/06(火) 12:14:33
>>794 countifだったり、ifだったり、averageだったりいろいろあるからなぁ
汎用性あってサクッと動く奴だったら最高なんだが
>>795 数式の内容によっては手動計算に切り替えてからオートフィルで少しだけ速くなるかもしれない
797 :
デフォルトの名無しさん :2010/07/06(火) 13:59:17
2つのプログラムを別々のExcelファイルで起動すると機能するのに、 1つのExcelファイルでSheet1・2に入力し起動すると片方がエラーになってしまいます。 エラーコードは400 どうしてでしょうか? 詳しい説明、ソースが必要ならば晒します
>>797 セル範囲を参照するときにワークシートの指定を忘れてる部分があるはず
799 :
デフォルトの名無しさん :2010/07/08(木) 11:41:44
Sheet1のA行に商品名、B〜U行ぐらいまでそれぞれの商品に応じた数値データ(商品名、データはすべて埋まっていて、10000行くらいある)の表がある Sheet2に、ある商品のリスト(1000人分くらい)があって、Sheet1からそれらのデータだけをオートフィルターみたいに抜き出したい scripting.dictionaryってitemに20行も登録できたっけ?
>>799 とりあえず行と列をちゃんと区別してくれないと、何の話かわからない。
Sheet2を順次みていって、該当するSheet1の情報を転記するだけだろ scripting.dictionaryをどうこうっていう意味がわからん VBAでやる意味はわからんが、このスレ的に考えて LOOKUP関数をVBAで実現したいってことじゃないのか?
802 :
デフォルトの名無しさん :2010/07/08(木) 12:06:46
ごめん、行はA〜Uまで、列が10000だった countifとかでもいいんだが、できたらSheet1は参照するだけでいじりたくない
803 :
デフォルトの名無しさん :2010/07/08(木) 12:20:26
vlookupでもいいんだが処理に時間がk
きちんと検索対象キーをソートして、 最後の引数をTRUEにすればVLOOKUPは早くなる。
806 :
799 :2010/07/08(木) 13:37:24
>>804 すまん、一度trueでやったんだが駄目だった
falseではうまくいった
807 :
799 :2010/07/08(木) 13:42:20
>>805 そうだった
日本語で躓いてたとは・・・
列と行がごっちゃになった時は、メモ帳を思い出すと良いよ。
列 って漢字に || が含まれてるから、列は縦に伸びる 行 って漢字に = が含まれてるから、行は横に伸びる
ただし、映画館やコンサート会場の座席表では列は横に伸びる
横書きの世界は横が行 縦書きの世界は縦が行
テキストは行 実世界は列
爆走兄弟 列&行
横一列にならんでください
縦一列に並んで下さい
横一列にならないでください
高さ方向に並んで下さい
丸刈りで
819 :
799 :2010/07/09(金) 09:07:05
なんかすみません・・・
>>810 向きは違うけど列はアルファベットでしょ
variant型の変数に二次元配列を格納してあって、 それをワークシートに一度に貼り付けると、量によっては時間がかなりかかるんだけど、 貼り付けの待ち時間にプログレスバーを表示したいのですが、どのような方法で実装すればよいのですか? Sub 適当なサンプル() Dim a(10000, 200) As Variant Dim i As Long, j As Long For i = 0 To 10000 For j = 0 To 200 a(i, j) = 1 Next Next Range("A1:GR10000") = a 'ここの処理の待ち時間にプログレスバー等を表示したい End Sub
はーいじゃあ二人組作っt
823 :
821 :2010/07/09(金) 13:16:25
どうでもいいことですが、 ループを0から始めてるので最後の貼付け範囲はRange("A1:GS10001")でしたorz
>>821 たとえば
For row1 = 1 To 10000 Step 100
Range("A" & row1 & ":GR" & row1 + 99) = a
Debug.Print row1 / 100; "%" 'この部分で進行状況を表示
Next
みたいに、処理を100分割してイミディエイトウィンドウに進行状況をパーセント表示する
あ、このサンプルはあくまでも例だから、実際は配列 a のサイズを変えなきゃいけないし 最後が10000じゃなくて10001だから端数が出た部分の処理は別にしなきゃいけない どっちにしても単一の代入文の進行状況を表示するのは不可能だから、何かしら工夫が必要。
プログレスバーコントロール使わないの?
827 :
821 :2010/07/09(金) 16:03:36
>>825 ありがとうございます。
処理を100分割してそれぞれの処理を実行するたびにプログレスバーに1加えていく(MAX100として)ってことですね。
確かに求めていたような動作にはなりますが、処理時間がかなり遅くなりそうな気がします。
イメージ的にはAPI等を使用して、Rangeに格納された容量(メモリ?)のようなものを取得し、
そのうちどれだけ処理が実行されたか、をプログレスバーに表示するようなことができないかと。
遅いPCで実行したときにエクセル下部のステータスバーに「フィル」というプログレスバーが表示されるのをフォームで実装できないかな、と思いました。
>>827 Rangeオブジェクトの内部が公開されていないので、かなり難しいでしょうね。
APIをフックして、たとえばmallocあたりが呼ばれたかどうかを調べたとしても、
進行状況を線形に把握するのはたぶん不可能だと思います。
それに経験上、この規模の処理なら100分割してもそれほど速度は変わらないと思います。
なんなら簡単なプログラムでベンチマークしてみればよいでしょう。
別の方法として、まず最初に簡単なベンチマークを実行し、 マシンの処理速度を把握した上で終了時刻を予測して、あとはタイマーで処理するという方法もあります。 不正確ですが利用者のイライラを低減させる効果はあるでしょう。 ファイルのコピーやダウンロードの残り時間の予想もけっこういいかげんですよね。
>>829 ファイルのコピーやダウンロードの残り時間の予想は確かに不正確だけど、
> 別の方法として、まず最初に簡単なベンチマークを実行し、
> マシンの処理速度を把握した上で終了時刻を予測して、あとはタイマーで処理するという方法
こんな途方もないいい加減さとは違う。
ダウンロード時間は刻々と変化する鯖の負荷等に左右されるから正確に予想するのは不可能 それと比べたら、パソコン内部だけで完結する処理の方が予想しやすい ただし、あまりにも時間がかかって、その間に別の作業を始められてしまうとお手上げだけど
CSVで書き出してデータの取り込みとか使ってみたら、 意外と早かったとか無いかなあ。単なる思い付きだけど。
たぶんディスク経由するよりは配列から直接ワークシートに書き込んだ方が速いと思う
834 :
821 :2010/07/09(金) 20:30:14
大容量の二次元配列データをシートに書き込むには、
>>821 で記述したやり方が一番速いと思っています。
(貼付け速度のみ。配列へ格納する処理は除く。)
それでも砂時計マークが出て、当方のPCだと上記のような簡単な処理でも10秒ほどかかってしまいます。
もちろん、他の常駐ソフト等の設定により処理時間はさらに増減するものだと思われます。
そこで、視覚的に(錯覚的に)処理時間を短縮したかのように見せられないかと思い質問させていただきました。
当然ながらApplication.ScreenUpdating=False程度はやった上の話だよね
>>834 > 大容量の二次元配列データをシートに書き込むには、
>>821 で記述したやり方が一番速いと思っています。
そんなことはない。
excelの大規模データインポート処理は十分最適化されているのに対して、>821のような
軽い処理が大量に繰り返される処理はほとんど最適化されない。
>>836 繰り返しループはただのテストデータの作成で
セルへの書き込みは最後の1行だけでしょ
200万セルの書き込みが10秒なら十分最適化されてると思うけど
昔はクリップボード経由が速かったけど今は違うの?
destination
840 :
821 :2010/07/10(土) 13:07:22
>>836 配列への格納の処理(for〜next)は適当に組んだだけです。
実際にはテキストファイル、CSVファイル等を加工したものを二次元配列に格納していますので、さらに大容量の場合もありますし、少ない場合もあります。
二次元配列を一気にワークシートへ貼り付ける方法についての話でした。
わかりにくかったようなので、再度書きます。
>>821 の場合ですと、For〜Nextで配列を格納させる段階でプログレスバー(MIN0;MAX10000)のValueを1ずつ増加させることはできますが、
そのあとの
>Range("A1:GR10000") = a
の1行の実行で、また10秒ほど(当方のPCでは)待ち時間があります。
その待ち時間をプログレスバーで表現できないものかと思い質問させていただきました。
(イメージ的には貼付ける際に表示されるステータスバーのプログレスバーのようなものです。)
(ブックを保存しているときに出ているような)
【今までのまとめ】
>>829 の方法
10秒という時間が固定であるなら、
>>829 のような方法で0.1秒ごとにValueを1増加させる(MAX100)方法もできるかとは思いますが、環境によっては大きくズレが出てしまいます。
また、取り込むファイルごとにベンチマークを行い時間を計らなければいけません。
>>825 の方法
再度For、Loop等で数行ずつ、もしくは数セルずつ貼り付けていく場合は貼付け本来の処理が遅くなってしまいます。
そこで、二次元配列aに格納された容量のようなものを取得し、その値をMAXに設定し、どれだけ貼付け処理(?)が済んだかでValueを増加させていくことはできないかと思っています。
841 :
840 :2010/07/10(土) 13:08:52
書き直し、書き直しってやってたら逆に読みにくい文章に・・・orz
改行コードが0D0Aじゃなくて0Aのファイルを1行単位にテキストファイルを 読み込んでセルに内容を反映したいのですが どうしたらいいの?
>>842 私ならファイル全部読み込んで配列に入れてなんとかする
varRecords = Split(.readall, vbLf)
844 :
名無しさん@そうだ選挙に行こう :2010/07/10(土) 15:36:50
エクセルでデータを管理したいのですが、保存時にxlsで保存するとデータが大きくなるので、保存はcsv、開くときはエクセルのフォームで 開きたいのですが、できますでしょうか? Private Sub CommandButton1_Click() ファイル名 = "TTT" '※1" ファイルの種類 = 6 '※4 xlTextPrinter Application.Dialogs(xlDialogSaveAs).Show arg1:=ファイル名, arg2:=ファイルの種類 End Sub --------------------------------------------------------------------------- Private Sub CommandButton2_Click() フルパス = Application.GetOpenFilename("*.csv,*.xls") '※2 If フルパス = "False" Then Exit Sub '[キャンセル]ボタンがクリックされた場合 Workbooks.Open フルパス End Sub
できるかできないかでいえばなんでもできるが できるからといってなんでもやってよいわけではない
>>844 コメントが間違っている
※4は xlcsv
xlTextPrinter は 36
847 :
名無しさん@そうだ選挙に行こう :2010/07/10(土) 16:02:19
>>846 どうしても元もフォーマット(罫線や幅)が無くなってしまいます。どうしたらいいでしょうか?
csvではなくxlsで保存する。
849 :
名無しさん@そうだ選挙に行こう :2010/07/10(土) 16:54:30
>>848 やはりフォーマットをそのまま残すにはxlsでないと駄目ですか?
850 :
844 :2010/07/10(土) 17:04:44
844ですが、例えば20行目〜30行目だけをcsvファイルに保存することはできないでしょうか? 何卒よろしくお願いします。
851 :
842 :2010/07/10(土) 17:09:30
>>843 いろい手段を考えてみましたが
結果そうしました、ドウモ
853 :
844 :2010/07/10(土) 19:19:17
>>852 データ容量がどうしても大きくなってしまうのでcsvで保存したいのですよ・・・
20行目から30行目だけcsvで保存して、読み込むときは入力どおりに出力したいのですよ・・・
無理です。ZIP圧縮かけたほうがまだ健全。
それならADOでデータ管理しとけと アクセスデータベースをエクセル制御すれば、エクセルで使うデータ量程度なら十分
>>853 854の言うとおり、ZIP圧縮が無難だな。
>>853 xlsとcsvファイル2つにそれぞれ保存して
xlsファイルを開くときにcsvファイルを取り込むように組めばいいように思うけど?
>>853 重いってのがどの程度を想定してるのか分からないけど、
XMLはテキストデータだから軽いかと思うよ。
テキストデータだからこそ重そうなんだが。 開始タグ終了タグ積んでるXMLは重量級。 グダグダ言わずに測れば分かるか。 「あ」が336個罫線とともに敷き詰められたデータを Excel2010(ベータ)で保存したらこうなった。 xlsx: 10.6KB xml(Excel2003 SpreadsheetML): 26.9KB
本当にデータ容量だけが問題なら フォルダを圧縮フォルダにでもすればいい話だよ。
ぶっちゃけた話、Excelで容量云々言ってる時点で、運用が間違ってると思うわ。
どの程度大きくなった結果、困っているのか聞きたい所だな。 単に貧乏性なのか、本当に肥大化しまくっているのかいまいち判らん。
>>859 そりゃxlsxはXMLをzip圧縮したものなんだからそうなるだろ
xlsxを解凍ソフトで解凍してみれ
XMLで保存しろって言われたからそうしたまでであって
もしかしてxlsxで保存したら解決じゃね?
a- a l a l ←「a」の範囲だけ行を選択 a l a- b a- a l ←「a」の範囲だけ行を選択 a- b 上のように「a」の範囲だけ行を選択したいです。 教えてください。
日本語でどうぞ
>>867 forで上から見て行って、ifで条件に合致した場合に処理をするのが基本だよ。
選択してから何をしたいのかが分からないけど、
unionのparramarrayに順次追加して、最後に処理するのはお勧め出来ない。
それをやりたがる人が多いんだけど、何か本とかに載ってるのかな?
>>867 こんなのでいいんじゃないの
Dim eachRange As Range, filtered As Range
For Each eachRange In [A:A] ' ここは好きな走査範囲選んで
If eachRange = "a" Then
If filtered Is Nothing Then
Set filtered = eachRange.EntireRow
Else
Set filtered = Application.Union(filtered, eachRange.EntireRow)
End If
End If
Next
filtered.Select
ちょっと考えたんですが、 1.上から「a」以外のセルの位置を吐き出す 2.6番目に「b」があったとすれば、1〜5番までの行を選択する といったやりかたでいいでしょうか? 今までは「a」を見つけて、「a」のセルを順次選択していこうと思ってたのですが・・・。
オートフィルタでaの行を選べばいいんじゃないの?
右側に1行目に1、2行目に2と連番うって その後にソートしてから、必要の行がまとまるので全部消せばよくね?
オートフィルタが一番良いと思うよ
場合にもよるが、適当にaやらbの列部分の範囲を選択して aをアクティブセルにしてCtrl+Shift+\したのち、 Ctrl+9するっていう手もあるよ。
選択したいって質問に対して、他のを削除するだの、非表示にするだの()笑
>>869 Unionは分ってない人が一見スマートに見えるからよく使うだけ。
あんな幾何級数的に遅くなるもの普通の人は使わん。
まぁ選択するんだったらオートフィルターだが、その後何するか分らんがオートフィルターはほとんどの場合最善じゃねー
やりたかったのはこういうことだったのだがね。 A1、A2を「データ→グループとアウトラインの設定からグループ化して」で表示・非表示を操作 bは表示したいからA3はそのまま A4、A5も「データ→グループとアウトラインの設定からグループ化して」で表示・非表示を操作 前 後 A A 1 a 3 b 2 a 3 b → 4 a 5 a 説明下手だから通じないかもしれないけど。
FOR TO NEXT でやるべきと思うけどなぁ だって、そのグループ化ってやつ、複数選択でやってみるとエラーになるし
880 :
デフォルトの名無しさん :2010/07/13(火) 23:19:19
VBAで使用する正規表現はVBScript以外を使用する事はできるのでしょうか? VBScriptだと正規表現の方言がJavaScript系なので弱い部分がある為、 別の言語で処理出来るようなライブラリ等があるのかなぁ、と思いまして
882 :
880 :2010/07/14(水) 08:05:22
>>881 まんこの中見る器具!(性器表現)
こいつはいい…今まで知らなかったぜ!
派手に暴れてくる!マジ助かった、Thank you
巣のつっこみがk
ファイルという変数に画像を取り込んで、エクセルの任意の場所に張り付けたいと考えています。 次のように、L5を選択し、そこからOffsetで指定した分だけずらして張り付けたいのですが、全然関係のない部分に画像が張り付けられてしまいます。 Range("L5").Select ActiveCell.Offset(Lc1_tate - 1, Lc1_yoko - 1).Select ActiveSheet.Pictures.Insert(ファイル).Select Selection.ShapeRange.LockAspectRatio = msoTrue Selection.ShapeRange.Height = 50 Selection.Name = File_Name ご教授をお願いします。
>>885 オブジェクトの位置を指定するには
左端または上端からの距離(Leftプロパティ Topプロパティ)を指定する必要がある
これでどう?
Dim Taget As Range
Dim X As Long
Dim Y As Long
Set Target = Range("L5").Offset(Lc1_tate - 1, Lc1_yoko - 1)
X = Target.Left
Y = Target.Top
With ActiveSheet.Pictures.Insert(ファイル)
.ShapeRange.LockAspectRatio = msoTrue
.ShapeRange.Left = X
.ShapeRange.Top = Y
.ShapeRange.Height = 50
.Name = File_Name
End With
おい!みんな来てここ(
>>886 ) みてみろよ!
天才がいるぞ、天才が!
あ、ありがとうございます!
>>886 ホントに涙が出てきた。。。
おい!みんな来てここ(
>>887 ) みてみろよ!
バカがいるぞ、バカが!
あ、ありがとうございます!
>>887 ホントに尿が出てきた。。。
確かに
>>887 の書き方じゃバカにしてるようにしか見えないなww
890 :
886 :2010/07/16(金) 20:40:02
スルーしてたけど 実際に 変数の定義が誤っているからしかたないかなと思ってたりする
ここは表現の添削もしてくれるスレか? 馬鹿にしているんじゃなくて、馬鹿はお前だろ?
>>890 ここは表現の添削もしてくれるスレか? 馬鹿にしているんじゃなくて、馬鹿はお前だろ?
日本語でおk
うん、確かに、これは日本語でおkなレベルy
関数vlookupで参照するとめちゃくちゃ重いんだが(行、列ともにデータが多い) VBAでもっと軽くする方法ない? 具体的には ・参照したいデータ数1000(列) ・参照元のデータ数30000(列)、アイテム数50(行)から
参照元はデータベースみたいになってます
vbaを捨てる
findで目的のセルをsetすれば良いんじゃない?
ほほう
自己解決
もともとソフトウェア自身に容量はあっても重さなんてないんじゃない?
重さは質量じゃなくて速度の意味で使われるね
>>896 お前列と行を勘違いしてるだろ?
30000行50列だろうが。
50列もあるのにVLOOKUPなんて考えるやつ、Excelにたいする適性がないからやめた方がいい。
>>899 はまだ見込みがあるかもな。
Findで見つけてResizeでまとめてと考えてるだろうし。
あきらめろっていう回答を待てるんじゃないんだよ。人だよじゃなくて、どうすればいいのか教えてやれよ。
あきらめろっていう回答を待てるんじゃないんだよ。どうすればいいのか教えてやれよ。
>>896 は釣り質問っぽいからこれ以上はやめとくかw
教えてください。 アドインで作ったマクロから Worksheets.Add before:=Sheets(1) Sheets(1).Select 上記マクロで作成したシートに Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) ws = Target.Value MsgBox ws End Sub を適用させるにはどうしたら良いでしょうか?
912 :
896 :2010/07/18(日) 00:03:43
荒れてるwwwwwwwwwごめんwwwwwww 参照先がラベル30000行、それぞれデータが50列くらいあってそれ全部参照するんだけど、しかたないからvlookupで作ってみた 自分が一度に調べるのは多くても5000ラベルくらいだからまあなんとかなりそうな感じ Do Dim i As Long For i = 1 To mycolumn ActiveCell.Offset(0, i).Value = Application.WorksheetFunction.VLookup(ActiveCell, myrange, i + 1, False) Next i ActiveCell.Offset(1, 0).Select Loop While ActiveCell <> "" みたいな感じで一応動いたから我慢するw
うん、それで我慢汁
>>910 アドイン側へ元となるコードを記述したモジュールを作成して
それを新規シートモジュールにコピーする方法はどうですか?
1)アドイン側へ作成 モジュール名:CopyModul
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
ws = Target.Value
MsgBox ws
End Sub
2)アドインで新規シート作成時
Set NewWs = Worksheets.Add(before:=Sheets(1)) '新規シート作成
Set OrgCM = ThisWorkbook.VBProject.VBComponents("CopyModul").CodeModule
Set NewCM = NewWs.Parent.VBProject.VBComponents(NewWs.CodeName).CodeModule
NewCM.InsertLines 1, OrgCM.Lines(1, OrgCM.CountOfLines)
915 :
896 :2010/07/18(日) 00:49:49
せっかくなのでもうひとつ質問させてもらってもいいですか? vlookupの検索条件をfalseからtrueに変えると計算早くなるみたいなんですが、 近似値検索だと万が一でも間違った参照をしてしまうことってありますか? ラベルがアルファベット+数字ごちゃまぜなんで、いざ間違ってても確認しにくいんです・・・
>>914 わかり易く教えていただきありがとうございます。
CodeModuleの存在をはじめて知りました。
ただ・・・
「Visual Basic プロジェクトへのアクセスは信頼性に欠けます」というエラーを回避するようにしても、
低スペックのためか、なぜかエクセル自身のエラー→自動回復になってしまってうまく動きません・・・
この問題を解決して、教えていただいたマクロを利用しても良いのですが、自分だけでなく、会社で複数のPCに
アドインを入れたいと思っているので、アクセス許可がちょっと気になります。(デフォルトで許可にチェックが入っていないため)
アドインの中のマクロでシートを作成して、作成したシートをダブルクリックした時にvalueを返したいのですが、
他に良い方法はないでしょうか?
勉強不足のため、イベントプロシージャでしかできないのか、イベントプロシージャを作成するならCodeModuleを利用しないと
いけないのか判断できなくて申し訳ないのですが、教えていただけたらと思います。
917 :
914 :2010/07/18(日) 02:02:42
>>916 シートモジュールにコードを直接書込みたかったのでCodeModule使っただけ
普通は使わない
エラーでるなら止めておいたほうがいいかも
後は
アドイン内のクラスモジュールでイベントを拾えばいいんだろうけど
なにもしないと全てのシートに適用されしまうので新規作成したシートをどう識別するかが問題
>>915 近似値なんだから、完全に一致はしていない行を参照する可能性は当然あるよ。
VLOOKUP+IFの二段構えでチェックとかすれば良いのだろうけど、
計算コスト的にどうなのかは一寸判らないな。
あと、検索アルゴリズムに二分探索を使うから予めソートされていないと駄目だな。
919 :
914 :2010/07/18(日) 02:42:13
>>916 別の視点から考えてみた
1)アドインブックへ新規作成状態のシートを作成
2)そのシートモジュールへ例のコードを記述
3)シート新規作成ではなくシートコピーする
ThisWorkbook.Sheets(1).Copy Before:=Sheets(1)
920 :
916 :2010/07/18(日) 11:47:55
>>919 本当、ありがとうございます!
許可も不要だし、イベントもうまく動作しました。
すばらしい発想でした。
自分ではとても思いつかなかったので、とても助かりました。
最後にもう一言。
ありがとうございました。
画像の時点で回答する気がなくなる しかも課題だし
本当に分からなかったもので・・・すいませんでした
素直に電磁気学が分からないって言えよ 俺は位相とかもう完全に忘れた
開いたら完全にふざけてるわ
お前これ基礎すらわかってねえだろ
∩___∩ | | ノ\ ヽ | / ●゛ ● | | | ∪ ( _●_) ミ j 彡、 |∪| | J / ∩ノ ⊃ ヽ ( \ / _ノ | | .\ “ /__| | \ /___ /
私のせいで荒れちゃってホントにすいませんでした
荒れてるの? もう二度とレスしないか、ちゃんと書いて質問するかどっちかにしろ
やなこった。偉そうにするんじゃねぇよ。一回も回答したことないくせに。
なんで宿題代行してやんなきゃいけないんだよw しかもただの計算だけじゃねーか
なんでって、ここ、質問スレだろ? お前にとっては、ただの計算かもしれんが、俺には難しんだよ。 答えられねぇくせにしゃしゃり出てくるんじゃねぇよ。
ここは、Excel 「VBA」の質問スレ、な。
>>932 数式自体の意味が難しくて分からないなら
VBAどころか Excelうんぬん以前の問題
質問する場所が違うってことじゃね
この間、回答なし。
>>933 わかってるよ。だからどうした?
>>935 いっぱ〜つぅ!
>>936 数式の意味はわかってるよ。 俺がわからないってどこに書いてあるんだよ。勝手に判断するな。
っていうか出先で携帯だから読めない 逆ギレしちゃうお子チャマは2ちゃんしないでママのオッパイでもしゃぶってれ
数式は分かってるけど 932>お前にとっては、ただの計算かもしれんが、俺には難しんだよ。 って事ね 本当に分かってるって言わないと思うけどね
えーと 何をどうしたいの? 問題解いてやればいいの? VBA書いてやればいいの? 構ってやればいいの?
ホントスレチな質問しちゃったせいですいません
>>930 とかは私じゃないです。変なの沸かせちゃってすいませんでした
>>938 >>934 にもコメントしてやれよ。 なにが言いたかったのかは俺にも不明だが。
あと、アンカーも打てねぇやつは他で練習してから書き込めよ。
俺の質問は、他のスレで解をもらったから、すでにどうでもいいんだけどね。
ぐらいちゃんと打てるようになるまでROMってろよ
ここまで俺の自演
946 :
デフォルトの名無しさん :2010/07/19(月) 21:03:45
VBAでIE操作関係をググっていろいろ調べているんだが 三流君のサイトばっかでてきてうぜぇぇぇぇぇぇぇ(笑) 三流君のサイトはごちゃごちゃして結局問題解決したことないわw
-"三流" オプション付けてぐぐればいいんだっけ
2次元配列への代入について質問です。 例として、A列に大量のデータが存在するとします。 これをVariant変数使って一気に2次元配列に代入する場合なんですが、 Dim C as Variant C = range("A1:A" & range("65536").End(Xlup).row) 上記で代入はできますが、A列に1セルのみ値が書き込まれている際にエラーが出てしまいます。 これを回避する方法が分かる方いましたらお願いします。
配列にして数をセル数と合わせてからほおりこむ
>>948 本当に動いているのか?
C = Range("A1:A" & Range("A65536").End(xlUp).Row)
A入れないと動かないと思うが・・・
>>948 なんか響かないようだから949の補足だ
セル数が1個だったら
redim c(1 to 1,1 to 1)
c(1,1)=範囲.value
2個以上のときはc=範囲.valueとすりゃいい。
みっしりデータが入ってるなら、 c = range("a1").currentregion.columns(1) でいいのでは。 でも、なんで二次元配列に入れたいのだろうか。
>>950 一応動くのですが、1セルの場合、空白の場合の処理を入れていない為
一つ一つ例外処理を入れていこうかと思いまして…
>>952 二次元配列=高速化とWebで見てしまった事とPCのスペックが低いので代入は2次配列で行っています。
データ量は10〜300行程度なのですが無駄なのでしょうか。
>>949 >>951 初期化の際のエラーは出なくなりました、ありがとうございます。
ただ、ひとつ問題が発生してしまいまして、A列にデータが1つの場合ですが
Ubound(C,1)で『型が一致しません』のエラーが出てしまいます。
Msgbox C ではセルのデータは表示されるのですが。
A列に複数データの処理では問題なくコンパイルされました。
処理の流れですが、
@ワークシートに予め記載されているA列のキー値を配列に代入
Aワークシートには書式設定(セル結合など)がありエラーの元になると面倒なので、Cells.Clearで一旦削除
⇒ここで削除するため配列などにデータ全部格納しておきたいと思いました。
Bキー値を元に別シートから参照データ引っ張ってきています。
↑ 君のその報告こそどうでもいい事なんだが
>>953 お前
>>949 と
>>951 の意味分ってるか?
こんなことだ
Dim c As Variant
With Range("A1", Range("A" & Rows.Count).End(xlUp))
If .Count = 1 Then
ReDim c(1 To 1, 1 To 1)
c(1, 1) = .Value
Else
c = .Value
End If
End With
For i = 1 To UBound(c, 1)
'処理
Next
セル1個でもエラーにならないだろ?
それから結合セルの話はしないでくれな。
俺はアレルギーで蕁麻疹が出るから。
すまん、セル結合を解除してたのか。 それは良いことだ。
>>955 ぐあああ出来ました!!!
.Count使うとは思いませんでした。エラー対応が全くなかったので助かりました。
構文なども書いてもらえて自分との違いが分かり勉強になりました。
長文付き合って下さり本当にありがとうございました。
958 :
デフォルトの名無しさん :2010/07/22(木) 00:41:16
はじめまして。
どうしてもわからなかったので質問させていただきます。
「閉じているブックのシート一覧を読み込む」です。
OpenFileName = Application.GetOpenFilename("Microsoft Ecel ブック,*xls")
で読み込んだファイルのシートをString型【str(配列数)】に読み込みたいです。
このサイトが近いかなぁ、と思ったのですが、うまく実装できませんでした。
http://officetanaka.net/excel/vba/tips/tips29.htm よろしくお願いいたします。
条件付き書式設定について質問です。 セルの値が〜 と 数式が〜の2つのパターンがあると思います。 以下、例としてですが @セルの値が〜 C2セルの値が あああ ならば、文字を赤色 C2セルの値が いいい ならば、文字を青色 に設定し、 A数式が〜 C2の値が あああ ならば、背景色を灰色 C2の値が いいい ならば、背景色を青色 のような設定したいのですが、マクロですとどのように記述したらよいか 教えて頂けないでしょうか。
>>960 操作を記録してやってみましたが、どうしても記録したサンプル+Webだけですと
Rangeオブジェクトを使用したパターンで成功してくれません。
参照先を固定したRange("B2")とかではなく、オフセットの値によって
条件付き書式を設定したいのですが。
Dim rOb as Range
rObj.Offset(0, 1).Select
With Selection
.FormatConditions.Add Type:=xlExpression, Formula1:= _
''''ここで、基準セルの右のセルが文字列"あああ"であるならば、カラーを設定したいです。
"=IF(rObj.offset(0,2)=""あああ"",1)"
.FormatConditions(1).Interior.ColorIndex = 15
end with
オフセットだけの話なら別にVBAで頑張らなくても INDIRECT(ADDRESS(ROW(), COLUMN()+2)) とかで現在セルから2つ右とかはみられるよ。
最終セルからendxlup参照の話題何回出れば気が済むんだよw
>>963 INDIRECT使う必要あるか?
A1の条件付書式なら=C1="あああ"とかで大丈夫だろ?
>オフセットだけの話なら >オフセットだけの話なら >オフセットだけの話なら
A1に対するC1もオフセットだがアホか? 数式でR1C1形式にしてみりゃすぐわかる。
ん?反論がなければ俺の勝ちだが?
夏休みだねぇw
つぎすれまだー?
972 :
962 :2010/07/23(金) 02:05:42
>>963 回答ありがとうございます。
試してみたのですが、条件付き書式設定をした基準セルを元に
数か所の行、列のセルを判定させる予定でしたので断念しました。
情報提示不足で申し訳ないです・・・
条件付き書式について理解不足だったのもあり失礼しました。
無意味に色々機能を使ってると実感しましたので少々勉強してみます。
973 :
デフォルトの名無しさん :2010/07/23(金) 12:05:16
別のエクセルシートで作ったVBAコードをコピーして一括管理のシートに移し替えたんですが、 コンパイルエラー、Function または変数が必要です。って出るようになって使えない 元のシート上のやつはちゃんと動くのに、どういうことですかね・・・? subを変えてみたりもしたんですがだめでした
コード晒すのが早道純
守秘義務があるのでできません
はぁそうですか。ご愁傷様です。
>>973 みたいなのって、
そんなことの原因も割り出せないでどうやって暮らしてきたの?
質問に答えなくて悪いけど素直に疑問。
>>973 会社の同僚に聞け。
聞く奴がいなけりゃ自分で勉強しろ。
エスパー 他のモジュールを写してない
エラーが出た箇所と同じところを元のものから探してポイントし、Shift+F2を押す。
981 :
デフォルトの名無しさん :2010/07/23(金) 16:06:18
それよりラップトップで無限ループ陥った時の脱出方法頼む Ctrl+Break無いし、Esc押しても止まらんし、しかたなく強制終了したら作ってたの全部消えたorz
Windows+U → ソフトウェアキーボード
それ便利だな。 いつも×ボタン連打とかタスクマネージャーから頑張ってころしてた。
たぶん、よくみればbreakキーがみつかる
ラップトップならBreakキーはどこかにあるはず ネットブックだと本当に省略されてるから困る
次の実行結果を教えてくれ。 OSとExcelのバージョンもよろしくな。 できるだけ色々なバージョンの結果を求む。 Sub 並び替え() With Range("A1:A4") .Value = [{"一番"; "一〇番"; "一番"; "一〇番"}] .Sort key1:=.Item(1), order1:=xlAscending, Header:=xlNo, _ Orientation:=xlTopToBottom, SortMethod:=xlStroke End With End Sub Vista & Excel2007は下だが2003とかも同じか? 一〇番 一〇番 一番 一番
一番 一〇番 一番 一〇番 xp+2003
一〇〇番 一〇〇番 daskin
それを言うならduskin
>>987 サンクス、やっぱそうなるのか。
>>988 ダスキンは俺も使ってるけど、俺のダスキンで掃いてもそうならないなぁ。
誰か他の組み合わせ求む。
OSは関係無しかも知れないけどXP+2007とかVista+2003とかいない?
991 :
デフォルトの名無しさん :2010/07/24(土) 12:07:27
1.ExcelAにあるVBAでファイル選択ダイアログを出し、任意ExcelBファイルを開いて貰う 2.画面に開いたExcelBが表示 3.ExcelBに対して処理を実行する 4.(処理内容)各セルの値を調査する(この処理は実装済み) 1〜3を実装するにはどうすればいいでしょうか?
>>991 ダイアログで選択してもらう時に、対象のブックを変数に代入しておけばいい。
そうすりゃ開くだけじゃなくて、処理対象も、閉じる対象も全部明確化出来る。
994 :
991 :2010/07/24(土) 23:38:56
肝心なところが抜けてました 選択したブックを変数にして処理をするのは理解できました しかし、その選択したExcelファイル内のシートもユーザに選択させたいのですが、 何かいい手はありますでしょうか? 該当ブックのシート名を全て取得し、選択ダイアログ等にするのは微妙です ユーザに普段Excelを使う時のように各シートを自由に開ける(遷移する)ようにした上で 該当シートでマクロを再開(メイン処理)させたいのです 流石に再開させるトリガフラグが不明確過ぎで無理ですかね? 例えばユーザが各シートに切替えた時に「このシートに対してメイン処理を実行しますか?」とダイアログが 毎回出るようなトリガフラグ判定とかできませんかね?
>>994 最初に外部Excelを開くとき、
「まず使用するシートを選択し、次にXXX(呼び出し元プログラムのどこかのボタン)を押してください」
みたいなメッセージを表示するだけじゃだめなの?
ボタンが押されたら現在アクティブなシートを処理するだけ
996 :
991 :2010/07/25(日) 00:42:38
>>995 なるほど、処理を最初から2つに分けて
1つ目の処理はファイル選択ダイアログとアラートのみで
2つ目の処理でアクティブシートにメイン処理ですか
この2つの処理って、1つ目の処理でのファイル選択ダイアログで開かれたファイル名を
2つ目の処理のトリガが発生する前に2つ目の処理に引数として渡すって事ですか?
そんな事出来るんですか?
次スレたて たのみます
998 :
デフォルトの名無しさん :2010/07/25(日) 17:19:08
999 :
デフォルトの名無しさん :2010/07/25(日) 17:19:13
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。