Excel VBA 質問スレ Part15
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2010/04/15(木) 01:07:1901 http://pc11.2ch.net/test/read.cgi/tech/1054356121/
02 http://pc11.2ch.net/test/read.cgi/tech/1168308855/
03 http://pc11.2ch.net/test/read.cgi/tech/1180192018/
04 http://pc11.2ch.net/test/read.cgi/tech/1189814602/
05 http://pc11.2ch.net/test/read.cgi/tech/1197448064/
06 http://pc11.2ch.net/test/read.cgi/tech/1205231499/
07 http://pc11.2ch.net/test/read.cgi/tech/1212587819/
08 http://pc11.2ch.net/test/read.cgi/tech/1219673793/
09 http://pc11.2ch.net/test/read.cgi/tech/1228372971/
10 http://pc12.2ch.net/test/read.cgi/tech/1235332603/
11 http://pc12.2ch.net/test/read.cgi/tech/1241885130/
12 http://pc12.2ch.net/test/read.cgi/tech/1247566074/
13 http://pc12.2ch.net/test/read.cgi/tech/1254281104/
14 http://pc12.2ch.net/test/read.cgi/tech/1262748898/ ←New!
関連スレ
Excel総合相談所 91
http://pc11.2ch.net/test/read.cgi/bsoft/1270542226/
Word総合相談所
http://pc11.2ch.net/test/read.cgi/bsoft/1263719084/
【質問不可】Excel総合相談所スレの雑談・議論スレ2
http://pc11.2ch.net/test/read.cgi/bsoft/1151651536/
0002デフォルトの名無しさん
2010/04/15(木) 01:11:010003デフォルトの名無しさん
2010/04/15(木) 07:05:02If 2 < X < 14 And 2 < Y < 14 Then
Label1.Visible = True
Else
Label1.Visible = False
End If
End Sub
ワークシート上に配置したコマンドボタン(縦、横共に大きさ15)
上にマウスがある場合はラベル1を表示。
ボタンの端にある場合は非表示にしたいのですがうまくいきません。
(わけあってユーザーフォームは使わずに作りたいのですが。。。←ユーザーフォーム上はmousemoveイベントがある)
透明なラベルを後ろに配置し、そこにマウスが乗った時に
ラベル1を非表示にすることはできましたが、
透明なラベルをクリックすると見栄えが悪いので上記の方法を取り組んでいます。
よろしくお願いいたします。
0004デフォルトの名無しさん
2010/04/15(木) 08:38:370005デフォルトの名無しさん
2010/04/15(木) 08:57:49イベントはあるんだっけ?
まぁあったとして、それじゃあマウスの移動速度依存だよ
.netなら入ってきた、出ていったイベント使えるけど。
だから他のコントロールと連携してマウスの動きを監視するとかしないと期待する結果とはならないです。
オレだったらそのイベント1秒後にAPIでマウス座標取るようにするかな、OnTimeで。
0006デフォルトの名無しさん
2010/04/15(木) 12:35:35× 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の場合は常に真になる。
0007デフォルトの名無しさん
2010/04/15(木) 12:48:450008デフォルトの名無しさん
2010/04/15(木) 12:50:20A列の一番下の行の下に表示させたいと思っています
(日記で天気を入力するような感じです
晴れ曇り雨ボタンを作成して、それぞれを記入する感じです。
またこの先も追加される可能性があります)
こういった複数のボタンの動作をまとめることは可能ですか?
それとクリックイベントとダブルクリックイベントもまとめたいのですが、可能でしょうか
連続で押すとダブルクリックとみなされてしまいイベントが発生せず困っています
'この三行を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
0009デフォルトの名無しさん
2010/04/15(木) 13:45:50VBAでは無理。ずらっと並べて書くしかない。VBだとまとめられるんだけどねえ。
0010デフォルトの名無しさん
2010/04/15(木) 23:13:58クラスモジュールを使ったらどう?
>クリックイベントとダブルクリックイベントもまとめたい
未対応です(クリックイベントのみです)
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
0011デフォルトの名無しさん
2010/04/16(金) 01:40:41これまではCをやってきたので、その違いに戸惑っています。そこで教えてください。
1
見やすいソースになるように、TABを使って自分なりの整形するのですが、
次の行に移ると、勝手にレイアウトが変えられてしまいます。
普通のエディタのようにレイアウトを保持することは出来ないでしょうか?
2
TABが、半角スペース4つになってしまいます。TABを保持させるには、
どの設定を触れば良いでしょうか?
3
変数宣言をしないとコンパイルエラーを起こすように出来ないでしょうか?
1文字タイプミスしても変数として動作するため、ちょっと心配なんです。
4
予約語の先頭が大文字になってしまうのですが、これを止めることは出来ないでしょうか?
5
複数行をコメントアウトするのに、行選択してボタンを押すようですが、
/*
*/
のような記述はできないでしょうか?
6
セルを指し示すとき、Cells( y, x )で指示するようですが、
Cells( x, y )のようにすることは出来ないでしょうか?
以上です。宜しくお願いします。
0012デフォルトの名無しさん
2010/04/16(金) 02:04:17(1) できない
(2) 変えられない
(3) モジュールの先頭にOption Explicitと書く
(4) できない
(5) できない
(6) できない
座標がy, xになるのはExcelに限らず表計算ソフトのルールだから慣れるしかない。
それにy, xじゃなくてr, cと覚えた方がいい。
ソース関連は別のエディタで書いてコピペするぐらいしか根本的な解決方法がない。
VBAはあくまでもVBのサブセットだから制約がかなり多い。VBAである必要性がないのならVBを使った方がいい。
0013デフォルトの名無しさん
2010/04/16(金) 02:10:40たとえばIfをifにしたい時はdim if [Enter]と入力してからこの行を消去する。
そうするとエディタが一時的に「if」というキーワードを記憶してくれる。
とても実用的な方法ではないけどね。
0014デフォルトの名無しさん
2010/04/16(金) 09:20:240015デフォルトの名無しさん
2010/04/16(金) 10:08:39みなさん、ありがとうございます。よくわかりました。
慣れるしかないって感じですね。
エディタのツール→オプション→編集のところに「変数の宣言を強制する」というチェックボックスがありました。
これは、>>12のご回答「(3) モジュールの先頭にOption Explicitと書く 」と
同じ効果がありそうな、感じがします。
>VBAである必要性がないのならVBを使った方がいい。
VBにすると、私の質問の多くが解決されそうでしょうか?
特にTABの保持が実現できるなら、VB買おうかなと思います。
アプリを1から作るためのVBではなく、
トレース実行など、現在のVBAのようにExcelとの連携が密にできて、
Excel付属のVBAの使いにくさが解決できるなら、ぜひ買いたいです。
0016デフォルトの名無しさん
2010/04/16(金) 10:38:47ご希望のとは違うし、これが2000でも使えるかどうかは知らんけど
VBEのコードを簡単にコメントブロックする方法
http://officetanaka.net/excel/vba/tips/tips04.htm
0017デフォルトの名無しさん
2010/04/16(金) 11:48:08うぉーーー、これは便利です。
さっそく取り入れました。キーボードから手が離れないのが素晴らしいです。
これはいいです。ありがとうございました。すばらしい。
ちなみに、初心者質問させてください。
C言語などで言う「#include "hoge.c"」のような、ソースファイル組み込みは
VBAでできるでしょうか?
単にその位置に別ファイルのソースを挿入するだけの機能です。
1つのボタンでの処理が長くなってきたので、別ファイルに分割したいと思っています。
subにしてもよいのですが、変数をpublicで宣言したりとか、結構手間そうなので。
includeというキーワードで検索したのですが、見つけられませんでした。
0018デフォルトの名無しさん
2010/04/16(金) 12:01:050019デフォルトの名無しさん
2010/04/16(金) 12:09:50すごいページを見つけましたので、貼っておきます。
http://www.ne.jp/asahi/hishidama/home/tech/lang/index.html
こういうのが欲しかった、みたいな。素晴らしいページです。
このページに依れば、VBAには、#includeは無いみたいです。
ありがとうございました。
>そもそも#include "hoge.c"とかやるのが筋が悪い
そうなんですけど、
関数化で階層化すると、スタックの待避や復元などのオーバーヘッド時間で
処理が遅くなることもあるので、1関数内に書いてしまう私です。すみません。
0020デフォルトの名無しさん
2010/04/16(金) 12:43:520021デフォルトの名無しさん
2010/04/16(金) 13:22:400022デフォルトの名無しさん
2010/04/16(金) 13:29:37エクセルはPCなので関係ありませんが、
記述スタイルを踏襲したいんです。
0023デフォルトの名無しさん
2010/04/16(金) 14:22:260024デフォルトの名無しさん
2010/04/16(金) 14:26:570025デフォルトの名無しさん
2010/04/16(金) 15:25:520026デフォルトの名無しさん
2010/04/16(金) 16:31:150027デフォルトの名無しさん
2010/04/16(金) 16:54:02複数の環境を使い分けられない人間はプログラマーをやる資格がない。
0028デフォルトの名無しさん
2010/04/16(金) 22:25:21知識として持っててあたりまえのことを質問する馬鹿が増えた
0029デフォルトの名無しさん
2010/04/17(土) 13:12:27変数の宣言位置を揃える古臭い書き方でもしてるのか?
0030デフォルトの名無しさん
2010/04/17(土) 13:18:020031デフォルトの名無しさん
2010/04/17(土) 13:18:44もちろん固定幅フォントにする必要はあるが
0032デフォルトの名無しさん
2010/04/17(土) 19:52:46sub ○○を
標準モジュール、module1に記述しています。
ボタンを作ってクリックすればマクロが動かせると言うことで、
sheet1にボタンを作って、clickにて動くようにしたところ(コードはsheet1に移動)
rangeコマンド等が、sheet1を書き換えるようになってしまいました。
sheets("sheet2").select
range("A1").value = hogehoge
みたいな感じにして、従来はきちんとsheet2のA1に数値が入っていたのですが、
sheet1のA1に数値が入るようになってしまいました。
with sheet1のような感じになっているのですが、
どのように対処すればいいでしょうか?
0033デフォルトの名無しさん
2010/04/17(土) 20:00:250034デフォルトの名無しさん
2010/04/17(土) 20:03:150035デフォルトの名無しさん
2010/04/17(土) 20:46:39その説明では状況がまったくわからないので答えようがない
0036デフォルトの名無しさん
2010/04/17(土) 22:03:540037デフォルトの名無しさん
2010/04/17(土) 22:05:30range("A1").value = hogehoge
のコードもsheet1にあったりする?
この状況だと対策は
Rangeへ シート指定する
or
コードを標準モジュールに戻す
0038デフォルトの名無しさん
2010/04/17(土) 23:47:36それぞれのモジュールで
MsgBox Range("a1").WorkSheet.Nameとしてみな。
0039デフォルトの名無しさん
2010/04/18(日) 01:39:24>TABの保持にこだわる理由が分からん
キミにはわからないだろうな、きっと。
00401/2
2010/04/18(日) 02:05:26しかし、無駄な記述が多すぎてクイズが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, "質問")
00412/2
2010/04/18(日) 02:06:08Select Case ans
Case vbYes
MsgBox "正解"
Case vbNo
MsgBox "不正解"
End Select
Else
Select Case ans
Case vbNo
MsgBox "正解"
Case vbYes
MsgBox "不正解"
End Select
End If
004240
2010/04/18(日) 02:11:21私の記述を元にせずに、そちらを書いて下さい。
0043デフォルトの名無しさん
2010/04/18(日) 02:16:37一から書き直した方が作りやすい
おまえに書いてやったら何かくれるなら書いてやらんでもない
0044デフォルトの名無しさん
2010/04/18(日) 02:25:42せっかくExcel使ってるんだから
問題文と正解・不正解を
シートに記述出来るように汁
0045デフォルトの名無しさん
2010/04/18(日) 08:17:25そのままでも100や200なら大して遅くはなりませんから安心して下さい。
丸写しは感心しないので、まずは二択のプログラムを作ってみせてください。
二択の問題の例
問題 本能寺の変を起こしたのは誰か?aかbで答えなさい。
選択肢 a.明智光秀、b.豊臣秀吉
解答 ( )
0046デフォルトの名無しさん
2010/04/18(日) 09:00:200047デフォルトの名無しさん
2010/04/18(日) 09:05:520048デフォルトの名無しさん
2010/04/18(日) 09:09:570049デフォルトの名無しさん
2010/04/18(日) 09:51:25e. 千利休
f. 柴田勝家
0050デフォルトの名無しさん
2010/04/18(日) 22:19:22VBAでPDFファイルを作成したいのですが,以下の件で困っています
・ファイル名,出力先フォルダを指定できない
1,2回であれば,手作業でもかまわないのですが,
各事業所毎に出力するため30回ちかく保存先ダイアログが出る度に
ファイル名を入力して保存しています。
PCにはAcrobat,クロセPDF2などがインストールされています。
よろしくご指導ください。
00511/2
2010/04/19(月) 01:01:43ありがとうございます。
参考にして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
00522/2
2010/04/19(月) 01:02:31If ans = d Then
MsgBox "正解"
ElseIf ans <> "a" And ans <> "b" Then
MsgBox "aかbで答えて下さい"
Else
MsgBox "不正解"
End If
0053デフォルトの名無しさん
2010/04/19(月) 01:12:360054デフォルトの名無しさん
2010/04/19(月) 02:00:16○ クセロ
0055デフォルトの名無しさん
2010/04/19(月) 02:02:42出力する方法はたくさんありますし、何もかも説明するのは不可能です。
今はどんなマクロで出力していますか。保存の部分を書いて下さい。
たぶん少し修正するだけで自動化できる可能性があります。
0056デフォルトの名無しさん
2010/04/19(月) 02:40:55その方法だと、三択の時は解答がE列、四択だと解答がF列になってしまいます。
目的(この場合は解答)が同じセルは同じ列にまとまるようにすれば、
プログラムを作る手間が少なくなります。もう一工夫しましょう。
0057デフォルトの名無しさん
2010/04/20(火) 08:41:100058デフォルトの名無しさん
2010/04/20(火) 20:12:190059デフォルトの名無しさん
2010/04/21(水) 00:33:10なるほど。
つまり、A列が問題としたらB列を解答として、
数が可変な選択肢は最後の方の列に羅列した方がいいというおとですね。
0060デフォルトの名無しさん
2010/04/21(水) 14:39:31VBAのFSOを使ってファイルを抽出
データのファイル名や最終アクセス日などリスト化
ここまではできたのですが指定した日付より
前のアクセス日時のものをほかの列にリスト化するということが
できません、どなたか教えて頂けませんか?
0061デフォルトの名無しさん
2010/04/21(水) 14:49:420062デフォルトの名無しさん
2010/04/21(水) 15:54:340063たろう
2010/04/21(水) 19:32:46とまではわかったのですがテキストボックスが空白の時にデバックがかかってしまうのですが
どうやればかいひできますか?
0064デフォルトの名無しさん
2010/04/21(水) 19:36:270065たろう
2010/04/21(水) 19:36:520066デフォルトの名無しさん
2010/04/21(水) 20:56:330067デフォルトの名無しさん
2010/04/21(水) 22:47:15in→あいうえお
out→おえうあい
こんな感じのです
0068デフォルトの名無しさん
2010/04/21(水) 23:24:02サンプルマクロは、アクティヴシートの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
0069デフォルトの名無しさん
2010/04/22(木) 14:37:40Function 反転(S)
For i = 1 To Len(S)
T = Mid(S, i, 1) & T
Next
反転 = T
End Function
0070デフォルトの名無しさん
2010/04/22(木) 14:41:081.ある商品を数箇所に店舗に卸します。
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
0071デフォルトの名無しさん
2010/04/22(木) 14:42:200072デフォルトの名無しさん
2010/04/22(木) 15:07:34条件が「取り扱いに困るほど大きい」では計算ができません。
いくつ以下、と具体的な数字で示して下さい。
0073デフォルトの名無しさん
2010/04/22(木) 15:15:59Mid statementを使えば、For i=1 To Len(s)/2でできるだろ
0074デフォルトの名無しさん
2010/04/22(木) 15:20:1710足分入るカートンと、12足分入るカートンの2種類があって
最適な組み合わせを調べたいってこと?
0075デフォルトの名無しさん
2010/04/22(木) 15:22:28商品によって変わるので一概に言えません。
(例としては靴の場合で10-20足入としました)
とりあえず変数で示して頂ければ幸いです。
実務上では品目ごとにを許容範囲を設定し、参照する形にしたいと思います。
0076デフォルトの名無しさん
2010/04/22(木) 15:30:54全数を最小の種類のカートンで出荷するには、何足入と何足入のカートンを用意すればいいのか?
ということを調べたいのです。
例では、
10足入の場合は、他に12足入と18足入の合計3種類カートンを作らなくてならないのに対し、
12足入では12足入と10足入の2種類で済むので効率的です。
実際は取引先も扱い商品も多数あり、いちいち考えるのが大変なので、
自動で最適結果を出したいと思っています。
0077デフォルトの名無しさん
2010/04/22(木) 15:51:37カートン候補がありすぎるとプログラムも大変だな
0078デフォルトの名無しさん
2010/04/22(木) 16:06:33�@ この6つの公約数を見比べて、標準カートン10前後の奴の数が多い奴で1つ確定
30とか40とか大きくなったら10にするような処理が必要
それでまず2店舗〜4店舗が確定
残りの2店舗で割り切れない場合
�A その2店舗の最大公約数があればそれでもう1種確定
それがなければ
�B �@の確定カートンで割った余りを求め、その余り2つに公約数があれば確定
それもなければ
�C �Bの商から1減らしてあまりを求め(つか、さっきの余りに�@をプラスして)、その2つに公約数があれば確定
�@で、標準カートンに近いものがない場合(2とか3とかにしかならない)
強引にカートンを10にしてしまい�Bから以下を4店舗分繰り返す
0079デフォルトの名無しさん
2010/04/22(木) 16:10:07これが中々難しくて・・・
アタマが痛くなってきてしまいましたw
0080デフォルトの名無しさん
2010/04/22(木) 16:16:31そして9個いりのカートンは使うってことなのかな?
0081デフォルトの名無しさん
2010/04/22(木) 16:24:02For K=カートン最小値 To カートン最大値
S=必要数(K)
If S > 暫定必要数 Then S = 暫定必要数
Next
0082デフォルトの名無しさん
2010/04/22(木) 16:32:031つ違うくらいならそうしたいですが、大幅に違う場合は例外として扱うことになると思います。
(1000-5000個が適用範囲の商品に、15個の発注が来た場合など)
ただ、実際にはあまり少量のオーダーは受けないので無視して良い事例かと思います。
>>78
ちょっとイメージできないので考えさせてください・・
皆さんありがとうございますm(_ _)m
0083デフォルトの名無しさん
2010/04/22(木) 16:38:460084デフォルトの名無しさん
2010/04/22(木) 16:39:33下1桁が2の倍数なら、12カートンを(1桁/2)個用意すれば、残りは10カートンで済む
どうせ奇数はないんでしょ?あっても繰り上げすれば済む
結論
全て12と10のカートンでおk
0085デフォルトの名無しさん
2010/04/22(木) 17:02:46すみません。カートン総数も減らしたいので出来るだけ多くパッキングしたカートンを基本にしたいのです。
書いてなかったですね。申し訳ない。
奇数もありますが、ご指摘のとおり繰上げ処理でも問題ないです。
なんかスレ違いな気がしてきたので、もうちょっと考えてみますねw
スレ汚し失礼しましたm(_ _)m
0086デフォルトの名無しさん
2010/04/22(木) 17:04:14この書き込みの意図がわかりません
0087デフォルトの名無しさん
2010/04/22(木) 17:32:08なんか条件が曖昧すぎるよ
コンピューターのプログラムってのは、もっと厳密に数字が決まってなきゃ作れないんだよ
条件が色々あるんなら、そのすべてをリストアップするか、法則を決める必要がある
0088デフォルトの名無しさん
2010/04/22(木) 17:38:18それでは困る場合は、「1カートンは最低でも何個以上にするか」「カートンは何種類以下に抑えたいか」
「端数がいくつまでなら切り上げ可能か」のような数字を商品ごとにすべて決めてデータベース化しないと。
0089デフォルトの名無しさん
2010/04/22(木) 18:00:49商品別にカートンと個の間に、もう1つ数量の単位(組とか)を設定する。
上記例の靴だったら2個=1組
適用範囲1000〜5000個のものだったら200個=1組 みたいなかんじ。
組数以下の端数は1組として切り上げる。
こういう設定でできないかな?
0090デフォルトの名無しさん
2010/04/22(木) 18:28:590091デフォルトの名無しさん
2010/04/22(木) 18:32:01openoffice
0092デフォルトの名無しさん
2010/04/22(木) 18:32:38ttp://msdn.microsoft.com/ja-jp/library/bb386107(v=VS.100).aspx
0093デフォルトの名無しさん
2010/04/22(木) 18:33:43http://www.forest.impress.co.jp/article/2006/12/12/msoffice2007trial.html
0094デフォルトの名無しさん
2010/04/22(木) 19:43:39ネットの解説サイトを見て回ってればいい
実際に使いたいなら>>91-93
0095デフォルトの名無しさん
2010/04/22(木) 22:15:02タダでずっと使えそうなOPENOFFICEで頑張りたいと思います
0096デフォルトの名無しさん
2010/04/22(木) 23:48:31これってVBAにも当てはまると思う?
Cやアセンブラならゴリゴリが似合うけど、
VBAならベタベタとか、ポロポロとかの方が
似合う気がするんだけど。
0097デフォルトの名無しさん
2010/04/23(金) 03:52:47ゴリゴリ書くって表現は、処理の根幹部分で既存のライブラリに頼らないとか、
規模が大きかったり開発期間が短い場合に使うものだから、言語の違いは直接は関係ない。
けど、VBAはOfficeの特定の作業を自動化するのが目的の言語だから、
関数を数個書いて終わるケースが大半を占める。「ゴリゴリ書く」ことも少ないだろうね。
たまに大規模なアプリをVBAで作っちゃう人もいるけど、それはVBを使った場合にくらべて
開発効率や処理効率が悪いことがほとんど。
0098デフォルトの名無しさん
2010/04/23(金) 04:04:010099デフォルトの名無しさん
2010/04/23(金) 07:06:09この言語にはポインタみたいなのはないんでしょうか?
リンクリストとかのデータ構造はどうやって実装しているんですか?
0100デフォルトの名無しさん
2010/04/23(金) 07:42:43ポインタ型はありません。
リスト構造も標準では用意されていないので、実装はプログラマー依存です。
単なる整数型のインデックスと配列の組み合わせで実現することが多いと思います。
0101デフォルトの名無しさん
2010/04/23(金) 09:46:20どうもありがとう。
ゴリゴリってそういう意味があったんですね。
知りませんでした。
ちょっとしたネタのつもりが良レスもらって感謝です。
0102デフォルトの名無しさん
2010/04/23(金) 12:03:27WinXP 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
宜しくお願いします。
0103デフォルトの名無しさん
2010/04/23(金) 13:09:52どうみても勘違いです
ほんとうにありがとうございました
0104デフォルトの名無しさん
2010/04/23(金) 13:27:55変わるぞ
三つ目を用意して
Private Sub CommandButton3_Click()
CommandButton1.BackColor = QBColor(10) ' ボタン1のボタン色を変える 実行されない
Call hoge2 ' 関数2を実行
CommandButton1.BackColor = QBColor(1) ' ボタン1のボタン色を戻す 実行されない
End Sub
試してみては
0105デフォルトの名無しさん
2010/04/23(金) 13:56:25最後に正常に動いていたときの
バックアップを取るのは必定
0106デフォルトの名無しさん
2010/04/23(金) 17:02:38追試、ありがとうございます。そうですか、動きますか。
もう一度やってみたのですが、僕の場合は動きませんでした。
hoge2関数の処理時間が3秒程度と長いので、
ボタンの色を変えて処理中であることを示したいのです。
しかし自身のボタン色ではなくて、他のボタン色を操作します。
もしかしたら他のボタンのことは操作できないのかと思っていました。
ボタン色の指示行の間に入れた関数処理自身は
正しく実行されるのですが、
指示したボタンの色がまったく変化しません。
まるで「どのみち元の色になるんだから、色を変えるのは省略します」と
言っているみたいです。
0107デフォルトの名無しさん
2010/04/23(金) 17:04:05単に関数2が一瞬で終わってるだけじゃないか?
0108デフォルトの名無しさん
2010/04/23(金) 17:10:09Private Sub CommandButton1_Click()
CommandButton1.BackColor = QBColor(15)
End Sub
Private Sub CommandButton2_Click()
CommandButton1.BackColor = QBColor(10)
End Sub
0109デフォルトの名無しさん
2010/04/23(金) 17:17:370110デフォルトの名無しさん
2010/04/23(金) 17:31:05間に処理かますと処理後の色変更しかしやがらねー
0111デフォルトの名無しさん
2010/04/23(金) 17:51:22僕は、以前に作ったExcelブックを使い回していて、必要に応じてボタンをcopyしたりして使っています。
なので自分で新規にボタンを作ったことがありません。
調べてみると、僕の使っているボタンは「オートシェープ」という部品のようです。
ボタンとオートシェイプとの違いで、できる/できない があるのでしょうか。
ちよっとパニックです。
>>110
ありがとうございます。できないですよね。
どうしてなんでしょう。もし何かヒントがあればおしえてください。宜しくお願いします。
0112デフォルトの名無しさん
2010/04/23(金) 17:55:17じゃあたぶんボタンの名前を間違ってるだけだな
あとシェープじゃなくてシェイプな。大した違いではないけど何か調べるときに
検索やヘルプでひっかかりにくくなるから正しく覚えておいた方がいい
0113デフォルトの名無しさん
2010/04/23(金) 18:06:43しばらく触ってなかったんでキーワードがみつからないが
色変更させてからシートなりオブジェクトなりを強制再描画させるとかの技はあるはずだ
でなきゃ点滅処理さえ効かない
0114デフォルトの名無しさん
2010/04/23(金) 18:16:36hogeを呼ぶ前に DoEventsでうまくいった
0115デフォルトの名無しさん
2010/04/23(金) 19:19:25マクロはときどき壊れるからなぁ
マクロはときどき壊れるからなぁ
マクロはときどき壊れるからなぁ
0116デフォルトの名無しさん
2010/04/23(金) 20:19:54>>104
>>105
>>112 死んでよし
0117デフォルトの名無しさん
2010/04/23(金) 20:49:19バリアント型で返さないとエラーになる場合ってのはどういうとき?
0118デフォルトの名無しさん
2010/04/23(金) 21:15:36あの餌で釣れるとは思わなかったんだが・・・
0119デフォルトの名無しさん
2010/04/23(金) 21:18:03マクロはときどき壊れるからなぁ
マクロはときどき壊れるからなぁ
マクロはときどき壊れるからなぁ
0120デフォルトの名無しさん
2010/04/23(金) 22:15:47違う
どっちも戻り値はString型
0121デフォルトの名無しさん
2010/04/24(土) 00:06:09評価しようとした時点で、必要に応じて自動でバリアント経由になってしまうから、
結果的に同じ意味にしかなり得ない、って感じかと。
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に対応しているのかなあ。
0122デフォルトの名無しさん
2010/04/24(土) 12:00:21下のような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
板汚し、すみません。
0123デフォルトの名無しさん
2010/04/24(土) 12:27:04Mattew 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なんて手抜いてナンボなんで、目くじらたててやる必要もないよなあ。
0124デフォルトの名無しさん
2010/04/24(土) 12:38:09c = WorksheetFunction.Ceiling(n / 2 + 0.1)
かな?
0125デフォルトの名無しさん
2010/04/24(土) 12:54:05×Mattew ○Matthew
みんな買おうZE☆
http://www.amazon.co.jp/Advanced-Visual-Basic-Techniques-DevelopMentor/dp/0201707128/ref=sr_1_3?ie=UTF8&s=english-books&qid=1272081189&sr=8-3
0126デフォルトの名無しさん
2010/04/24(土) 13:26:04ありがとうございました。できました。
c = WorksheetFunction.Ceiling((n / 2 + 0.1),1) と、,1を追加しました。
大変助かりました。ありがとうございます。
Excelの命令が使えるこはビックリでしたが、
それよりも、VBAで切り上げ計算の演算子がないのがショックでした。
ありがとうございました。
0127デフォルトの名無しさん
2010/04/24(土) 13:40:26これでもいいんじゃね
C = Int(n / 2) + 1
If C = 1 Then C = 0
0128デフォルトの名無しさん
2010/04/24(土) 14:33:34ありがとうございます。
そうですね。1の特殊性がなければ、上の行1行でいいですね。
ありがとうございます。
助かりました。
0129デフォルトの名無しさん
2010/04/25(日) 02:38:39Excel VBAのプログラムを書いて、仕事の改善に使っています。
しかし、VBAのテキストエディタが使いにくいので、なんとかできないかと思っています。
VBAエディタで不満なのは、
・自分の好きなレイアウトでソースが書けない
半角スペース、TABが無視されてしまい、ソースが見にくい
・TABが半角スペースになってしまう。
そこで、別途VB.netなどを買えば、VBA内蔵のエディタはoffになり、
VBのエディタ(TABも半角スペースによる位置揃えも可能)が使えるものでしょうか?
ブレークポイントやステップ実行なども使いたいです。
0130デフォルトの名無しさん
2010/04/25(日) 02:50:130131デフォルトの名無しさん
2010/04/25(日) 02:54:30そんなあなたにはExcelに埋め込むのは止めて
RubyとかPythonでWIN32COM経由で
Excel操作をすることを強くお奨めします
0132デフォルトの名無しさん
2010/04/25(日) 04:19:39マクロはときどき壊れるからなぁ
0133デフォルトの名無しさん
2010/04/25(日) 11:01:07あなたがVBAのエディタに合わせたほうが早いです。以上。
最初はみんな用意されたものに抵抗するんだよね。
0134デフォルトの名無しさん
2010/04/25(日) 11:23:33DLLの読み込みはできるようなので
・スクリプトのDLLをロード
・セル操作などをスクリプトに公開
・VBAからスクリプトをコール
・スクリプト内で計算
・スクリプト内で公開されたセル操作などを使いExcelに出力
・VBAに戻る
といったことをやりたいのですが可能でしょうか?
0135デフォルトの名無しさん
2010/04/25(日) 11:28:110136デフォルトの名無しさん
2010/04/25(日) 19:20:360137デフォルトの名無しさん
2010/04/25(日) 20:52:08ボタンを押して現在から2時間後を出してくれるように
Cells(7, 3) = DateAdd("h", 8, Time)
と作りセルの書式設定のユーザー定義で時間と分だけを表示するようh:mmに設定しました。
同じ日内で収まる場合なら正常に8時間後を出してくれるのですが、
日を跨いでしまうとなぜかユーザー定義が勝手にyyyy/m/d h:mmに変わってしまいます
宜しければ対処法をご教授くださいませ
0138デフォルトの名無しさん
2010/04/25(日) 21:13:42Cells(7, 3).Value = Format(DateAdd("h", 8, Time), "h:mm")
0139デフォルトの名無しさん
2010/04/25(日) 21:17:27無事表示してくれました
本当にありがとうございました
0140デフォルトの名無しさん
2010/04/25(日) 23:06:48そんなに駄目っすか?だったらVBできますって言った方がまだ良い?
0141デフォルトの名無しさん
2010/04/25(日) 23:11:28ただ、他のことも出来てVBAもできる、ぐらいじゃないと意味がない。
0142デフォルトの名無しさん
2010/04/26(月) 00:15:50プログラマーならVBAは基礎知識のうちだからアピールポイントにはならない。
0143デフォルトの名無しさん
2010/04/26(月) 00:29:18excelとかそもそも使わないし
C++一筋だったからVBA最近まで知らなかったよ
0144デフォルトの名無しさん
2010/04/26(月) 11:47:01プログラマーならVBでもアウトだろうねえ。まあ会社にもよるだろうけど。
0145デフォルトの名無しさん
2010/04/26(月) 11:52:03事務員は月給12万くらいだけどプログラマーなら25万くらいあるし
0146デフォルトの名無しさん
2010/04/26(月) 12:27:51本業の待ち時間にVBAのちょっとしたものを作らされたりするよね。
0147デフォルトの名無しさん
2010/04/26(月) 12:50:51VBA使えることって便利だし重要かなと思ってアピールしたんだけどなあ・・・。
他には一応Java、Cはやってるし、鯖で必須のPerl、Python、VBSあたりも普通に
使えるんだけど、小さな会社の社内SEなんで、鯖管理で使う後者はともかく、
前者はアピールしない方が良いかと思ったんだよな。
そもそもプログラマー志望じゃないし、自社開発も無いって話だったんで、
なんか無言でシコシコ書いてるのが好きなんだろ?って思われなくなかった
っていうか。
0148デフォルトの名無しさん
2010/04/26(月) 17:18:190149デフォルトの名無しさん
2010/04/26(月) 17:24:47いやあ、面接官がIT系のコンサル野郎だったでやんす。
「システム導入こそすべて」みたいな奴で、もうどうにもならんかった。
開発も泥臭いとこはやってなさそうな感じの。
まあ、そんな奴がのさばってるって時点でアレなんですが。
0150デフォルトの名無しさん
2010/04/26(月) 17:55:070151デフォルトの名無しさん
2010/04/26(月) 18:18:12現在MicrosoftWebBrowserを利用して
指定セル(住所が書いてある)の地点のGoogleMapが表示されるようにしてあります。
ここでもう少し高度な操作をしたいために(ピン操作やルート案内など)
GoogleMapsAPIを使用したいのですが
ExcelVBAでGooglemapsAPI(javascript?)をGoogleMapに投げ込んで
結果をMicrosoftWebBrowserに返すにはどうすればいいのでしょうか?
0152デフォルトの名無しさん
2010/04/26(月) 18:21:43気持ちは分かる
0153デフォルトの名無しさん
2010/04/27(火) 11:34:07共有フォルダにアクセスできない場合のエラー処理が出来ずに困っております。
dirでいけると思ったのですが、アクセスできない場合、dirでもエラーになってしまいます。
何かよい方法はないでしょうか。
0154デフォルトの名無しさん
2010/04/27(火) 12:28:480155デフォルトの名無しさん
2010/04/27(火) 13:23:14タイムアウトで実際にエラー処理に移るまでに時間が掛かりすぎて困ります
このエラーが出るまでのタイムアウトを短くするにはどうすればよいでしょう?
0156デフォルトの名無しさん
2010/04/27(火) 14:18:45ファイル処理とかネットワーク処理は、ちゃんとやろうとすると意外と大変。
とくにVBAの関数だけではタイムアウトが制御できないから、
グローバル変数を使ったフラグとタイマーを使って時間内に終わったかどう自分で調べるような仕組みを
ちまちま作るしかない。
フラグセット→タイマーセット→On Errorで強制終了回避→ファイル処理→すぐに終わったらタイマー解除
タイマーで強制的に抜けたらフラグクリア
フラグがセットされたままだったら処理成功と判断する
みたいな手順を、よく考えて作る。
0157デフォルトの名無しさん
2010/04/28(水) 07:47:23,/ ノ ヽ ~\
/ ノ IPA ヽ ~\
/ ノ ヽ、 `ヽ
| ノ / ̄\ / ̄~ヽ ヽ i
| ノ | ノ
\ | <●> <●> ( )
\ | | | i /
| / ヽ レ
i (●_●) /
i、 ,-――-、 ・ /
i、 <(EEEEE)> ∵/ どういたしまして
i、 \ ./ /
\ ーー ,ノ
,,.....イ.ヽヽ、ー-―一ノ゙-、.
: | '; \_____ ノ.| ヽ i
| \/゙(__)\,| i |
0158デフォルトの名無しさん
2010/04/28(水) 16:43:11スタックないなんて
切り上げ切捨てのどっちかもないよね?
0159デフォルトの名無しさん
2010/04/28(水) 17:05:55切り上げ切捨てはどっちも出来る
0160デフォルトの名無しさん
2010/04/28(水) 19:08:50実装できないwww
0161デフォルトの名無しさん
2010/04/28(水) 21:23:580162デフォルトの名無しさん
2010/04/28(水) 22:24:00vbaは言語じゃねーよwww
0163デフォルトの名無しさん
2010/04/28(水) 22:44:06構ってちゃんの季節ですね
0164デフォルトの名無しさん
2010/04/28(水) 22:46:530165デフォルトの名無しさん
2010/04/28(水) 22:47:53http://jukai-deep-ice.com/mono/nazo/kora.htm
0166デフォルトの名無しさん
2010/04/29(木) 00:43:54全部COMという万能倉庫から持ってくればいい。
0167デフォルトの名無しさん
2010/04/29(木) 09:57:520168デフォルトの名無しさん
2010/04/29(木) 10:40:35そもそもVBAのグローバルコンテキスト自体がOfficeのCOM(IDispatch)だよな。
で、VB(A)以外でCOMを使うということだけど、
他言語で書いたらどれだけコーディングが面倒かご存知?
まあ、WinOLE32とかいちいっちコーディングするのが面倒じゃなくて
ブラウザも要らないなら、どうぞって感じなんだけど。
あと、Excelと密に連携取れないね。
0169デフォルトの名無しさん
2010/04/29(木) 10:47:310170デフォルトの名無しさん
2010/04/29(木) 12:19:42VBAだけではなかなかかゆいところに手が届かないし
事務員がExcelさわってる裏で事務作業の手伝いをさせるのがVBAの本来の使い方だから
0171デフォルトの名無しさん
2010/04/29(木) 12:41:390172デフォルトの名無しさん
2010/04/29(木) 13:47:120173デフォルトの名無しさん
2010/04/29(木) 14:30:42・・・と聞こうと思ったけれど、ここは事務員のが多いって話でしたね。
ということは、VBScriptとかhtmlとかJavascriptとかのエンドユーザ向け言語ですか?
0174デフォルトの名無しさん
2010/04/29(木) 14:37:530175デフォルトの名無しさん
2010/04/29(木) 14:42:012ちゃんの質問スレで困ってる人を見つけたら助けるふりして雑談始めるのが仕事
0176デフォルトの名無しさん
2010/04/29(木) 14:46:30プロジェクト規模とかステップ数でPGとしての職歴をアピールできるのかもしれないけど、
そうでない場合はアピールしようが無いというか、何をもってできるとするのかよくわからん。
0177デフォルトの名無しさん
2010/04/29(木) 14:47:28自宅警備会社というやつですか?
0178デフォルトの名無しさん
2010/04/29(木) 15:01:55自室です。
0179デフォルトの名無しさん
2010/04/29(木) 16:14:27ネットが繋がらない環境でJava使ってる。
VBAは各種ファイルの生成とか、XMLやらブックの解析とか。
0180デフォルトの名無しさん
2010/04/29(木) 17:08:26office2000 XP SP3 です。
PCのCOMポートから、RS232Cで文字を受信して、Excelシートに表示しています。
while(1)
if (受信文字=あり) then
Cells(y, 1).Value = 受信文字
y = y + 1
endif
wend
という感じです。
いい感じに動作するのですが、シートの一番下の行まで行って、
次の行を書くときに、スクロールしたいのですが、
画面1行スクロールをするには、どのような記述をするのでしょうか。
宜しくお願いします。
0181デフォルトの名無しさん
2010/04/29(木) 17:20:050182デフォルトの名無しさん
2010/04/29(木) 18:08:21で、関数の計算を止めた場合、
WorksheetFunction.Maxなどで関数をVBA内で使用(シートへの記載は無し)したら、
その計算結果を利用する判定時に誤作動したりするのですか?
やはり直前でxlCalculationAutomaticに戻さなくてはいけないのですか?
0183デフォルトの名無しさん
2010/04/29(木) 18:24:43嫌味言うなら質問するな
0184デフォルトの名無しさん
2010/04/29(木) 20:40:06その一言が余計、という。
「へえ。君って○○大学出てるんだ」
「いやあどうしょうもないバカ大学でお恥ずかしい(謙遜のつもり)」
「……俺の息子はその大学を第一志望にして入学したんだよ(怒)」
0185デフォルトの名無しさん
2010/04/29(木) 21:11:200186180
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
などと やってみましたが、エラーだと言われました。
どのように書いたら、バックグラウンドで実行できるのでしょうか。
よろしくおねがいします。
0187デフォルトの名無しさん
2010/04/30(金) 00:43:47その会話で気の利いたことを言った(つもり)のはどっち?
0188デフォルトの名無しさん
2010/04/30(金) 00:45:56a = Worksheets("AAA").Range(hoge).Cells(1, 1).Address
0189デフォルトの名無しさん
2010/04/30(金) 11:02:24Visibleってのは「見えている」範囲のこと。ウィンドウを「切り替えたら見えるだろう」範囲ではない。
だから裏画面では意味がない。
0190180
2010/04/30(金) 19:02:09cells(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発でできる関数があると便利なのですが。
0191デフォルトの名無しさん
2010/04/30(金) 19:13:14アドレスとかじゃ本末転倒か
0192デフォルトの名無しさん
2010/04/30(金) 19:23:11やはりむずかしそうでしょうか。
あと、もう1つよろしいでしょうか。
セルを選択するのと反対に、解除するのにはどのように書けばよろしいでしょうか。
選択は、セルの周囲の線が太く見えて、解除は、セルの周囲の線が太くなくなるということです。
選択 cells(1,1).select
解除 cells(1,1).Deselect と書いたら、叱られてしまいました。
0193デフォルトの名無しさん
2010/04/30(金) 19:43:52rng_str = Cells(Row, Col).Address(False, False)
とりあえずこうするといいよ。
0194デフォルトの名無しさん
2010/04/30(金) 21:17:14>その会話で気の利いたことを言った(つもり)のはどっち?
二つ目の鍵カッコだよ。
この会話では、相手が不機嫌になった理由を教えてくれたから、
「ああ、俺余計なこと言ったな」と本人も気づくけど、
普通は腹の中で「この野郎」と思ってもわざわざそれを伝える人は少ない。
結果、本人はずっと「俺ってユニーク」などと思い込んだまま、
他人をイラつかせ続けることになる。
まあ、俺のことなんだが。
0195デフォルトの名無しさん
2010/04/30(金) 21:59:14行列の変換は Chr(64 + y) & x
ただしZ列より右は表現できない
AA列以降もサポートしたいなら自分で関数を作ってモジュール化すればいい
セル選択の解除は不可能
0196デフォルトの名無しさん
2010/04/30(金) 22:01:57一般機能で出来ないことはvbaでも出来ない。
シートの中で必ず1セルは選択されているものだから、vbaでもどこかのセルは選択しないとあかん
0197デフォルトの名無しさん
2010/04/30(金) 22:05:08さもないと自分で調べるぞ!!
0198デフォルトの名無しさん
2010/04/30(金) 23:29:49ありがとう。Row=1, Col=1 → A1 と出ました。ありがとう。
これで楽になりそうです。
>>195, >>196
>セル選択の解除は不可能
>シートの中で必ず1セルは選択されているものだから、vbaでもどこかのセルは選択しないとあかん
そうなのですね。ありがとうございました。
確かに、自分でExcel使うときは、どこす1箇所選択されています。
助かりました。ありがとうございました。
0199デフォルトの名無しさん
2010/05/01(土) 15:32:28調べろよw
あと手動計算にしなくても再計算すればよろし
マクロの記録でF9だ
0200デフォルトの名無しさん
2010/05/01(土) 17:57:32の計算まで止まるわけないだろ。
むしろ発想自体新鮮w
0201デフォルトの名無しさん
2010/05/01(土) 19:46:16/ / ∧ ∧\ \< 嫌なら見るな! 嫌なら見るな! >
\ \( ゚Д,゚ ) / /< >
\⌒ ⌒ / ノ Y´`Y´`Y´`Y´`Y´`Y´`Y´`Y´`Y´`Yヽ
)_人_ ノ
/ /
∧_∧ ■□ ( ))
( ; )■□  ̄ ̄ヽ
γ⌒ ⌒ヽ  ̄ ̄ノ ノ
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|
0202デフォルトの名無しさん
2010/05/01(土) 22:37:18自分で調べるのが面倒だからこその質問スレだろうが!
情弱なめんな、ゆとりなめんな質問に答えてくれて本当にありがとうございました。
0203デフォルトの名無しさん
2010/05/01(土) 22:41:08冷静な自己分析だと思うぞ
0204デフォルトの名無しさん
2010/05/02(日) 06:25:26>自分で調べるのが面倒だからこその質問スレだろうが!
自分で調べてもどうしてもわからない時の質問スレだよ。
別に2chじゃなくとも、人に教えを請う時はそれが当たり前だと思うが。
0205デフォルトの名無しさん
2010/05/02(日) 06:59:032ちゃんの画一的なコメント 乙
0206デフォルトの名無しさん
2010/05/02(日) 12:09:350207デフォルトの名無しさん
2010/05/02(日) 12:47:44/ _ ヽ //´ __,,>、
/  ̄ ̄ { /::/ / ̄:::::::::::::::\
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二フーイ /  ̄ `‐‐'´ ヽ |
0208デフォルトの名無しさん
2010/05/02(日) 15:58:59> 人間自体が必要なくなる。
今でもほとんど「意思決定」に人間なんか要らないだろ。
1. 提案者「こんなアイディアがあります」
2. 決定者「費用対効果を数字で示せ」
2. 提案者「費用が○○円、利益が△△円を見込んでいます」
3. ○○ < △△か?
true → 4.へ
false → 5.へ
4. 決定者「そのアイディアを採用する」
→ 6.へ
5. 決定者「そのアイディアを却下する」
→ 6.へ
6. 決定者「次のアイディアはなんだ?」
結局のところ、「意思決定」(笑)とやらをやる人間はこんなロジックで動いているんだから、
人間なんかおく必要ない。Excelどころか、20年前のPCでBASICで組んでもいいレベル。
「費用対効果を出せ」「数字で示せ」「説明責任を果たせ」、って言うと非常に説得力が
あるように見えるけど、実は判断基準のなすりつけなんだよね。
0209デフォルトの名無しさん
2010/05/02(日) 17:06:47んじゃそのプロセスをマクロで表現しなよ
0210デフォルトの名無しさん
2010/05/02(日) 21:18:22A列にx軸の値、B〜H列に7系列分のy軸の値が書いてある表で、
A,B列の値を選択してグラフを書かせるとA列をx軸、B列をy軸(系列1)としてくれるのですが、
A〜H列の値を選択してグラフを書かせるとx軸はblankで、A〜H列全てがy軸(系列1〜8)になってしまいます。
A列をx軸にして7系列分のグラフを書くにはどのように工夫したらよいでしょうか。
0211デフォルトの名無しさん
2010/05/02(日) 21:54:140212デフォルトの名無しさん
2010/05/03(月) 13:25:00グラフの種類を散布図にして
元データの設定ウィンドウでY軸からA列を消して、X軸にA列を追加
0213デフォルトの名無しさん
2010/05/04(火) 21:21:370214デフォルトの名無しさん
2010/05/04(火) 22:22:06まぁ常識的に考えて肥大しすぎだとは思うが w
0215デフォルトの名無しさん
2010/05/04(火) 22:53:39これ以外にもシートをコピー→新しいブックの新しいシートに貼付け も効果があるらしい
(シートタブからのシートのコピー はダメ)
0216デフォルトの名無しさん
2010/05/04(火) 23:40:10それやると、セルの幅はコピーされない(初期状態のまま?って言うの)んと違うかったっけ?
0217デフォルトの名無しさん
2010/05/04(火) 23:50:05? 普通に書式も一緒にコピーできるけど?
0218デフォルトの名無しさん
2010/05/05(水) 00:33:090219デフォルトの名無しさん
2010/05/05(水) 12:47:49Excelは、変なお節介があり、ユーザーは動作の予想ができないので、
覚えにくいし、使いにくいですよね。
さて、具体的な方法は自分で考えてもらうとして、イメージを説明します。
グラフを作るとき、多くの場合は、希望するデータ範囲を囲って、
グラフボタンで進んで行って「グラフできたぁ」となるワケですが、
これは、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やワードのお節介が減ることを期待したいです。
0220デフォルトの名無しさん
2010/05/05(水) 13:32:180221デフォルトの名無しさん
2010/05/06(木) 00:23:24なかなか面白い話しやけど、確かにスレ違い。
0222デフォルトの名無しさん
2010/05/08(土) 17:44:55平均値などを計算したい場合,
一度,シートに書き出してエクセルのaverage関数を使うしかないのでしょうか?
0223デフォルトの名無しさん
2010/05/08(土) 17:47:190225デフォルトの名無しさん
2010/05/08(土) 18:11:120226デフォルトの名無しさん
2010/05/08(土) 18:49:160227デフォルトの名無しさん
2010/05/08(土) 19:13:10vbNewLineで改行していれようとすると5行までしか入りません。
無限にいれれるようにするにはどうしたらいいでしょうか?
0228222
2010/05/08(土) 19:13:18配列 a[100]
を定義したとして,a[10]からa[i]までの平均値をだしたいのですが
excelの関数で大丈夫ですか・
0229デフォルトの名無しさん
2010/05/08(土) 19:24:00じゃあ、10〜iまで回せばいいじゃん
0230222
2010/05/08(土) 19:49:42可変長の部分をa_temp というdouble型の配列を作成,そこに格納し
ave = WorksheetFunction.Average(a_temp)
としても 0 しか返ってきません.
何か間違っていますでしょうか?
0231デフォルトの名無しさん
2010/05/08(土) 19:50:240233デフォルトの名無しさん
2010/05/08(土) 20:15:050235デフォルトの名無しさん
2010/05/08(土) 20:23:100236デフォルトの名無しさん
2010/05/08(土) 20:45:32気のせいでした
0237デフォルトの名無しさん
2010/05/09(日) 01:21:50とりあえず、作ったプログラムを丸ごと貼り付けて
0238222
2010/05/09(日) 09:59:16求めた平均値を入れる変数の型をlong型にしていたため,
常に0となっておりました.
double型に変えると無事動作しました
ありがとうございました
0239デフォルトの名無しさん
2010/05/09(日) 15:56:220240デフォルトの名無しさん
2010/05/09(日) 17:08:43もう少し詳しく書かなきゃわからんよ
他のブックを操作するとは例えばどんな事?
また、あるブックでマクロ実行中て書いてるけど
どんな処理をしている時を想定しているの
0241デフォルトの名無しさん
2010/05/09(日) 19:07:08イメージとしてはExcelの二重起動でしょうか
マクロの実行中ってほかのエクセルの編集作業が全くできないと思うんですが、それをできるようにしたいです。
0242デフォルトの名無しさん
2010/05/09(日) 19:16:360243デフォルトの名無しさん
2010/05/09(日) 19:25:38取りあえずDoEventsでも入れてみれば
0244デフォルトの名無しさん
2010/05/09(日) 19:48:48質問が悪かったです。ちょっと出直してきます
0245デフォルトの名無しさん
2010/05/09(日) 20:11:420246デフォルトの名無しさん
2010/05/10(月) 08:04:51環境は、
windows7
Apache2.2
PHP5.1
mysql server 5.1
です。
普通のphpファイルは開けるのですが、
mysql_connect()を使うとブラウザでページを表示できなくなります。
なぜでしょうか?
0247デフォルトの名無しさん
2010/05/10(月) 08:07:150248デフォルトの名無しさん
2010/05/10(月) 23:22:47「図が大きすぎます」エラーが出るのは
どんな理由が考えられますか?
VBAがたくさん使ってあるシートです。
でも、図の類は何もありません。
0249デフォルトの名無しさん
2010/05/12(水) 04:09:28マイクロソフトは、あいかわらず、いつまでもユーザー泣かせのことやってる。
0250デフォルトの名無しさん
2010/05/12(水) 04:12:14不思議でしようがないいよ。
故意にユーザーを苦労させ、エラー出るように設計してるとしか思えない。
0251デフォルトの名無しさん
2010/05/12(水) 04:14:370252デフォルトの名無しさん
2010/05/12(水) 07:36:240253デフォルトの名無しさん
2010/05/12(水) 12:40:580254デフォルトの名無しさん
2010/05/12(水) 13:04:22処理対象データ ↓
A B C D
1 あ い う
1 あ い う
2 あ い う
3 あ い う
3 あ い う
4 あ い う
4 あ い う
4 あ い う
というデータがあるとします。
A列の値が同じである間、同じSheetにデータを出力できるようにし
A列の値が異なる場合になったならば、別シートに出力変換したいんだけども
何かアドバイスを貰えませんか。
0255デフォルトの名無しさん
2010/05/12(水) 13:11:08Aを上から見ていって、
前の値と比較すればいいでしょ。
Set procRange = [A1]
Set outputSheet =
While procRange <> ""
If procRange.Offset(-1) <> procRange Then
Set procRange = procRange.Offset(1)
Wend
0256デフォルトの名無しさん
2010/05/12(水) 13:13:32動かせる環境ないから適当に直せ
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
0257デフォルトの名無しさん
2010/05/12(水) 13:21:31返答ありがとうございます。
高度な文面なので検索してちょっと理解深めます。
Offset〜〜に解決の糸口を見つけられそうなので
イジイジしてきます。ありがとおおおおおおおお
0258デフォルトの名無しさん
2010/05/12(水) 18:19:08質問の概要
ワークシートの変更を禁止したいです。
説明
・シート内にあるボタンを押すと計算が始まります。
・その計算は、そのシート内のセル内容を読込んで計算するので、シートを変更されると、困ります。
・そこで、計算している間は、シート変更を禁止させたいです。
計算中にシートタブがクリックされたら、このような動きにしたいです。
メッセージボックスを表示して「今はダメよ」と表示する
もしメッセージボックスを表示することで、計算が狂ってしまうなどの問題があるのなら、
最低でも、シート変更を無視、無反応にし、計算を安全にしたいです。
どのようにすれば良いでしょうか?
宜しくお願いします。
0259デフォルトの名無しさん
2010/05/12(水) 18:21:510260デフォルトの名無しさん
2010/05/12(水) 20:54:35ありがとうございました。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を、' にすると、正しく色が変化します。(再現性があります)
どうしてこんなことが起こるのでしょうか?
宜しくお願い致します。
0261デフォルトの名無しさん
2010/05/12(水) 21:24:18ボタンの背景色の変更と、その色で画面が更新されるタイミングには実際にはブランクがある為。
VBAマクロ実行中も一定の間隔で画面の更新処理は走るが、
ScreenUpdatingがFalseの時はその処理が妨げられる。
ScreenUpdatingをTrueに戻すと、とりあえず画面全体を更新しなおすので、
後述の処理だとまとめて変化したように見える。
0262デフォルトの名無しさん
2010/05/12(水) 23:44:460263デフォルトの名無しさん
2010/05/13(木) 01:00:39Call DoEvent
Application.ScreenUpdating = False
Call KEISAN
Application.ScreenUpdating = true
Button1.BackColor = QBColor(白)
だったかな
0264デフォルトの名無しさん
2010/05/13(木) 01:03:13スマソ orz
Button1.BackColor = QBColor(赤)
DoEvents
Application.ScreenUpdating = False
Call KEISAN
Application.ScreenUpdating = true
Button1.BackColor = QBColor(白)
0265デフォルトの名無しさん
2010/05/13(木) 01:07:09例えばセル上に "=IF(" まで入力すると
IF(論理式,[真の場合],[偽の場合]) と、表示されますが、
このポップアップ表示されるやつを自作関数でも表示させたいのです。
ご教示よろしくお願いします
0266デフォルトの名無しさん
2010/05/13(木) 02:50:220267デフォルトの名無しさん
2010/05/13(木) 17:21:52ありがとうございました。なんとか出来ました。
僕の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分戻ることもあります。もう、わけがわかりません。半分怒っています。
これは、どのような時に起こるのでしょうか?
通常のエディタのように動かないので、使いにくくて困っています。すみません。ご存じでしたら、どなたか教えてください。
0268デフォルトの名無しさん
2010/05/13(木) 17:31:470269デフォルトの名無しさん
2010/05/13(木) 17:38:07一般的には、TABで送ったものはSHIFT+TABで戻すんじゃね?
0270デフォルトの名無しさん
2010/05/13(木) 17:50:10ありがとうございます。Shift+TABを、Excelでやってみました。
VBAエディタでは、確かに出来ました。左に1TABずつ戻ります。初めて知りました。
ところが、秀丸では、Shift+TABは、エラー。
メモ帳では、Shift無視で右にTABしていきました。
text editorは、space4個はspace4個、tabはtab、として置いて欲しいと思っています。
space4個打ったところでは、BS1回で、1spaceが消えればいいし、
tabを打った所では、BS1回でtab1個が消えればいい、というかそのほうが自然だと思うのです。
僕の価値観だけでしょうか。
でも、>>269に Shift+TABを教えてもらったので、今度からはストレスがぐっと減りそうです。
どうもありがとうございました。
0273デフォルトの名無しさん
2010/05/13(木) 20:59:53Visual StudioやEclipseといった開発環境は大抵Shift+Tabで戻るよ
秀丸の場合、1文字以上選択状態にしてShift+Tabで戻る(サクラエディタも同様)
Tabキーでスペース2個とか4個とかが入力されるようにするのは
スペース派(ソースコード中にタブ文字を一切使わない)には普通のこと。
タブ文字は見る方の環境によって幅が変わってしまうので、それを嫌っている。
ただVBAは専用エディタでしか見ないだろうし、
そもそも設定変更できないのがひどいのは事実
0274デフォルトの名無しさん
2010/05/13(木) 21:05:500275デフォルトの名無しさん
2010/05/13(木) 21:58:59馬鹿なの?死ねの?
0276デフォルトの名無しさん
2010/05/13(木) 22:06:500277デフォルトの名無しさん
2010/05/13(木) 22:46:05. │
. └――死なないよ(死なない派)
0278デフォルトの名無しさん
2010/05/14(金) 07:41:4100:15
00:30
00:45
〜〜略〜〜
03:00
みたいな時間がず〜〜〜〜と続くと想定して
これを開始の00:15から03:00までの間ループさせたいんだけど
時間と分を別々に分けて15分ずつ足して行く方法しかないですかね?
0279デフォルトの名無しさん
2010/05/14(金) 08:22:28そうじゃないの
つまり0時1時2時3時のステップと15分30分45分00分のステップを入れ子でループするんでしょ
0280デフォルトの名無しさん
2010/05/14(金) 08:25:59分けて計算すると変数多くなってしまうと思っての質問だったのですが
分けて計算するとしたら、どういう感じのループ条件式になりますでしょうか。
重ね重ねすいません。
0281デフォルトの名無しさん
2010/05/14(金) 08:27:43おおお!!納得です。
ちょっと考えてきます、ありがとございました!
0282デフォルトの名無しさん
2010/05/14(金) 12:11:450283デフォルトの名無しさん
2010/05/14(金) 12:40:02以下の配列データが複数あるとします。
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
こんな感じにしたいのですが、どんな感じにすればいいでしょうか
0284デフォルトの名無しさん
2010/05/14(金) 12:42:08配列の全要素は0ではないです、すいません。
A(1) = 1
A(2) = 2
A(3) = 3
A(4) = 4
A(5) = 3
0285デフォルトの名無しさん
2010/05/14(金) 13:00:10配列をソートして前と違うものを取り出せばよい。
あるいは最小値と最大値が極端に離れてなければBoolean型の配列を
Redim FLG(最小値 To 最大値) As Boolean
のように用意して、ループを回しながらフラッグをたて、フラッグが
立っているものを取り出してもよい。
数値にDictionaryを使うやつはアホ。
0286デフォルトの名無しさん
2010/05/14(金) 13:05:510287デフォルトの名無しさん
2010/05/14(金) 13:11:590288デフォルトの名無しさん
2010/05/14(金) 13:13:21配列のソートって出来るのですね。
フラッグはちょっと難しそうでしたので配列ソートの方を参考にさせて頂きます。
調べてる時Dictionaryというのも頻繁に出てきたのでこれも調べてみます。
レスありがとございました!
0289デフォルトの名無しさん
2010/05/14(金) 13:18:270290デフォルトの名無しさん
2010/05/14(金) 13:25:010291デフォルトの名無しさん
2010/05/14(金) 13:25:290292デフォルトの名無しさん
2010/05/14(金) 13:31:430293デフォルトの名無しさん
2010/05/14(金) 13:32:51言いっぱなしは迷惑。
0294デフォルトの名無しさん
2010/05/14(金) 13:35:290295デフォルトの名無しさん
2010/05/14(金) 13:37:59二行も必要ないなw
アホだからだよ。
無理やり二行で書くと
何で単純な整数にハッシュが必要なんだってことだな。
ハッシュなんて文字列に使うものだぞ。
0296デフォルトの名無しさん
2010/05/14(金) 13:48:13(少なくともCollectionよりは効率がいいはずだが)
整数値は整数値をそのままハッシュ値にすればいいでしょ。
ていうか、そんなんでDictionary否定してたの?
0297デフォルトの名無しさん
2010/05/14(金) 13:56:03お手上げだね。
0298デフォルトの名無しさん
2010/05/14(金) 14:05:170299デフォルトの名無しさん
2010/05/14(金) 14:08:510300デフォルトの名無しさん
2010/05/14(金) 14:19:110301デフォルトの名無しさん
2010/05/14(金) 14:26:17ネイティブなDictionaryでやったほうがいいね
0302デフォルトの名無しさん
2010/05/14(金) 14:35:57>>299
そういう皮肉は今の人には通じないって。
0303デフォルトの名無しさん
2010/05/14(金) 14:48:090304デフォルトの名無しさん
2010/05/14(金) 14:58:020305デフォルトの名無しさん
2010/05/14(金) 16:11:00複数モジュールがある中で共有して扱わないとエラー出てしまったので
subとかが書かれてるよりも一番上(グローバル宣言?)にしたらエラーが出ませんでした。
これって外道ですかね?
0306デフォルトの名無しさん
2010/05/14(金) 16:16:120307デフォルトの名無しさん
2010/05/14(金) 16:35:00Module1
Module2
dim aaRange as Range
call ユーザ定義関数(aaRange)
Module3
ユーザ定義関数(aaRange)記載
上記のようにModule2でRangeオブジェクトを宣言し、ユーザ定義の引数で貰ってるとします。
頻繁にユーザ定義関数を実行するのですが、aaRangeの値を常に保持していたくてグローバル宣言(呼び方あってるのかな)
してしまったと言う訳ですが!!!
糞設計でしょうか!!
0308デフォルトの名無しさん
2010/05/14(金) 16:37:230309デフォルトの名無しさん
2010/05/14(金) 16:45:360310デフォルトの名無しさん
2010/05/15(土) 14:27:47イミディエイトウィンドウで
?hex(50000)
だと
C350
と出ます。
でも
?&hC350
だと
-15536
と出ます。
何で??
50000に戻したいのに・・・。
因みに
?-15536=50000
False
?hex(-15536)=hex(50000)
True
と出ます・・・。
0311デフォルトの名無しさん
2010/05/15(土) 15:50:4650000はIntegerの範囲に収まってないのにIntegerに変換しようとしてそうなる
?&hc350& でLongに変換すればちゃんと50000になる
最後の&はLongを表す文字な
0312デフォルトの名無しさん
2010/05/17(月) 08:04:24ちなみに、会社で後任に引き継ぐのを想定してるだけなんで、ガチガチにする必要なし
みなさん設計する時どんなことに気をつけてます?
0313デフォルトの名無しさん
2010/05/17(月) 09:18:42それまでは人混みに隠れていた工作員の存在が目立つようになったのが致命傷だったな
工作員の誘導を嫌って参加者が減り、他所からの工作員を排除しようとして規制をするから
参加機会が奪われて更に参加者が減るという負のスパイラルにおちいってる
0314デフォルトの名無しさん
2010/05/17(月) 09:32:43関数の引数は基本的にByValにするとかかな。
速度的にはByRefが望ましいんだけど。(特に文字列)
Option Explicit強制とか、
空文字の代わりにvbNull使うとか、
$バージョン関数があるなら$バージョン関数使うとか、
改行文字の種類も揃えたほうがいいかも。
変数名のつけ方をシステムハンガリアンにするなら
統一したほうがいいね。
0315デフォルトの名無しさん
2010/05/17(月) 12:41:570316デフォルトの名無しさん
2010/05/17(月) 12:45:34俺もそう思った
0317デフォルトの名無しさん
2010/05/17(月) 12:47:19空白よりvbNullで統一したほうがいいな
そういやOption Explibt忘れてたわ……入れとこう
命名規則はアプリケーションハンガリアンにする予定
触る人のレベルなんかわからないし、プロジェクトごとの理解をまず深めて貰わないといけない
頭文字のみ大文字、単語ごとにアンダースコア、2バイト禁止
変数・プロジェクト名が長くなるから、頭文字大文字が必須になる
自分で慣れてないから書き換える手間が半端ないっていう
0318デフォルトの名無しさん
2010/05/17(月) 13:32:400320デフォルトの名無しさん
2010/05/17(月) 13:36:320321デフォルトの名無しさん
2010/05/17(月) 13:37:570322デフォルトの名無しさん
2010/05/17(月) 13:43:490323デフォルトの名無しさん
2010/05/17(月) 13:46:180324デフォルトの名無しさん
2010/05/17(月) 13:51:310325デフォルトの名無しさん
2010/05/17(月) 14:00:39俺もそう思った
0326デフォルトの名無しさん
2010/05/17(月) 15:47:24私もそう思うわ
0327デフォルトの名無しさん
2010/05/17(月) 18:47:47人のレスにいちゃもんつけるくらいしか出来ねえのか三流プログラマども
俺も>>315には共感するけどそれはそれとして
0328デフォルトの名無しさん
2010/05/17(月) 20:03:33何より
手段と目的が逆転しないように気をつける
0329デフォルトの名無しさん
2010/05/17(月) 20:18:20システムハンガリアンとかいうのは小文字だよね?
0330デフォルトの名無しさん
2010/05/17(月) 21:42:310331デフォルトの名無しさん
2010/05/17(月) 22:47:170332デフォルトの名無しさん
2010/05/17(月) 23:08:56だから大文字含めた変数名にしておくと、タイプミスが少なくなる
0333デフォルトの名無しさん
2010/05/17(月) 23:43:45型が勝手に小文字になって困ってしまう
例えば、rangeとかdateとかを変数名にすると、全体的に型のRangeが
勝手にrangeに変わってしまう
なんとかならないんだろうか
0334デフォルトの名無しさん
2010/05/18(火) 00:04:23あとはかぶらない名前にするか
0335デフォルトの名無しさん
2010/05/18(火) 05:45:44Option Explicitとか宣言の強制使え
>>333
システムで宣言済みの名前を使うな
0336デフォルトの名無しさん
2010/05/18(火) 07:56:220337デフォルトの名無しさん
2010/05/18(火) 08:04:480338デフォルトの名無しさん
2010/05/18(火) 08:26:090339デフォルトの名無しさん
2010/05/18(火) 08:41:53クラスの小文字名だよ
0340デフォルトの名無しさん
2010/05/18(火) 12:23:32見えるので理解してもらうのは難しいと思う。新しい概念を習得してもらうには
少々歳を取りすぎている。掲示板にもらった手紙の全文を掲載した時点で
気が付くべきだったのかも。
「プライバシー問題に関して無頓着」な人は親しくない相手にも平気で年齢や
職業を尋ねる傾向があるようなので注意したほうがいいです。
0341デフォルトの名無しさん
2010/05/18(火) 12:24:23デバッグするまでスペルミスのリスク抱えてろってのか?
タイプミスじゃなくて思い違いだったりすると、毎回変数名間違うことになる
一ヵ所ならまだしもデバッグ時に複数箇所とか煩わしすぎ
頻度の少ないコードとか気付かなかったり、確実にデバッグ出来るってわけでもないし……
0342デフォルトの名無しさん
2010/05/18(火) 13:47:54Dim 氏名 As String
0343デフォルトの名無しさん
2010/05/18(火) 15:21:21なんだか忘れたが、2バイト名関数を呼び出した時いらない参照呼び出して不具合引き起こしてたような
対応する気ない見たいだから、でっかいシステム組むのにはエラーでる覚悟はしとくべき
0344315
2010/05/18(火) 16:38:12するような性質のものではない。
・空文字列とvbNullは同じものではない。VarType()してみればわかる。
・いちいち$バージョンの関数があるかどうか調べるのはめんどくさいので使わない。
そもそもmid()とmid$()とかは別物なのか?とかいうのも調べるのがめんどい。
・改行文字の種類も揃えたほうがいいかも <= 意味不明。vbCrLfを使いましょうってことだとしても、
別にそろえる必要性を感じない。
・システムハンガリアンは使わない。
0345315
2010/05/18(火) 16:40:05「変数の定義はできるだけ遅くやる(使用する行/ブロックの直前でやる」
と決めたら、誰一人共感してくれなくて、驚くほどの反発があったことを思い出したよw
0346デフォルトの名無しさん
2010/05/18(火) 16:49:53・アーリーバインドをなるべく使う
・イベントプロシージャの中に処理を直接書かない
・変数は一行一個で宣言しろ
・Publicな関数はPascalCaseで
・Const使え
こんな感じだったか。
0347デフォルトの名無しさん
2010/05/18(火) 16:51:590348デフォルトの名無しさん
2010/05/18(火) 19:47:42それとも、文字列全体がまるまるコピーされるの?
0349デフォルトの名無しさん
2010/05/18(火) 20:40:23変数のアドレスを渡す
呼び出し先のプロシジャで引数として宣言している変数の値を変更する
と、その引数に指定している呼び出し元の変数の値も変更される
値渡し プロシジャに値を渡す時、値そのものをコピーして渡す。
呼び出し先のプロシジャは、渡された値のコピーを受け取るだけなので
呼び出し先のプロシジャで引数として宣言している変数の値を変更して
も、呼び出し元の変数は一切影響を受けない。
だったかと
0350デフォルトの名無しさん
2010/05/18(火) 21:15:22で、ポインタの値渡しなの?中身の値渡しなの?
0351デフォルトの名無しさん
2010/05/18(火) 21:18:55コピーされる。
ちなみにVBの文字列の型はBSTR。
先頭に文字列長、末尾にヌル文字のUTF16文字列だったかな。
0352デフォルトの名無しさん
2010/05/18(火) 21:27:09プロシージャの引数の文字列がコピーされるのは以下のタイミング。
・ByRefだと文字列定数を渡した時
・ByValだと常時
もちろんポインタのコピーじゃなくて文字列をフルコピー。
VBの文字列はImmutableじゃない。
0353デフォルトの名無しさん
2010/05/18(火) 21:52:10ありがとうございます。
VBAについてそこまで深く書いてある本もあるんですね
0354デフォルトの名無しさん
2010/05/18(火) 22:27:49・引数にByRef|ByValを指定しなければByRefになる。
アホが引数を書き換えるとわかりづらいバグに発展する。
普通の関数であれば値渡しでいいはず。参照渡しを積極的に使う場面は少ない。
・ごめん。vbNullじゃなくてvbNullString。
・$・非$関数は別物。$じゃなければVariantが帰ってきている。
普通はVariantには用がないはず。作者も$の方使えって言ってる。
・それならばvbCrLfとvbNewLineどちらを使うのか。
・システムハンガリアンはどうでもいいや。
0355デフォルトの名無しさん
2010/05/18(火) 22:35:57VBの作者か?
0356デフォルトの名無しさん
2010/05/18(火) 22:44:190357デフォルトの名無しさん
2010/05/18(火) 23:13:14なんであんなものがあるのか不思議でしょうがない
0358デフォルトの名無しさん
2010/05/18(火) 23:21:43便利な機能だけどダイアログで出るのが最高にウザいよなw
0359デフォルトの名無しさん
2010/05/19(水) 11:30:50普通の関数であれば参照渡しでいいはず。
値渡しが必要な場合にのみByValを使え。
0360デフォルトの名無しさん
2010/05/19(水) 11:35:470361デフォルトの名無しさん
2010/05/19(水) 11:59:22ただ、両バージョン混在してるなら$にしろって言うけどね。
参照渡しは本当に理解してないのが多い(特にCとかJavaとかの人)
0362デフォルトの名無しさん
2010/05/19(水) 12:00:52ByValもつけない
0363デフォルトの名無しさん
2010/05/19(水) 12:04:27いちいちAsなんて書いてられない。
0364デフォルトの名無しさん
2010/05/19(水) 12:11:170365デフォルトの名無しさん
2010/05/19(水) 12:23:27実際はVariantだってのはどこ見ればわかるのか知りたい。
0366デフォルトの名無しさん
2010/05/19(水) 12:25:02?Typename(Mid(123,1))
String
0367デフォルトの名無しさん
2010/05/19(水) 12:34:420368デフォルトの名無しさん
2010/05/19(水) 12:41:11なんかネット上に書いてありそうだけど、この本見てね。
Welcome to PowerVB
http://www.powervb.com/
0369デフォルトの名無しさん
2010/05/19(水) 13:11:03その程度の差が利いてくるほどの計算量が必要な処理なら、そもそもVBAで
やるのがどうかという話もある。
まぁ一般プログラマは気にしなくて良いレベル。
0370デフォルトの名無しさん
2010/05/19(水) 13:20:40そんな細かいことより、文字列の連結方法を教えといた方がいいよね。
0371デフォルトの名無しさん
2010/05/19(水) 13:21:290372デフォルトの名無しさん
2010/05/19(水) 13:34:17何書いてあんの?
何を読ませたいの?
英語の勉強からするのも面倒だし
ネットに書いてあるとか言うの教えてよ
0373デフォルトの名無しさん
2010/05/19(水) 13:38:34多分このこと。
http://support.microsoft.com/kb/170964/ja
0374デフォルトの名無しさん
2010/05/19(水) 13:44:53けど、普通はどっちか一つしか使わんだろ。気分でvbCrLf/vbNewLineをごちゃまぜに使うような奴なら、プログラマ
としての素質を疑うよな。
プロジェクト全体として(というほどの大きなプロジェクトがVBAで構築されることがあるのかどうかは知らないが)、
統一されてなくてもかまわんよ。
例えば、CでいちいちNULを'\0'と書けとか言われたら切れるな。0で済むところは0で書くし。
0と'\0'が混在してても気にならないし、0とNULLが混在してても気にならない。
0375デフォルトの名無しさん
2010/05/19(水) 14:01:05引数として用意した変数に格納してから渡したほうがいい?
call 処理(変数)
↓
引数 = 変数
Call 処理(引数)
変数 = 引数
0376デフォルトの名無しさん
2010/05/19(水) 14:14:00こんなレベルの奴がいるなら、基本ByValで渡せというのもうなずけるな。
0377デフォルトの名無しさん
2010/05/19(水) 15:17:35手を貸してやろうか?
0378デフォルトの名無しさん
2010/05/19(水) 16:07:100379デフォルトの名無しさん
2010/05/19(水) 16:25:100380デフォルトの名無しさん
2010/05/19(水) 16:54:160381デフォルトの名無しさん
2010/05/19(水) 17:15:060382デフォルトの名無しさん
2010/05/19(水) 17:31:06Q:
hoge1,hoge2,・・・hogeN
それぞれ何度も演算したり入れ換えたりした後に関数を呼び出し
関数の中でも同じ変数名でスパゲッティ大盛り
引数のhogeA,hogeBを間違えて渡した時の修正コストが半端ない
だから呼び出し前にそれぞれ変数に値を入れておけば、その部分だけ修正すればいい
よって>>375ですか?
A1: つ 参照
A2: つ 規約
A3: そんな時は大抵他の場所でも入れ違いがあるんじゃね
0383デフォルトの名無しさん
2010/05/19(水) 17:52:06・Option Explicit必須
・デフォルトコントロール名(Text1など)の使用禁止
・伝統的なループ変数(i, j, k, ...)以外の一文字の変数名禁止
・ByVal/ByRefの省略禁止
・変数宣言/定義時は、Variantであっても必ず型名を付ける
・一行の「If ... Then」禁止
・Goto/Gosub禁止
・IIf禁止
・Call禁止(書くな)
・While ... Wend禁止(代わりにDo ... Loopを使え)
・$付き関数がある場合はそれを使え
・「=""」「<>""」の代わりにLenBを使え
0384デフォルトの名無しさん
2010/05/19(水) 18:50:33>Goto/Gosub禁止
On Error は除いてくれ
Call禁止 反対 サブプロシジャ呼び出しであることを明確にしたい
0385デフォルトの名無しさん
2010/05/19(水) 19:16:01俺普段=””使ってるわ。。。
0386デフォルトの名無しさん
2010/05/19(水) 19:59:170387デフォルトの名無しさん
2010/05/19(水) 21:25:400388デフォルトの名無しさん
2010/05/20(木) 13:53:14要点としては
�@ゲーム開始ボタンを押した後、盤目をクリックしたら駒を描写する所
�A一度置いたところにもう置けない判定
�B駒を挟んでひっくり返す判定
どうかご教授ください
0389デフォルトの名無しさん
2010/05/20(木) 14:03:491. Cells(2, 2).Value = "●"
2. If Len(Cells(2, 2).Value) > 0 Then Debug.Print "おけない" End If
3. Cells(2, 2).Value = "○"
つか、VBAじゃなくて他の言語でオセロ書けるのかよ?
0390デフォルトの名無しさん
2010/05/20(木) 21:16:48形で良いのでしょうか?それともCstr を使用した方が適当なのでしょうか?
0391デフォルトの名無しさん
2010/05/20(木) 22:00:31> >「=""」「<>""」の代わりにLenBを使え
>
> 俺普段=””使ってるわ。。。
おいらも。こっちのがタイプ量少ないし。
LenBだといいことあるの?
0392デフォルトの名無しさん
2010/05/20(木) 22:01:28セルの書式を文字列にすれば?
0393デフォルトの名無しさん
2010/05/20(木) 23:07:16Len 6命令 <=> LenB 5命令
ちょっとだけお得。
これよりもうちょっとコストが付くのが空文字列の比較。
速度で言えば、LenBが最速。
0394デフォルトの名無しさん
2010/05/20(木) 23:20:39Cells(2, 2).Value = Cells(2, 2).Value + ""
0395デフォルトの名無しさん
2010/05/20(木) 23:42:12Cells(2, 2).Text & ""
0396391
2010/05/21(金) 00:02:51なるほど。性能か。シビアな場合もあるのかもね。
文字列連結も+使うんじゃなくて領域確保した上でMid()使えとか。
おいらはとりあえず性能関係シビアな用途に使っていないし「= ""」 で良いや。
0397デフォルトの名無しさん
2010/05/21(金) 00:26:48普段使うVBAなんて最速で書けた方が偉いからね。
0398デフォルトの名無しさん
2010/05/21(金) 00:46:220399デフォルトの名無しさん
2010/05/21(金) 00:56:18カーソル移動するのがめんどいから
Xor Trueなんて行末に書き足すのは俺だけでいい
0400デフォルトの名無しさん
2010/05/21(金) 01:06:42プログラムの規模じゃなくてデータの規模が問題なんだよ。
0401デフォルトの名無しさん
2010/05/21(金) 10:49:32DoUntill...Loopもだめ?
0402デフォルトの名無しさん
2010/05/21(金) 14:42:26ループ内で、普通に文字列連結とかしてたら死ぬときがあるよ
0403デフォルトの名無しさん
2010/05/22(土) 11:52:570404デフォルトの名無しさん
2010/05/22(土) 12:05:08これ書いたのだれ?もしかしておれ?
0405デフォルトの名無しさん
2010/05/22(土) 13:04:22http://support.microsoft.com/kb/170964/ja
文字列連結は、需要が多い上に意外と時間がかかる。
何も考えずに作ると処理が死ぬほど遅くなる。
0406デフォルトの名無しさん
2010/05/22(土) 16:35:49xlnoneとは何をするのでしょうか?
0407デフォルトの名無しさん
2010/05/22(土) 17:17:17ただの書式設定のプロパティ値
罫線描画を線無しにする時とかにプロパティをこれに設定する
0408デフォルトの名無しさん
2010/05/22(土) 21:00:460409デフォルトの名無しさん
2010/05/22(土) 21:13:44Listviewは、縦スクロールにならないのでしょうか?
0410デフォルトの名無しさん
2010/05/22(土) 22:22:26例えば出勤日リストの行を定義する変数名
Shukkin_row_count_
ってするより、
S_r_c_ ' Shukkin_row_count_
としたほうが、タイプミスや誤読が減って設計コスト下がるよね
むしろアンダーラインなくして頭文字を大文字で対応すべきかなあ
コードが長くなると変数の意味が散逸しかねないけど……
0411デフォルトの名無しさん
2010/05/22(土) 22:45:340412デフォルトの名無しさん
2010/05/22(土) 22:55:31ワケ判らん変数名は付けるな
下手に短い名前なら意味が判る長い変数名の方がよぉ〜っぽど良いわ、ヴォケ
0413デフォルトの名無しさん
2010/05/22(土) 23:09:26300行くらいの短いコード書いてみたが、変数名省略しなくても慣れたらすらすら書けた
コメント部分が200行くらいになったが
>>411
うん、コード書く時は日本語コメントは当然付ける
それに追加で、省略前の変数名明示ってことで
0414デフォルトの名無しさん
2010/05/22(土) 23:09:28COBOLに侵され気味な俺だと、
SHUKKINrowCountかSHUKKIN_rowCountって感じかなあ。
ベタローマ字は全て大文字というのが俺的基本法則。
0415デフォルトの名無しさん
2010/05/22(土) 23:22:55それで可読性や開発効率が上がるなら別にいいじゃんてスタンス
0416デフォルトの名無しさん
2010/05/22(土) 23:30:18その省略前の変数名という考え方がわからん
s_r_c_'出金の行数
とかでいいと思ってしまう
0417デフォルトの名無しさん
2010/05/23(日) 00:26:49Shukkinn_row_count_と言う意味で見るのを比べれば、
保守する時の可読性、認識レベルが異なる
だから逆に、接続を長くして意味を持たせるか、後で読み返した時の読みやすさを高めるために省略するかで迷ってる
日本語変数を使うってのが両方満たして楽なんだが……予期しないエラー引き起こすリスクもある
0418デフォルトの名無しさん
2010/05/23(日) 00:30:35sknRowCnt
0419デフォルトの名無しさん
2010/05/23(日) 00:32:35省略前って言うのは、今Shukkinn_row_count_って変数があるけど、これをS_r_c_に省略した場合
ってことで使ったんだが、↑のように保守作業時に変数の意味を理解させるって側面もある
0420デフォルトの名無しさん
2010/05/23(日) 01:23:02そして「明日の自分は他人」
結論。好きにしろ
0421sage
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演算子等入れても上手くいきません。
どなたか教えていただけますでしょうか。
0422デフォルトの名無しさん
2010/05/23(日) 23:40:15SQLの問題というなら
SQL質疑応答スレ 9問目
http://pc11.2ch.net/test/read.cgi/db/1252492296/l50
若しくは同じデータベース板のAccessスレ(あるのかどうかは知らん)へGo !
0423デフォルトの名無しさん
2010/05/23(日) 23:46:23上手くいかないとき、Sourceにどんな文字列が入っているのか出力して見てはいかが?
0424421
2010/05/23(日) 23:53:16問題はSQL何ですかね?だとすると手がつけられません。
>>423
デバックしたときに見た文字列は上手くいっていました。
ということは外部データの取り込みではLIKE演算子は無理なのでしょうか・・・
0425デフォルトの名無しさん
2010/05/23(日) 23:54:570426デフォルトの名無しさん
2010/05/24(月) 00:00:030427421
2010/05/24(月) 00:05:18IIf(Range("B10") <> "", " AND 依頼者='" & Range("B10").Value & "'", "") & _
のところを、
IIf(Range("B10") <> "", " AND 依頼者 Like'%" & Range("B10").Value & "%", "") & _
へ変えてみても上手くいきませんでした。
もしかして書き方が間違ってますか?
0428デフォルトの名無しさん
2010/05/24(月) 00:14:13デバッグで見ただけでは分かりにくいエラーは有るよ
俺はSQL文をテキストファイルに出力するプロシジャを作って
別途確認する様にしてる w
0429デフォルトの名無しさん
2010/05/24(月) 00:18:14Value & "%" の%の後ろのシングルクォートは?
あと一応Like演算子と文字列の間にスペースを入れようか。
それとセルの内容エスケープしてないのはわざとだよね?
0430デフォルトの名無しさん
2010/05/24(月) 00:25:43先に抜き出す条件を文字列でSQLにぶちこんでみ
それで出来ないなら構文かデータベースチェック
0431421
2010/05/24(月) 00:28:19特に>>427さん
大変ありがとうございます。
恥ずかしながら、後ろ側のシングルクォーテーションが必要とは知りませんでした。
また、Likeの後にスペースを入れていないことも原因のひとつでした。(本当に情けない。。)
>>427さん
後学のため教えていただけますか?
>それとセルの内容エスケープしてないのはわざとだよね?
具体的にはどういったことでしょうか?
0433デフォルトの名無しさん
2010/05/24(月) 00:32:44エスケープっていうのはたとえば、Range("B10")の内容に
シングルクォートが含まれていたりしたらSQL文として
文法エラーになるよ、っていうだけの話。
Like '%'%' みたいになったらシングルクォートの閉じ位置が
変わるので文法エラーになる。
まあ、自分で使うツールってだけならあんまり気にしなくていいよ。
0434421
2010/05/24(月) 00:40:20なるほど・・・
たしかにそうですね。勉強になります。
今回は時間の都合上、運用面で対処したいと思いますが、
今後はそういったことを含めて構築していきたいと思います。
とにかくありがとうございました。
0435デフォルトの名無しさん
2010/05/24(月) 08:17:43TELNETで認識するところまでは出来たのですがそこまでしか出来ませんでした
0436デフォルトの名無しさん
2010/05/24(月) 09:00:54前はいろいろいじくってたらなんとかできたんだけど、今どうやっても上手くいかない。
0437デフォルトの名無しさん
2010/05/24(月) 09:22:38どういう場面を想定したか知らんがrange("a1").value=vbnullstringなんてのは間違いだよなぁ。
0438デフォルトの名無しさん
2010/05/24(月) 09:25:460439デフォルトの名無しさん
2010/05/24(月) 09:30:590440デフォルトの名無しさん
2010/05/24(月) 09:48:26Excelでよく使うVariant型では逆になるぜ。
0441デフォルトの名無しさん
2010/05/24(月) 09:53:23VBみたくAPI使えばいいんでね
0442デフォルトの名無しさん
2010/05/24(月) 10:05:25ぐっとしてきゅって右下にばっする
0443デフォルトの名無しさん
2010/05/24(月) 10:18:36くどくなるので必ずこうしろと言うわけではないが、Variant型の2次元配列の
各要素の型が何型か判定する場合が多いと思うが、判定して文字列だったら
String型の一時変数に格納して処理した方がベター。
そうすればLenBが確かに速い。
数値などの他の型でも一時変数に移した方がいいのは同じ。
0445デフォルトの名無しさん
2010/05/24(月) 11:04:44そんなの、長い文字列を連結したり、RangeのCopyメソッドを使った瞬間に
無意味になる
0446デフォルトの名無しさん
2010/05/24(月) 14:06:07ID 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のメンバーの一つを参照させたいのですが、上記のような記述だとエラーが出ます。
構造体のメンバーに参照(ポインタ)を使いたいのですが方法はないものでしょうか?
0447436
2010/05/24(月) 16:53:58文字列の連結に単純連結がいけないのはほとんどの人が知ってるだろ?
あとはいかにスマートにMidステートメント使うかが腕の見せ所。
まぁ今はバカでも使えるJoinがあるので楽になったけどな。
0448デフォルトの名無しさん
2010/05/24(月) 19:01:08文字列連結なんて大抵は短い文字列同士の連結にしか使わず
さらに回数もたいしたことないのが普通なんだから
その辺をわかってて使うなら普通の簡潔な記述の方が優れてる
0449デフォルトの名無しさん
2010/05/24(月) 20:19:31んなこたー当たり前。
回数の多い例が出てたんでね。
こんなのほとんどの言語で共通だと思うが、未だに知らない人もいるみたいなんでね。
0450デフォルトの名無しさん
2010/05/24(月) 20:34:22俺は大体""と比較するけどな。
0451デフォルトの名無しさん
2010/05/24(月) 22:12:41高速化で本当に困るのはそんなところじゃない
上で出てた文字列連結の知識や、valueを配列に一気に出し入れする技、
WorksheetFunctionを使う技などをまず覚えるべき
0452デフォルトの名無しさん
2010/05/24(月) 22:38:03意識したことないけど、これどんなん?
0453デフォルトの名無しさん
2010/05/24(月) 23:43:02そんな低レベルな話してもしょうがねぇなぁ。
お前の文字列連結を手直ししてやるからここで書いてみ?
A1:A60000の値をカンマで連結するコードを書け。
ただし
0454デフォルトの名無しさん
2010/05/24(月) 23:44:24ただしJoinはなしな。
これは猿でもできるから。
0455デフォルトの名無しさん
2010/05/25(火) 02:44:49VBAですることじゃない
0456デフォルトの名無しさん
2010/05/25(火) 06:08:39以前VBAを馬鹿にした酔っ払いSQL厨がいたが、アルゴリズムも知らない馬鹿だったぜ。
0457デフォルトの名無しさん
2010/05/25(火) 08:09:07俺は猿でもできるJoin使うけど。
0458デフォルトの名無しさん
2010/05/25(火) 08:54:57A6000までコピー
クリップボードから変数に抜き出し
Replaceでvblfを,に変換
書き出し
そこそこ早いかな?
0459デフォルトの名無しさん
2010/05/25(火) 08:59:05回数だけではない
どちらかというとむしろ、文字列が長いかどうかが重要だな
回数というのもどちらかというと、「ペース」と置き換えるべきだし
0460デフォルトの名無しさん
2010/05/25(火) 09:15:490461デフォルトの名無しさん
2010/05/25(火) 10:02:35列Aでもいいな
0462デフォルトの名無しさん
2010/05/25(火) 10:46:290463デフォルトの名無しさん
2010/05/25(火) 11:47:360464デフォルトの名無しさん
2010/05/25(火) 12:24:32実際に文字列連結する場合、配列でもなんでもいいけど書き出してからその処理するのは流石に時間かからないかな
見てないけど
0465デフォルトの名無しさん
2010/05/25(火) 12:48:580466デフォルトの名無しさん
2010/05/25(火) 13:07:400467デフォルトの名無しさん
2010/05/25(火) 13:10:42何がしたいの
0468デフォルトの名無しさん
2010/05/25(火) 13:16:14String型ならSplit()で行けるし、Variant型ならArray()でいけますが、
他の型はどうやって作成すればよいでしょうか?
0469デフォルトの名無しさん
2010/05/25(火) 13:26:26DataObject使うのか?
でもReplaceが遅いからなぁ。
試しに
A1
A2
.
.
A599999
A600000
と2文字〜7文字の60万セルでやってみたら2.8秒だったぜ。
DataObjectとSplitとJoinの併用でもほぼ同じ。
一方Midステートメントは0.6秒。
ループ回して一次元配列に移してJoinは微差でMidステートメントに負けるようだが俺ならJoin使うな。
なんたって楽だからな。
0470デフォルトの名無しさん
2010/05/25(火) 13:34:180471デフォルトの名無しさん
2010/05/25(火) 21:15:37Dictionaryと似たような特性だな。
数万データならそこそこ速いが数十万になるとウンコってやつ。
0472デフォルトの名無しさん
2010/05/25(火) 21:32:170473デフォルトの名無しさん
2010/05/25(火) 21:38:050474デフォルトの名無しさん
2010/05/25(火) 22:51:120475デフォルトの名無しさん
2010/05/25(火) 23:27:54限定条件下になりそうだけど
0476デフォルトの名無しさん
2010/05/26(水) 00:40:460477デフォルトの名無しさん
2010/05/26(水) 17:00:12vbCrLfは10と13だから、SelectCaseでそれぞれ処理し、
2文字ずつカウントする
……と、多分こういう解答を求めてたんだろうか
0478デフォルトの名無しさん
2010/05/26(水) 20:43:51clsConcatenateってなんだろうと思って検索したら
独自に作ったStringBuilderもどきがひっかかった
もし、そういうのを使うならclsConcatenateだけでいいし
vbCrLfでSelect Case云々言ってるのは、なんでそんなことをしてるのか
ちょっとわからない
0479デフォルトの名無しさん
2010/05/26(水) 21:03:22Public変数は、プロシージャの処理終えると値消えてしまうのか?
0480デフォルトの名無しさん
2010/05/26(水) 21:12:04Endステートメントを実行すると初期化されなかったっけ。
0481デフォルトの名無しさん
2010/05/26(水) 22:26:59VBAの処理が終わったあとで変数の内容を見るには、イミディエイトウィンドウで?
たとえば変数aの値を確認したければ?a[Enter]と入力すればいい
ttp://f12.aaa.livedoor.jp/~itatisa/phpup/cgi/src/up9840.png
変数がクリアされる条件は、Endを実行した時(End SubやEnd Functionではなく単独のEnd文)
エディタやマクロの記録などでVBAを書き換えたとき
0482デフォルトの名無しさん
2010/05/26(水) 23:35:58なんか、サンプル載せましたよ
みたいな本ばっかりで、このスレに書いてあるようなことが載ってる本
見たこと無いんだけど
例えば、>>481に書いてあるようなこととか、つい最近話題になった
文字列連結のことだとか、そういうことすら、書いてある本を
ほとんど見たことがない
0483デフォルトの名無しさん
2010/05/26(水) 23:41:14勝負はわからんよなw
0484デフォルトの名無しさん
2010/05/27(木) 00:11:27ExcelVBAスキルアップテクニック
Excelプロフェッショナルエンジニアテクニック
かな
0485デフォルトの名無しさん
2010/05/27(木) 00:26:31VBAはVB6と言語としては全く等価だから
VB6で探したほうがいいね。
0486デフォルトの名無しさん
2010/05/27(木) 05:20:36なるほど。Endで消えてしまうとは、知らなかった。
ありがとう。
0487デフォルトの名無しさん
2010/05/29(土) 20:28:43テキストボックスとテキストボックスなら、図形の矢印で結ぶことができて、
片方のテキストボックスを動かしたら、矢印の線も一緒に動くじゃないですか。
これを、
セルとテキストボックスでやることは出来ないのでしょうか?
つまり、テキストボックスから、矢印を延ばして、あるセルにくっつけます。
そして、どっちを動かしても、矢印で繋がったままにしたいのです。
0488デフォルトの名無しさん
2010/05/30(日) 10:02:240489デフォルトの名無しさん
2010/05/30(日) 12:41:07ユーザーフォームのラベルでバック半透明で文字だけをくっきり表示させたいです。
どうすればよろしいでしょうか?
0490デフォルトの名無しさん
2010/05/30(日) 22:55:02今はShellを使って別プログラムから呼び出してますが、処理が遅くなるので
もっとスマートなやり方があれば教えて下さい。
0491デフォルトの名無しさん
2010/05/31(月) 05:10:330492デフォルトの名無しさん
2010/05/31(月) 08:39:22VBAで作るとすると
1.矢印の起点・終点(高さ)を取得
セルなら(i-1)までの.RowHeightの合計プラス(iの.RowHeight)/2
テキストなら位置プラス(高さ)/2
2.横位置を取得
同様に
3.左右のオブジェクト判定
セル、テキストボックスの右端位置を比較
4.1と2を元に矢印の位置設定
>>499
ラベルのプロパティ→項目別→表示
で好きなの選ぶ
0493デフォルトの名無しさん
2010/06/01(火) 01:02:31表示の中に半透明の設定なくない?
0494デフォルトの名無しさん
2010/06/01(火) 07:19:17EXCELのVBAだけを使って、インターネット(TCP/IP)通信をする
プログラムは作れるのでしょうか?
難易度は問いません。
よろしくお願いします。
0495デフォルトの名無しさん
2010/06/01(火) 08:21:24窓側のコントロールのカスタム描画を使うAPIだな
半透明ってのがイメージ湧かないが
0496487
2010/06/01(火) 12:52:300497デフォルトの名無しさん
2010/06/01(火) 17:06:19DBはMySQLです。
0498497
2010/06/01(火) 17:19:55すみません。
0499デフォルトの名無しさん
2010/06/01(火) 22:20:26複雑な(長い)式になるとTRUEを返される。
何だこれ?
0500デフォルトの名無しさん
2010/06/01(火) 22:24:10別の長い式作って
0501デフォルトの名無しさん
2010/06/01(火) 22:46:14装置からデータをRS-232C経由で取り込むプログラムを書いたんですが、
プログラム動作中はストップキーも聞かず、入力を受け付けてくれない
ようです。これってそういう仕様とあきらめるしかないのでしょうか。
0502デフォルトの名無しさん
2010/06/01(火) 22:51:580503デフォルトの名無しさん
2010/06/02(水) 07:37:520504デフォルトの名無しさん
2010/06/02(水) 11:32:10んなこたぁない。
0505デフォルトの名無しさん
2010/06/02(水) 20:39:09動かないマクロがあるんだけど。
考えられる原因ってどんなのがあるの?
0506デフォルトの名無しさん
2010/06/02(水) 21:40:522007で旧時代の機能は大分整理されたみたいだからな。
0507499
2010/06/02(水) 21:57:24結局TRUEが返される理由はわからんが、
思い通りの結果が出たのでまぁ良しとする。
0508デフォルトの名無しさん
2010/06/02(水) 22:08:20そうなん?ってことは2007で動くように
作りなおさなきゃってこと?
そのまま使える方法ってないのかなぁ?
0509デフォルトの名無しさん
2010/06/03(木) 11:30:032003と2007はまったく別のソフトだと思った方がいい
何も全部作り直さなくても、たいていのマクロは少し修正するだけで使えるようになるはず
0510デフォルトの名無しさん
2010/06/03(木) 19:45:170511デフォルトの名無しさん
2010/06/03(木) 20:22:43速度やExcelそのものの制限に関係なく、
両方で結果が同じになる関数ばかり使ってればいい
0512デフォルトの名無しさん
2010/06/04(金) 06:30:29たとえばどんな関数?
0513デフォルトの名無しさん
2010/06/04(金) 08:14:470514デフォルトの名無しさん
2010/06/04(金) 11:34:280515デフォルトの名無しさん
2010/06/04(金) 12:06:550516デフォルトの名無しさん
2010/06/04(金) 23:56:590517デフォルトの名無しさん
2010/06/05(土) 00:07:43印刷設定について教えていただきたいのですが、
一枚77行で縦に任意の枚数(2枚なら77*2行)にあわせて行を77行ごと追加する
マクロがあるのですが、この作成された任意の枚数の表の印刷範囲についてなのですが、、、
表作成後に表全体を選択して印刷範囲設定しているのですが
With ActiveSheet
.PageSetup.PrintArea = Range(."表全体").Address
End With
※縮尺73%、A3、品質300dpi
プリンターの種類、印刷品質、余白の設定で印刷行数が77からずれることがあります。
【質問】
1.マクロで、縮尺はきにしないで常に77行目に印刷境界線をもってくることはできますでしょうか?
2.また、縮尺50%にしても77行ごとに印刷境界線をもってくることはできますでしょうか?
よろしくお願いいたします。
0518デフォルトの名無しさん
2010/06/05(土) 03:54:520519デフォルトの名無しさん
2010/06/05(土) 04:01:0777行毎に一旦別のシートにコピーして
印刷
その後そのシートは削除するとか
0520デフォルトの名無しさん
2010/06/05(土) 07:11:07つ Citrix Receiver for iPad
0521デフォルトの名無しさん
2010/06/05(土) 20:49:36印刷境界線ってのは何をさしてるんだ?
印刷範囲を77行までにするなら
ActiveSheet.PageSetup.PrintArea = "$1:$77"
78行の前に改ページ入れたいなら
Rows("78:78").Select
ActiveWindow.SelectedSheets.HPageBreaks.Add Before:=ActiveCell
とりあえずマクロの記録でこうなった
0522517
2010/06/06(日) 14:03:42分かりにくい説明ですみません。
縦に1〜77と数字を入れたとして、次ページでまた1〜77といれる。
【縮尺100%】
1
2
3
・
・
76
77
--------改ページのライン
1
2
3
・
・
76
77
-------改ページのライン
0523517
2010/06/06(日) 14:05:331
2
3
・
・
76
77
1
2
--------改ページのライン
3
・
・
76
77
1
2
3
4
--------改ページのライン
縮尺が100→90%になったときに改ページラインがずれてしまいます。(列側のラインも同様にずれます)
また印刷の余白を変更したり、解像度を変更したりしてもずれます。
複数シートに同じような表があり、マクロで一括で体裁を整えたいのですが、
上記のようなとき、手動で改ページラインを77と1の間にもっていけば
自動的に100%になり綺麗に印刷することができます。
この時手動であれば90%のままで77行ごとにもできます。
これをマクロで印刷範囲を77行ごとにしたいのです。
※縮尺は問いません。(縮尺指定できるのであればやり方だけでも教えていただけたらと思いますが・・・)
0524デフォルトの名無しさん
2010/06/06(日) 14:52:35>>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でも動くと思う
暗黙の型変換気持ち悪いとかいう突っ込み禁止
0525517
2010/06/06(日) 17:26:45ご指摘ありがとうございます。
マクロはネットで調べながら覚えたもので、勉強不足ですみません。
そして、謎が解けました!
ActiveSheet.ResetAllPageBreaks
の時点で自動で縮尺が100%になるんですね。
この後に縮尺を90%にしてから
HPageBreaks.Add
で改ページをいれてあげたらうまくいきました。
ありがとうございました。
0526デフォルトの名無しさん
2010/06/06(日) 20:12:11ユーザーフォーマットを使用してコンボボックスにユーザーID(A列)を
配置し、指定されたA列のB列、C列データを呼び出し変更を加えれるようにしたいのですが、
コンボボックスとテキストボックスをどのように紐つければよいのでしょうか?
A B C
1 犬 雄
2 猫 雄
3 鳥 雌
0527デフォルトの名無しさん
2010/06/06(日) 20:35:570528デフォルトの名無しさん
2010/06/06(日) 21:23:42中のプログラムはモジュール名から何まで全く同じで、
途中で参照するファイル(テキスト)だけが異なります。
別の業務をしている人向けに、それぞれに作ったのですが、
兼業する人が両方のアドインを追加すると、うまく動きません。
具体的には、最初に動かした方のテキストをずっと読んでしまうようです。
どこを変えれば動くようになるでしょうか。
0529デフォルトの名無しさん
2010/06/06(日) 21:58:410530デフォルトの名無しさん
2010/06/06(日) 22:01:43処理なり使ってるシステムから切り替え出来ないの?
0531デフォルトの名無しさん
2010/06/07(月) 21:22:06他のシートのセルに場合わけして入れる場合、どのように書いたらよいのでしょうか?
0532デフォルトの名無しさん
2010/06/07(月) 21:46:32ループ処理
Hairetu(i,n)の条件分岐でHairetuBにでも格納
sheets( ).rante(,) = HairetuB
0533デフォルトの名無しさん
2010/06/07(月) 22:08:28最初の変数の代入は、どのように記述すればよいのですか?
二次元配列を宣言して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
こうじゃないですよね。。
0534デフォルトの名無しさん
2010/06/07(月) 22:14:310535デフォルトの名無しさん
2010/06/07(月) 22:47:54すみません、最後の別シートの格納の仕方についてなのですが…
例えば、x(2,3)の内容をRange("C2")に入れるなど、所定の場所に格納
する際に、for文で回して入れる方法はあるのでしょうか?
0536デフォルトの名無しさん
2010/06/07(月) 23:12:48ワークシートの内容を配列に入れるには、配列を二次元のVariant型にしておけば、セルがいくつあっても一気に代入できる。
Forを使うより何倍も速いしプログラムも簡単。
String型にしてしまうとFor〜Nextを使うような遅い方法しか使えなくなる。
0537デフォルトの名無しさん
2010/06/07(月) 23:14:50そりゃ
Range("C2") = x(2, 3)
だろう。
ほかのデータはどこに入れるの?規則的に並んでなければForを使うのは面倒だよ。
0538デフォルトの名無しさん
2010/06/08(火) 18:05:080539デフォルトの名無しさん
2010/06/08(火) 23:49:19セル範囲を一括で配列に格納した場合の添え字を
0からスタートさせることは出来ますか?
普通に格納するとx(1,1)から数値が入ってしまうところを
x(0,0)から数値が入るようにしたいのです。
今は別の配列に入れ替えてるのですが、ちょっと不便で・・・
よろしくお願いします。
0540デフォルトの名無しさん
2010/06/08(火) 23:59:25テキストボックスのScroolBarsプロパティをfmScrollBarBothに設定しているんですけど、
ホイールマウスの真ん中のホイール部分を回転させても有効になりません。
有効にする方法ってありますか?
0541デフォルトの名無しさん
2010/06/09(水) 02:26:41無理。
VBAでは、0オリジンに拘るよりも、1オリジンを素直に受け入れた方が何かと楽だよ。
0542デフォルトの名無しさん
2010/06/09(水) 04:03:16Aと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
0543デフォルトの名無しさん
2010/06/09(水) 04:56:01大事なとこが省略されてる気がする
とりあえず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
こんな回答しかできません
出来上がりのイメージとかあればもうちょいマシな回答できるかも
0544デフォルトの名無しさん
2010/06/09(水) 05:03:23とりあえず質問そのままの解答だと
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
それから右クリックコピーってなんだ?
セルに数値を入れるだけなら右クリックも貼り付けも必要ないんだが。
0545デフォルトの名無しさん
2010/06/09(水) 09:39:29rowCnt = WorksheetFunction.Max(A,B)
colCnt = WorksheetFunction.Min(A,B)
もしくは
If A < B Then
Dim swap&
swap = A
A = B
B = A
End If
ってやりたいだけか?
0546デフォルトの名無しさん
2010/06/09(水) 16:12:47上記のようなインターフェースのサブルーチンがあるとします
inRangeのデータに何らかの演算をしてoutRangeにコピーします
このサブルーチンをワークシートの上のほうにある関数入力部分に
=Hoge(A1:B2, C1:D2)
のように入力したのですがうまく動いてくれません
引数付きのサブルーチンをワークシート上で手動呼び出しするにはどうすればいいんでしょうか?
0547デフォルトの名無しさん
2010/06/09(水) 17:02:140548デフォルトの名無しさん
2010/06/09(水) 18:59:39シート11のb2からb8まで順番に貼り付けるにはどうすればよろしいのでしょうか?
0549デフォルトの名無しさん
2010/06/09(水) 19:00:27それぞれ 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)
0550デフォルトの名無しさん
2010/06/09(水) 20:25:57SubをPublic Functionにしろ。
あとワークシートにVBA記述すんな。モジュールに書け。
関数の入力のダイアログでユーザ定義関数の一覧部分に
自分の定義したFunctionが出てるか確認しろ。
以上。
0551デフォルトの名無しさん
2010/06/10(木) 07:04:06ところが、「ActiveXはオブジェクトを作成できません。」とエラーが出てしまいます。
RS232Cの入出力でも同様に出てしまいました。
VB6.0ランタイムはインストール済です。参照設定もしています。
どうしてでしょうか?解決策は?
0552デフォルトの名無しさん
2010/06/10(木) 07:26:00http://oshiete.goo.ne.jp/qa/5065179.html
0553デフォルトの名無しさん
2010/06/10(木) 14:36:54・ワークシートA(以下WSA)は日次報告の原紙が作成済み
・ワークシートB(以下WSB)の列Cには日次報告の対象となる日付(MMDD形式)が入力済み
上記の2つのシートを使い、
1.「WSA」を「WSB:C列に入っている日付の個数分作成」し、
2.1.で作成されたWSのシート名を「WSBの日次報告の対象となる日付」に変更
するというマクロはどのように組めばよいのでしょうか?
0554デフォルトの名無しさん
2010/06/10(木) 15:14:06実際に操作してマクロの記録しろよ
0555デフォルトの名無しさん
2010/06/10(木) 17:21:40Dim 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枚目が日付の入ったシートって前提な
0556デフォルトの名無しさん
2010/06/10(木) 20:11:030557デフォルトの名無しさん
2010/06/10(木) 20:54:18一応可能じゃないかと。
0558553
2010/06/10(木) 23:26:31すみません…
駆け出しなもので、余計なコードが入ってしまうと理解に時間がかかるため
エディターで編集しています
>>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
0559デフォルトの名無しさん
2010/06/11(金) 01:40:47書いてみた
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
0560デフォルトの名無しさん
2010/06/11(金) 07:44:47Sub 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
0561デフォルトの名無しさん
2010/06/11(金) 07:57:31Sub 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
0562デフォルトの名無しさん
2010/06/11(金) 09:57:55深夜割増、早朝割増、深夜休憩、早朝休憩の計算方法だと思うんだけど、
これってVBA使わずに完全に解決してる例がみつからない。
ここまできっちりやるならVBAもしくはシステム化が普通なのかな?
タイムカードは基本的には休憩時間を考慮しないし、そのへんなかなか難しいね。
0563デフォルトの名無しさん
2010/06/11(金) 11:31:45君の能力の問題じゃね?
0564デフォルトの名無しさん
2010/06/11(金) 12:14:02俺のググる能力が足りなかったのか!!
0565デフォルトの名無しさん
2010/06/11(金) 13:07:52そういうの作った人が、やめちゃってわかんないから、バグとってくれって頼まれたことがある
まあ、ものすごく長い式が詰め込まれとったわ
VBA使わずにできなくは無いのは確かだけど
VBA使えるならそのほうが圧倒的に楽
0566デフォルトの名無しさん
2010/06/11(金) 13:25:52読む方からしても、関数よりVBAの方がわかりやすいってことあるよね。
うちにもExcel2003の列数の制限いっぱいまで式が詰め込んであるワークシートが
複数枚、さらに記録機能で作っただけのマクロも大量の悲惨なやつがあるんだが、
とてもじゃないが解析する気にならない。当然作った人は辞めてる。
しかも経理用のだからよくわからん。
ただ、VBAとかマクロを使わずにワークシート関数のみを駆使したシートを
作ると自己満足度が高いので、気持ち的にはわかることはわかる。
0567デフォルトの名無しさん
2010/06/11(金) 15:24:34一列に一個**時間を計算して、そのsum()なんかを設定値と比較して条件式なんかを
設定した方が、VBAでごちゃごちゃやるよりシンプルだと思うのは俺だけか。
0568デフォルトの名無しさん
2010/06/11(金) 15:29:440569デフォルトの名無しさん
2010/06/11(金) 15:55:02まあ、そう思うなら
区切り時間15分、夜間割り増し、深夜割り増し、早朝割り増し、休日割り増し、休憩(外出)時間分減算
こんくらいでいいから、どんだけすっきり書けるか、挑戦してみw
(余力があるなら、さらに休日の夜間深夜早朝とかも入れてね)
入力はタイムカードの時間記録4個ね(出社、退社、時間内出、入)
0570デフォルトの名無しさん
2010/06/11(金) 16:15:40平日の深夜早朝の手当は就業規則関係ないだろ。
>>569
休日の深夜早朝は法律には無いと思うので、
そういう就業規則があるところは羨ましいな。
やってみるとめんどくさいのがまともな勤怠表。
0571デフォルトの名無しさん
2010/06/11(金) 17:40:300572デフォルトの名無しさん
2010/06/11(金) 17:43:26汎用性のあるものを作るのはむずかしいし、自分の会社用の奴をごりごり作ったとしても
公開しないからじゃないの?
0573デフォルトの名無しさん
2010/06/11(金) 17:47:52逆にVBAじゃないと完全に解決できないと思う理由は何なの?
0574デフォルトの名無しさん
2010/06/11(金) 18:29:45俺なら迷わずVBAを使う
0575デフォルトの名無しさん
2010/06/11(金) 19:56:22エクセルの式は基本的に1行にまとめないといけないから複雑なことをするには向いてない
無理にやろうとすると大変な思いをする
大量の計算を1行に詰め込むのはプログラミング的にはクソの代表だしさw
VBAならそんな制約は無いし元々そういうややこしいことをするための物だから楽にできる
使える人にとってはね
使えない人がこれから覚えてでも楽かと問われれば微妙w
使えるようになるまでが大変だから(その人のセンスしだいってとこもあるけど)
0576デフォルトの名無しさん
2010/06/11(金) 20:31:13計算の途中経過を保存したり再利用すること
場合分けすること
だから、これらの処理が必要ならVBAを使った方がいい
計算式が独立してて一つ結果が出たらそれで終わりって場合はワークシート関数でやる
0577デフォルトの名無しさん
2010/06/11(金) 20:32:34ユーザー定義関数をワークシートに張った方がずっと良いと思う。
マクロ有効にしたくない?知らんがな。
0578デフォルトの名無しさん
2010/06/12(土) 01:40:11それを俺に聞かれても困るがな。
0579デフォルトの名無しさん
2010/06/12(土) 01:44:46Excel関数だと無駄な同じ式を30日分入れとかにゃならんし、休日判定なんかもめんどくさい。
0580デフォルトの名無しさん
2010/06/12(土) 02:49:29ネットにアクセスしてYahooカレンダーからデータを抜き出す
祝日法が改正されてもYahooが潰れない限り全自動で対応できる
0581デフォルトの名無しさん
2010/06/12(土) 03:14:36法律が出来ても変わるし、天ちゃんが死んでも変わる。
0582デフォルトの名無しさん
2010/06/12(土) 03:51:21ワークシートコピー() とは
rは変数だよん
r に1を設定
ワークシート("日付データ")のセル(r,9)が""でない限り
ワークシート("原資")をワークシートコレクションの現在の個数番目の
ワークシートの後に複写,
現在のシートの名前をワークシート("日付データ")のセル(r,9)に書かれている
文字列に設定,
rにr+1を設定
以上繰り返し
エクセルの警告表示をオフに
ワークシート("原紙")を削除
pは文字列変数だよん
pにワークシート("日付データ")の範囲("A6:A6")の文字列を設定
nは文字列変数だよん
nにワークシート("日付データ")の範囲("A7:A7")の文字列を設定
現在のブックをp&"¥"&n&".xls"という名前で保存
エクセルを終了
わかった?
0583デフォルトの名無しさん
2010/06/12(土) 06:20:35ほとんどのPCで1分程度で終わるマクロが、あるPCだけエラーは吐かないものの数時間待ってても返ってきません。
デバッグモードに入りどこで止まっているかを見ても無限ループに入っているわけではなさそうです。
PCのスペックは同等、エクセルとVBのバージョンも一緒です。
考えられる原因はなんでしょうか?
0584デフォルトの名無しさん
2010/06/12(土) 08:14:52WebAPIは基本ですよね。
0585デフォルトの名無しさん
2010/06/12(土) 08:19:08on error resume next でエラーループさせてるとか。
レジストリ書き換えが上手く行って無いとか。
iniの読み込みがいつまでもtrueにならないとか。
エラー吐かない、と書いてるならば on error resume next は入れて無いよね?
デバッグで止まっているなら、そこが問題なんじゃないか?
do loop 使ってる?
いかんせん情報が少なすぎる。
0586デフォルトの名無しさん
2010/06/12(土) 09:15:000587デフォルトの名無しさん
2010/06/12(土) 09:51:460588デフォルトの名無しさん
2010/06/12(土) 10:09:55あれは祝日がないのか?
0589デフォルトの名無しさん
2010/06/12(土) 13:40:59Windowsのバージョンが変わった場合とか、そもそもMacが共通だとか、
環境によってはライブラリが無いとか、そういう制限て無いの?
0590デフォルトの名無しさん
2010/06/12(土) 13:42:58もう祝日は数年分の祝日リストをワークシートに書いといてそれを見るようにすればいいんじゃね?
配布が簡単なところがExcel開発の良いところだし。
0591デフォルトの名無しさん
2010/06/12(土) 15:39:04もうすこし詳細調べてみます
>>586
おk
0592デフォルトの名無しさん
2010/06/12(土) 17:32:51多分フリーで最新の祝日反映されたカレンダー一覧がごろごろ堕ちてるだろ
0593デフォルトの名無しさん
2010/06/12(土) 18:17:50ほとんどがXML(or SGML)ファイルなので大丈夫と思うよ。
欠点はスキーマが統一化されてない事かな。
0594デフォルトの名無しさん
2010/06/13(日) 11:10:35EXCELでもACCESSでもいいんですがVBAを書くとき、
ネットとか既存のシステム?からVBAを借用してきて、自分用に編集することってあります?
それとも、全部一から書きますか?
0595デフォルトの名無しさん
2010/06/13(日) 11:59:23ネットにあるサンプルを利用するのは凄く勉強になるけど、
必ず自分で手打ちする事が大切かな。
面倒かもしれないけど、コードを印刷して自分で手打ちするのと、
ただコピペして終わりにするのでは、大きな差があると思う。
自分の物にしたいなら、コード手打ちが良いよ。
もちろん1から組めるに越した事はないけどね。
0596デフォルトの名無しさん
2010/06/13(日) 12:02:29なんかものすごいバグが紛れ込みそうで不安
0597デフォルトの名無しさん
2010/06/13(日) 12:06:22VBAのライブラリ結局生ソースだろw
0598デフォルトの名無しさん
2010/06/13(日) 12:09:380599デフォルトの名無しさん
2010/06/13(日) 12:11:40ライブラリとしてまとまってるクラスや関数を使うのと
実装をいじるのでは全然違うでしょ
0600デフォルトの名無しさん
2010/06/13(日) 12:20:17ネットで拾った物は自分で、その部分のみをテストして納得したら
編集し直して使うのはある。
(変数名を自分がわかり易い名前にするとか
0601デフォルトの名無しさん
2010/06/13(日) 12:24:10定数化のルールとか、インデントの入れ方とか。
range("A1") で書く人もいれば、cells(1,1) で書く人もいる訳で。
そう考えると、やっぱり自分で書きなおした方が良いな。
0602デフォルトの名無しさん
2010/06/13(日) 12:37:19たいしてかわらん
そのまま使えるものをコピペしてくるなら
ライブラリだろうが、実装だろうが変わりないじゃん
アレンジがひつようなら、やっぱりかわらんじゃん
0603デフォルトの名無しさん
2010/06/13(日) 12:41:12今まで、会社で既存のものを流用したり、ネットから一部コピーや
本に書いてるのを打ち込んだりしてました。
知識不足のため、全部自分で考えてやると時間がかかり過ぎて・・・
でも、ちゃんと覚えていくしかないですね。
0604デフォルトの名無しさん
2010/06/13(日) 12:42:46>>603は594です。
0605デフォルトの名無しさん
2010/06/13(日) 12:45:25そのまま使えて、副作用もないコードならコピペでもいいかもね
でもまずは副作用がないことを確認して、アレンジするなら新しい副作用が出ないように書かないといけない
規模が小さければどうって事ないが、普通これは結構な手間になり、見逃せばバグにもなる
ライブラリはそういうことも実装する側が考えている(というか考えるべき)からその手間もリスクも少ない
0606デフォルトの名無しさん
2010/06/13(日) 21:43:36手動でやるときは、メニューバーから選択して、一連のキー入力をするだけなんですが、
vbaでこのような処理を自動化するにはどうすればよいでしょうか?
もちろん、本来はアドインのインタフェースを調べてそれを呼ぶべきなんでしょうが、
仕様がまったく不明なので、手動処理をなぞれないかと思っています。
0607デフォルトの名無しさん
2010/06/13(日) 22:10:430608デフォルトの名無しさん
2010/06/14(月) 13:35:56VBAじゃなくて、なんかの自動化ソフトを使ったら?
0609デフォルトの名無しさん
2010/06/14(月) 14:31:380610デフォルトの名無しさん
2010/06/14(月) 14:47:14決まった順番でキーを押すだけならSendKeysという命令があるけど
副作用も多いので使えるかどうかはよく検討する必要がある。
0611デフォルトの名無しさん
2010/06/14(月) 16:20:400612デフォルトの名無しさん
2010/06/14(月) 16:46:00アドインもなんかなかったっけ
0613デフォルトの名無しさん
2010/06/14(月) 16:53:05そのアドイン自体の操作をSendKeysでできるのかなってこと
0614デフォルトの名無しさん
2010/06/14(月) 17:03:08駄目だと思う。
0615デフォルトの名無しさん
2010/06/15(火) 18:09:29http://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
0616デフォルトの名無しさん
2010/06/16(水) 10:05:490617デフォルトの名無しさん
2010/06/16(水) 11:18:58ほるだのなかに
インデックス.html
ページ1.HTML
とかを見つけたら、
http://www.ほにゃらら/インデックス.HTML
って合成したいんだろう
コードは見てない
0618デフォルトの名無しさん
2010/06/16(水) 12:22:10本当にそこしかいじってないんなら、変数FilePathsが宣言も初期化もされていないから
フルパスが出るわけない
0619デフォルトの名無しさん
2010/06/16(水) 14:50:43「抽出」の意味が不明。(コード見ればわかるかもしれんが)
> ファイルがある場所のみしか抽出されない
「ファイルがある場所」以外は、一体どこの何を抽出したいのか?
「選んだ階層以下すべてのファイル」が対象ではないのか。
0620デフォルトの名無しさん
2010/06/16(水) 14:57:39宣言はしてあります。
ただ、全部コピペすると書き込めなかったので・・・。
>>619
そうです。その通りです。
選んだフォルダの階層以下すべてのファイルのフルパスを、
エクセル上に書き出したいんです。
今のままだと、ファイルのあるフォルダしか書き出されない上に、
そのファイルのあるフォルダよりもっと上の階層がなぜか消えてしまってるんです。
0621デフォルトの名無しさん
2010/06/16(水) 16:04:38byval と byref を間違えてるに一票
0622デフォルトの名無しさん
2010/06/16(水) 16:06:27リンク踏んだけど、そもそもそのページが読む気失せる作りだわ
0623デフォルトの名無しさん
2010/06/16(水) 17:23:07暇だったのでやてみた
FilePaths をグローバルに宣言して
全体処理のほうにこれを書いて
FilePaths = "http://wwww.test.com/"
再帰のほうのこれを修正
FilePaths = "http://wwww.test.com" & FilePaths & "/" & objPATH.Name & "/"
↓
FilePaths = FilePaths & objPATH.Name & "/"
で、カラム位置は別として、希望の文字列が得られてると思うが?
だめなら、元のソースが壊れてると思われ、コピペからヤリナオスベシ
0624デフォルトの名無しさん
2010/06/16(水) 17:26:37ページの作りはどうでも、書いてるコードの内容が全体的にヘタクソ杉。
よくあんなの公開できるもんだと感心する。
0625デフォルトの名無しさん
2010/06/16(水) 17:29:220626デフォルトの名無しさん
2010/06/16(水) 17:35:14>>623
おっと、バグッテた
再帰のプロシージャの中で
dim tmp しといて
FilePaths = FilePaths & objPATH.Name & "/"
↓
tmp = FilePaths
FilePaths = FilePaths & objPATH.Name & "/"
出口で
FilePaths=tmp
これでいけるわ
0627デフォルトの名無しさん
2010/06/16(水) 17:36:08悪口しかいえないやつより100万倍まし
0628デフォルトの名無しさん
2010/06/16(水) 17:45:15c++を知らないvb使いとしては、参照を受け取るときのconstの意味がわからん
どういう動作なのか説明してくれたら、VBではこうだと言えるカモ
0629デフォルトの名無しさん
2010/06/16(水) 17:53:47例えば配列やクラスをディープコピーして渡すのはコストがかかるので参照で渡す
けど参照で渡したときに間違って書き込みをしたくない場合につけるセーフティみたいなもんです
ようするに読み取りだけできて書き込みはできない引数のことです
0630デフォルトの名無しさん
2010/06/16(水) 17:58:39あ〜そだ、グローバルで宣言したFailePathsを引きずり回してダサダサなので
ソースをかっこよくしたいなら、引数のほうに入れたほうがいいね
自分でやってね
0631デフォルトの名無しさん
2010/06/16(水) 17:59:00VBAにはそういう機能はない
0632デフォルトの名無しさん
2010/06/16(水) 18:02:08しょぼん・・・どうもでした
0633デフォルトの名無しさん
2010/06/17(木) 15:48:05ありがとうございました!
グローバル変数の存在を思いっきり忘れてました・・・。
0634デフォルトの名無しさん
2010/06/18(金) 00:58:58今A1からD10まで数字が埋まった表があります
このうちB1〜B10を選択し、コピー、F1〜F10に貼り付けするとします
このB1〜B10を選択するときに、直接"B1:B10""指定でなく、「表上の左から2列目、一番上から一番下までの範囲を選択」、
としたいのですが、どのように書けばよろしいのでしょうか?
表はいくつかあり、それぞれ縦のデータ数が10だったり15だったりまちまちなため、セル指定だと対応できないので困っています・・・
0635デフォルトの名無しさん
2010/06/18(金) 01:31:16「表上の左から2列目、一番上から一番下までの範囲を選択」
だと
途中に空白セルがないなら
Range(Cells(1, 2), Cells(1, 2).End(xlDown)).Select
とかする
個人的には好きではないけど
途中に空白セルがあった場合なんかは
Range(Cells(1, 2), Cells(65536, 2).End(xlUp)).Select
の方がいいかも
0636デフォルトの名無しさん
2010/06/18(金) 01:45:50B1からデータの入っているセル範囲を自動的に求めてコピー
Intersect(Range("B1").CurrentRegion, Range("B:B")).Copy
0637デフォルトの名無しさん
2010/06/18(金) 02:55:16Columns("B:B").Select とか
Columns(2).Select とかで良いんじゃ?
んで
Selection.Copy でコピーして
Columns("F:F").Select でF列選択
ActiveSheet.Paste ではりつけ
つかまずはマクロの記録
0638デフォルトの名無しさん
2010/06/18(金) 15:23:29こんなやり方初めて知った。
でも、空白セルがあるとそこで途切れてしまうから、結局>>635のほうがいいのかな。
65536って入力するより、rows.countのほうがいいだろうけど。
0639デフォルトの名無しさん
2010/06/18(金) 16:22:57途中に空白が入ってデータが飛び飛びになることはあるのか。
このあたりが条件として欲しいところだな。
それによって手間や方法が変わってくる。
0640634
2010/06/18(金) 20:50:20以下のように組むことで、一応目的達成することができました
ActiveCell.CurrentRegion.Select
Selection.Offset(0, 0).Columns(2).Copy
ActiveCell.Offset(0, 5).Select
ActiveSheet.Paste
0641デフォルトの名無しさん
2010/06/18(金) 21:11:18それでいいんなら1行にまとまるよ
ActiveCell.CurrentRegion.Columns(2).Copy Destination:=ActiveCell.Offset(0, 5)
0642デフォルトの名無しさん
2010/06/18(金) 21:12:41セレクトしてる意味がない
これで充分
Columns(2).Copy
Columns(2).Offset(0, 5).PasteSpecial
0643デフォルトの名無しさん
2010/06/19(土) 23:28:29サンプルが見つからなくて何とか以下のようなものはできました。
どこか問題はないでしょうか?とくに 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
0644デフォルトの名無しさん
2010/06/20(日) 00:37:34とりあえず、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のエイリアスとかまで確認できるな。
0645デフォルトの名無しさん
2010/06/20(日) 13:06:43それ以前に.ZIPがShellで処理される保障はないと思うがそれはいいのか?
つかエクセル関係ないからスレ違い
テンプレなくなってるんだな
0646デフォルトの名無しさん
2010/06/21(月) 16:48:150647デフォルトの名無しさん
2010/06/21(月) 16:57:590648デフォルトの名無しさん
2010/06/21(月) 18:29:27Windows 3.1+Excel 5.0の考慮も必要だね!
0649デフォルトの名無しさん
2010/06/21(月) 20:57:020650デフォルトの名無しさん
2010/06/21(月) 21:38:02× Set folder = m_shell.Namespace("c:\test.zip")
○ Set folder = m_shell.Namespace(FileName)
0651643
2010/06/21(月) 23:37:34ありがとうございます。
残念ながら英語版しかないようですね。
>645
zipfldr.dllが解除されている場合とかでしょうか?
>650
テストしたのをそのままあげてしまいました。
そこですが、fso.GetAbsolutePathName で取得したものを
渡さないと時々取得できないことがあるようです。
原因はさっぱりわかりません。
0652デフォルトの名無しさん
2010/06/22(火) 14:36:04>渡さないと時々取得できないことがあるようです。
>原因はさっぱりわかりません。
なぜだろうね
0653デフォルトの名無しさん
2010/06/22(火) 14:46:040654デフォルトの名無しさん
2010/06/22(火) 17:02:02どっかいけ、アホ
0655デフォルトの名無しさん
2010/06/22(火) 22:46:430656デフォルトの名無しさん
2010/06/22(火) 23:17:450657デフォルトの名無しさん
2010/06/22(火) 23:35:530658デフォルトの名無しさん
2010/06/23(水) 19:22:110659デフォルトの名無しさん
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
0660デフォルトの名無しさん
2010/06/25(金) 18:42:580661デフォルトの名無しさん
2010/06/25(金) 22:56:29グラフ内の座標って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
0662デフォルトの名無しさん
2010/06/26(土) 23:30:08A1セルの大きさが基準になる。手順は以下。これで、(10,10)セルにグラフを移動とか出来る。
但し、全セルが同じ大きさであることが重要。
詳細は忘れたから調べてwww
�@A1セルの大きさを変更 or 全セルの大きさを整える
�AA1セルの縦横サイズを取得
�B座標位置(左上位置になる)を指定する
0663662
2010/06/26(土) 23:33:24まじすまそ
0664デフォルトの名無しさん
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
0665デフォルトの名無しさん
2010/06/27(日) 02:03:45動いてますよ?
もしかして、ワークシートに書き込みたいのなら
Range("A1:A5") = Val
を最後に足しとけばOKかと
0666664
2010/06/27(日) 02:07:06ソースの置換処理内容だけ見るとわざわざVBAでやる必要ない感じですが
実際は複雑な正規表現処理を入れる予定です
上記ソースよりも簡単に指定したセルを正規表現で置換できる処理がありましたら、
合わせてご教授頂ければと思います
0667デフォルトの名無しさん
2010/06/27(日) 02:24:08おっしゃる通りでした
Range("A1:A5").Value = Val
でワークシートに置換した値が入りました
ありがとうございました!
0668デフォルトの名無しさん
2010/06/27(日) 09:36:010669デフォルトの名無しさん
2010/06/27(日) 10:12:08老婆心ながら、setしたobject型変数は最後に開放しておいた方がいいよ。
end subのすぐ前でOK。
0670デフォルトの名無しさん
2010/06/27(日) 14:23:54なんで? 不要だろ
0671デフォルトの名無しさん
2010/06/27(日) 14:25:520672664
2010/06/27(日) 15:51:40個人的にはそんな事より"A1:A5"の範囲ならまだしも
セル範囲が増えた場合オーバーフローしないか心配です
何か良い方法ないですかねぇ
配列を使わずにセル範囲を一つ一つループで置換orスルーできるような処理があれば1番なんですが
0673デフォルトの名無しさん
2010/06/27(日) 15:55:12完全に不要。
あと、解放、な。
0674デフォルトの名無しさん
2010/06/27(日) 15:56:56何がどうオーバーフローするんだ?
0675デフォルトの名無しさん
2010/06/27(日) 16:06:12いつまでもオブジェクトが削除されないとかVB.netで聞いた事ある
0676デフォルトの名無しさん
2010/06/27(日) 16:12:26勘違いしている予感。
0677デフォルトの名無しさん
2010/06/27(日) 16:23:59それに反しなければわざわざリリースなんて要らん。
0678672
2010/06/27(日) 16:26:01ちょっとまだ試行中なのですが、例えば配列数を膨大な数にした場合や
各配列内のデータ(取得したセルの値)、文字数が多い場合等です
Variant型を超える事はないと思ってはいますが、
少し今のやり方だと心配なんですよね
0679デフォルトの名無しさん
2010/06/27(日) 16:41:37キャッシュ(笑)
VB.net(笑)
適当なこと言ってんなハゲ
0680デフォルトの名無しさん
2010/06/27(日) 17:51:36これならどうだ
0681デフォルトの名無しさん
2010/06/27(日) 18:46:33setした物はnothingにして終わらせる、って教わったんだ。
当時聞いた話では、メモリを占有し続けるからって感じで納得してたんだけど、
これは嘘なのかな?
マナーとしてnothingを代入してやるのか、それとも技術的な理由があるのか、それが知りたい。
nothing入れてやる必要が無いなら、余計なコード書きたくないし、教えてください。
0682デフォルトの名無しさん
2010/06/27(日) 19:41:25これは嘘ではない
0683デフォルトの名無しさん
2010/06/27(日) 19:49:31nothingを代入しても、そのメモリがいつ開放されるかは定かではない
nothingを代入しなくても、その変数が無効になれば、その領域は自動的に開放される
原則はこういうこと
昔は使い終わったらすぐにnothing代入して、開放可能にしましょうってのが主流だった
今は特殊なオブジェクトでもない限り、あんまり気にしなくていいと思うぞ
0684デフォルトの名無しさん
2010/06/27(日) 19:57:09無駄なもの
最後にnothing
最後にerase
とか
他にもあるんだろうけど
0685デフォルトの名無しさん
2010/06/27(日) 20:09:26ありがとう。
俺、後輩にいつもnothingで終わらせろって言ってた・・・。
先輩の指導を鵜呑みにして、自分で調べなかったのが凄く恥ずかしい。
nothing忘れると、先輩が口を酸っぱくして指摘してたんで、そうと信じてた。
>nothingを代入しなくても、その変数が無効になれば、その領域は自動的に開放される
VBAの場合はend subを通った時点でdimが無効になるから、基本的にはset nothingいらないのかぁ・・・。
本当にありがとう。
0686デフォルトの名無しさん
2010/06/27(日) 20:53:29Nothingしないと警告でるよ
0687デフォルトの名無しさん
2010/06/27(日) 21:21:130688デフォルトの名無しさん
2010/06/27(日) 21:38:02俺は無駄なNothing代入はいらない派だが、またそうやって人の言うこと鵜呑みにするなよ?
VBAは参照カウント方式だから、参照がなくなった時点で自動的に解放されるが、
循環参照(オブジェクトAとBがお互いの参照を保持しちゃってるような場合)があるときは
明示的に解放してやらないとメモリリークする
とりあえずNothingで終わらせておけば問題は発生しないし思考停止できる、というのも一つの考え方ではある
0689デフォルトの名無しさん
2010/06/27(日) 23:43:38>>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
このプロシジャ呼ぶとちょっとずつメモリ使用量が増加していくぞ
0690デフォルトの名無しさん
2010/06/28(月) 00:31:57いるってやつは自分が作るときに使えばいい
わざわざ他人のコーディングを否定すんなよクズども
いい加減この無限ループやめろっての
ここまでテンプレ
0691デフォルトの名無しさん
2010/06/28(月) 01:10:01質問されたら答えるだけ
間違いを教えていいわけない
結論はどっちでもいいと答えるのかもしれないけど
0692デフォルトの名無しさん
2010/06/28(月) 09:06:38Case文で全文字毎に置換するしかないですかね?
0693デフォルトの名無しさん
2010/06/28(月) 09:34:12つ素寅昆布
0694デフォルトの名無しさん
2010/06/28(月) 09:34:310695デフォルトの名無しさん
2010/06/28(月) 11:02:28まんこの中見る器具!
0696デフォルトの名無しさん
2010/06/28(月) 11:40:42記号もカナも、半角に変換できる文字は全部変換してもいいんならStrconv
英数以外は変換したくないんなら1文字ずつやるしかない
0697デフォルトの名無しさん
2010/06/28(月) 15:54:160698デフォルトの名無しさん
2010/06/28(月) 17:29:18つ性器豹源
0699デフォルトの名無しさん
2010/06/28(月) 19:45:41一文字ずつInStrで評価、ってのが定番か。
0700デフォルトの名無しさん
2010/06/28(月) 20:28:340701692
2010/06/28(月) 21:05:33なるほど、文字列内に全角記号や全角カタカナもあるので一文字ずつの処理になりそうです
文字列に規則性がないので正規表現も微妙です
一度全てストラコンブで半角にしてから一文字ずつ半角カタカナの文字コードを
全角カタカナの文字コードに置換するのが早いのかなぁ
0702デフォルトの名無しさん
2010/06/28(月) 21:14:020703デフォルトの名無しさん
2010/06/28(月) 22:06:57昭和の屋ンキーみたいだ
0704デフォルトの名無しさん
2010/06/28(月) 23:24:291文字ずつやるとしても、文字コード使って判定させるよりは、
正規表現で判定させた方が楽でない?
1文字ずつ別の変数に格納していくルーチンで良いような気がする。
0705デフォルトの名無しさん
2010/06/29(火) 02:34:430706デフォルトの名無しさん
2010/06/29(火) 02:40:12For 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
0707デフォルトの名無しさん
2010/06/29(火) 08:56:46文字列にイコール以外の比較演算子が使えるのは盲点でした
比較演算子の部分を正規表現でスマートにしてもいけそうですね
ありがとうございました
0708デフォルトの名無しさん
2010/06/29(火) 11:35:22以下のソースは、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
0709デフォルトの名無しさん
2010/06/29(火) 12:00:270710デフォルトの名無しさん
2010/06/29(火) 12:38:040711デフォルトの名無しさん
2010/06/29(火) 12:40:400712デフォルトの名無しさん
2010/06/29(火) 12:55:340713デフォルトの名無しさん
2010/06/29(火) 14:01:26その後の調べで、「VB6のランタイムライブラリ」が必要 と言う情報を得ました。
私は、パソコン詳しくないし、VBは持っていないのでわからないのですが、
VB6のランタイムライブラリというのは、たぶんライブラリファイルですよね。
これはVB6を買わないといけない物なのでしょうか?
それとも、コピーしても違法じゃないよ、というものなのでしょうか?
ちなみにVB6って、売ってないんでしょうか。探しても見あたらないんです。
0714デフォルトの名無しさん
2010/06/29(火) 14:17:33>VB6のランタイムライブラリというのは、たぶんライブラリファイルですよね。
どっちかというと違う
0715デフォルトの名無しさん
2010/06/29(火) 14:36:02XP + EXCEL 2000
長文のVBAをいじっていたら、formula bar と
heading欄(A B C D ...)の間に
=============日
・
E F G H (heading欄)
上記(1)のようなオブジェクトがあらわれました。
日のなかの-(マイナス)をクリックすると
F欄が隠れて
田
E G H
となります。+をクリックすると(1)に戻ります。
この動作をマクロで録ろうとしましたが記録できません。
このオブジェクトの消し方と、現しかたを教えてください。
0716デフォルトの名無しさん
2010/06/29(火) 15:00:54いや、合ってるだろ
0717デフォルトの名無しさん
2010/06/29(火) 17:37:57きっと、グループ化のことだと思われる。
単純に機能として削除したいのなら、「データ」→「グループとアウトラインの設定」で設定できる。
マクロは全てを解除する方法しかわからん。
シート内の2番目のグループのみを開くっていう方法あったら誰か教えてください。
0718717
2010/06/29(火) 17:58:08Selection.ClearOutline
もしくは、Range(範囲).Ungroupでできる。
開く、閉じるっていう動作がわからんです。
0719デフォルトの名無しさん
2010/06/29(火) 18:33:54Sub 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を使って指定する場合だけアクティブである必要があるのでしょうか?
ヘルプを見ても分からなかったので、教えてくださいませ。
よろしくお願いします。
0720デフォルトの名無しさん
2010/06/29(火) 20:28:32Cellsの前になにもつけなければ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))
0721デフォルトの名無しさん
2010/06/29(火) 22:58:42ああ、ActiveSheetが規定値と言うイメージなのですか。
これですっきりしました。
やはり、Activeにして実行すべき物だったんですね。
本当にありがとうございました。
0722デフォルトの名無しさん
2010/06/29(火) 23:16:12違うだろ
スクリプトで記述するときはActiveSheetなどに依存せず、処理の対象を明に指定しとけってことだろ
0723720
2010/06/30(水) 00:17:16>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(....
という風に全てどこのシート(ブック)かを明示した方がよいと言う事
0724デフォルトの名無しさん
2010/06/30(水) 02:33:48TABをタイプしても、4スペースになってしまうのですが、
TABはTABとして保持するように設定出来ないでしょうか?
0725デフォルトの名無しさん
2010/06/30(水) 02:47:29無理
0726デフォルトの名無しさん
2010/06/30(水) 09:11:19タブコードを2文字に置き換えるか
0727デフォルトの名無しさん
2010/07/01(木) 12:44:53Dim targetCell As String
targetCell = "Cells(8,1),Cells(30,83)"
Worksheets("Sheet1").Range(targetCell).Value = "マムコ"
0728デフォルトの名無しさん
2010/07/01(木) 12:58:51君は普段Excelで数式書くときもCells(8,1)なんて書いてるの?
0729デフォルトの名無しさん
2010/07/01(木) 13:12:560730727
2010/07/01(木) 13:13:50ワークシートのセル上で他のセルを参照する時は(A8)等ですね
0731デフォルトの名無しさん
2010/07/01(木) 13:16:58じゃあtargetCell = "A8"って書けばいいんじゃないの??
"R8C1"でもいいけど。
0732デフォルトの名無しさん
2010/07/01(木) 14:02:20え?
0733デフォルトの名無しさん
2010/07/01(木) 17:35:44記号の評価・比較って、コツがあるのでしょうか?
前方一致をしたいのですが、以下で失敗します。
記号で開始するのは失敗する「##」で始まるものだけで、
英語・数字・日本語の比較は正常に行えます。
記号を利用する場合、何か特別な処理が必要なのでしょうか?
フィルタオプションでも、##から始まる文字列を取得することはできませんでした。
dim Str1,Str2 as string
Str1 = "##TTT*"
Str2 = "##TTTAAABBB"
If Str2 Like Str1 Then
MsgBox ("前方一致しています")
end if
0734デフォルトの名無しさん
2010/07/01(木) 17:47:59記号についてはコツとかではなく
Like演算子のヘルプ開けば分かるでしょ。
LikeにカーソルあわせてF1押しなさい。
0735デフォルトの名無しさん
2010/07/01(木) 18:05:030736デフォルトの名無しさん
2010/07/01(木) 18:15:41ヘルプ読んだ?
Str1 = "[##TTT]*"
0737デフォルトの名無しさん
2010/07/01(木) 20:43:10なるほどCells自体が関数だからString型で呼び出せないんですね
つまり
Dim targetCellStart As String
Dim targetCellEnd As String
targetCellStart = "8,1"
targetCellEnd = "30,83"
'下のような指定の仕方なら可能って事ですね?
'Range.Cells(targetCellStart),Cells(targetCellEnd)="マムコ"
>>731
英字のセル指定を使わずに数字で指定したい理由は
その数字を利用してFOR文のカウンタを生成したいからです
英字から数字に変換するのが手間なので…
因みにわざわざ変数にしたい理由は、この座標がユーザサイドで指定できるようにする為です
0738デフォルトの名無しさん
2010/07/01(木) 21:31:12ありがとうございます。
「データ」→「グループとアウトラインの設定」→ Clear Outline
で解消しました。
Shape オブジェクトのグループ化を何度も行うマクロをいじっていたので
すが、マクロのミスで列がグループ化されたということでしょうか・・・
0739デフォルトの名無しさん
2010/07/01(木) 22:06:31YOU、正規表現使っちゃいなYO!
0740デフォルトの名無しさん
2010/07/01(木) 23:17:41横から失礼します
実行してみた? 希望した結果にならないと思うけど
>英字から数字に変換するのが手間なので…
そんなに手間かな
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
ってのもできるよ
0741740
2010/07/01(木) 23:25:44変数TargetCell は
Dim TargetCell As Range
ね
0742デフォルトの名無しさん
2010/07/02(金) 05:30:02英字から数字とか変なこと言うと思ったから、
R1C1形式も書いておいたのに…。
0743733
2010/07/02(金) 12:15:27皆さんどうもありがとうございました。#はワイルドカードだったのですね。。
リストは社内にあるPCから集めたアプリケーション名で配列なのですが、
今回は#を置換して、Str1 = "[#][#]TTT*"とすることにしました。
データ内にどんな記号がいくつあるかも不定なので、?や*についても処理しておきたいと思います。
正規表現についても、時間を見て勉強したいと思います。
0744デフォルトの名無しさん
2010/07/02(金) 13:08:44一セルづつ処理をする部分で、どうやったら
そのセルの中身を取得できますか?
Dim TargetCell As Range
targetCellStart = "A8"
targetCellEnd = "CE30"
For Each TargetCell In Range(targetCellStart, targetCellEnd)
'処理
Next
0745デフォルトの名無しさん
2010/07/02(金) 15:16:34つ ローカルウィンドゥ
.Value
0746デフォルトの名無しさん
2010/07/02(金) 17:15:100747デフォルトの名無しさん
2010/07/02(金) 19:59:24range型変数なのにsetしなくても良いの?
A1形式だと大丈夫とか?
良く分からないんで教えてほしいの。
0748デフォルトの名無しさん
2010/07/02(金) 20:00:06それが俺の流儀だーーーー!!!
0750デフォルトの名無しさん
2010/07/02(金) 23:08:05A1〜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行に貼り付け
というのを作ったのですが、処理が多すぎて?非常に重く使い物になりません・・・
どなたかいいアイディアなどお持ちでないでしょうか?
0751デフォルトの名無しさん
2010/07/02(金) 23:09:390752デフォルトの名無しさん
2010/07/02(金) 23:48:52set 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
0753デフォルトの名無しさん
2010/07/02(金) 23:52:31VBAじゃないきがするけどこんなんいかが?
どこまで軽くなるかしらないけどね
�@C1に =IF(ISNA(MATCH(B1,$A$1:$A$200,0)),0,1) を入力させて、それをC150までオートフィル
�Aオートフィルター使って、C列が"1"の値のB列だけ抜き出し、コピーしてD行に貼り付け
考え方として B列の材料と同じ材料がA列にあるかどうか判定すれぱいいんだから
(もちろんその逆でもいいけど)
0754デフォルトの名無しさん
2010/07/02(金) 23:56:161のを抽出でいいんじゃない?
0755デフォルトの名無しさん
2010/07/03(土) 00:18:37TRUEなもの抜き出すだけでは
0756750
2010/07/03(土) 00:45:43実際のデータはA1〜A10000やB1〜B20000などと桁数のずっと多いもので・・・
できたらcountifの記入やautofilterを使わないようなやり方があるといいのですが
0757デフォルトの名無しさん
2010/07/03(土) 00:52:40効率でいえば>752がベスト
0758デフォルトの名無しさん
2010/07/03(土) 00:58:510759デフォルトの名無しさん
2010/07/03(土) 01:23:17B10001〜B20000に商品Bのデータ
C列に=A1+B1と入れてC列でソート
この方法なら一瞬でできる
0760750
2010/07/03(土) 03:00:21set 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)の様には使えないようです
無知で申し訳ありません、もしよろしかったらご指導願えないでしょうか・・・?
0761デフォルトの名無しさん
2010/07/03(土) 07:21:09遅い上に最近のExcelだと行数すら桁あふれで格納できません。
代わりにLongを使いましょう。
0762デフォルトの名無しさん
2010/07/03(土) 07:34:38myrows = Selection.Row
myrows2 = myrows + 1
0763デフォルトの名無しさん
2010/07/03(土) 09:47:430764デフォルトの名無しさん
2010/07/03(土) 11:34:07最大255列65535行
じゃないのかな
0765デフォルトの名無しさん
2010/07/03(土) 12:18:492007は16384列1048576行だよ
0766デフォルトの名無しさん
2010/07/03(土) 12:29:53最大255列65535行
じゃないのかな
0767デフォルトの名無しさん
2010/07/03(土) 12:34:55コンテナの要素数が一定数以上だとツリーに現れないみたいなのですが
全要素を見たい場合どこでデバッガの設定を変更すればよいですか?
0768750
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
0769デフォルトの名無しさん
2010/07/04(日) 11:35:280770デフォルトの名無しさん
2010/07/04(日) 12:22:05For Each のインデックス変数 のどこで SET を使えと?
0771デフォルトの名無しさん
2010/07/04(日) 12:58:00Excelヘルプ VBAリファレンスより抜粋
For Each...Next ステートメント
配列やコレクションの各要素に対して、
一連のステートメントを繰り返し実行するフロー制御ステートメントです。
次の方法は Range プロパティで返されるセルのコレクションと
For Each...Next ループを組み合わせて操作します。
For Each...Next ループでは、ループで繰り返されるたびに、
オブジェクト型変数に次のセルが自動的に設定されます。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
0772デフォルトの名無しさん
2010/07/04(日) 13:33:13生まれた単なる代入時に出現する歪だから
必要のない部分では文法的に削れてて当然。
0773デフォルトの名無しさん
2010/07/04(日) 19:44:53の
targetCellStart = "A8"
targetCellEnd = "CE30"
で、range型変数に代入してるけど、setしてないんだけど、
これがOKとされてるのが分からないのよ。
イテレータでrangeコレクションを回してるなら、setの必要無いけど、
その前に、rangeに代入してる時にsetしてないのが凄く違和感あってさ。
0774デフォルトの名無しさん
2010/07/04(日) 19:45:48×代入してるけど
○代入してるのに
0775デフォルトの名無しさん
2010/07/04(日) 19:49:170776デフォルトの名無しさん
2010/07/04(日) 19:52:39大恥晒してしまった・・・。
反省文レベルの大恥です。本当にお恥ずかしい。
スレ汚し、大変失礼しました。
0778デフォルトの名無しさん
2010/07/04(日) 20:06:09大切なのは間違いを繰り返さないことだ…
____
/_ノ ヽ、_\
ミ ミ ミ o゚((●)) ((●))゚o ミ ミ ミ <Range型変数だっておwww
/⌒)⌒)⌒. ::::::⌒(__人__)⌒:::\ /⌒)⌒)⌒)
| / / / |r┬-| | (⌒)/ / / //
| :::::::::::(⌒) | | | / ゝ :::::::::::/
| ノ | | | \ / ) /
ヽ / `ー'´ ヽ / /
| | l||l 从人 l||l l||l 从人 l||l バ
ヽ -一''''''"〜〜``'ー--、 -一'''''''ー-、 ン
ヽ ____(⌒)(⌒)⌒) ) (⌒_(⌒)⌒)⌒)) バ
ン
0779デフォルトの名無しさん
2010/07/04(日) 20:12:00晒し上げ
まぁ肩持つ訳じゃないけど、Stringに"A1"を代入するのは気持ち悪いね。
0780740
2010/07/04(日) 20:17:49気持ち悪いかもしれんが
もともとの質問者 >>737 が
>因みにわざわざ変数にしたい理由は、この座標がユーザサイドで指定できるようにする為です
って所から始まった事なので
0781デフォルトの名無しさん
2010/07/04(日) 21:55:37Range("A1", Range("A65536").End(xlUp)).Copy
教えてくれた人にお礼言ってなかった、ほんとにありがとう!!!
0782デフォルトの名無しさん
2010/07/05(月) 17:28:35バックグラウンドにすると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
0783デフォルトの名無しさん
2010/07/05(月) 18:04:27Range(U.Cells... の部分を
U.Range(U.Cells... に修正する。
0784デフォルトの名無しさん
2010/07/05(月) 18:09:070785デフォルトの名無しさん
2010/07/05(月) 19:54:07レスありがとうございます。
しかし、残念ながら改善しませんでした…
0786デフォルトの名無しさん
2010/07/05(月) 20:13:280787デフォルトの名無しさん
2010/07/05(月) 20:45:370788デフォルトの名無しさん
2010/07/05(月) 21:08:38「実行時エラー1004 アプリケーション定義またはオブジェクト定義のエラーです」
これは コード自体が悪いというより
range(U.Cells(3, 1), U.Cells(502, 50)).Value = PM
の処理途中で(全部書込みが終わらないうちに)
ESC(中断)が押されたから 発生しているんじゃないかな。
>バックグラウンドにするとCPU使用率が0になり
ここはわからん
0789デフォルトの名無しさん
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
これ以上軽くするのは無理ですかね・・・?
0790デフォルトの名無しさん
2010/07/05(月) 22:19:03ありがとうございます!
0791デフォルトの名無しさん
2010/07/05(月) 22:51:45知らなかったです。
0792デフォルトの名無しさん
2010/07/06(火) 00:17:29時間がかかってるのはAutofillの1行だけだから、これ以上軽くするのは難しいと思う
画面の書き換えを抑制しても変わらんだろうし
それよりも、変数myselの使い方が無駄すぎる
やるならせめて
mycol = mysel.Column
みたいにしないと
0793789
2010/07/06(火) 10:35:54sub テスト()
selection.AutoFill Range(selection, Cells(selection.Offset(0, -1).End(xlDown).Row, selection.column))
end sub
速度に特に変わりはなかったもうだめp
0794デフォルトの名無しさん
2010/07/06(火) 10:40:17オートフィルさせる内容は書けませんか?
内容が分かればオートフィル以外の代替案を出せる人が居るかも知れませんよ
0795789
2010/07/06(火) 12:14:33countifだったり、ifだったり、averageだったりいろいろあるからなぁ
汎用性あってサクッと動く奴だったら最高なんだが
0796デフォルトの名無しさん
2010/07/06(火) 12:24:05数式の内容によっては手動計算に切り替えてからオートフィルで少しだけ速くなるかもしれない
0797デフォルトの名無しさん
2010/07/06(火) 13:59:171つのExcelファイルでSheet1・2に入力し起動すると片方がエラーになってしまいます。
エラーコードは400
どうしてでしょうか?
詳しい説明、ソースが必要ならば晒します
0798デフォルトの名無しさん
2010/07/06(火) 15:49:54セル範囲を参照するときにワークシートの指定を忘れてる部分があるはず
0799デフォルトの名無しさん
2010/07/08(木) 11:41:44Sheet2に、ある商品のリスト(1000人分くらい)があって、Sheet1からそれらのデータだけをオートフィルターみたいに抜き出したい
scripting.dictionaryってitemに20行も登録できたっけ?
0800デフォルトの名無しさん
2010/07/08(木) 11:52:11とりあえず行と列をちゃんと区別してくれないと、何の話かわからない。
0801デフォルトの名無しさん
2010/07/08(木) 12:05:25scripting.dictionaryをどうこうっていう意味がわからん
VBAでやる意味はわからんが、このスレ的に考えて
LOOKUP関数をVBAで実現したいってことじゃないのか?
0802デフォルトの名無しさん
2010/07/08(木) 12:06:46countifとかでもいいんだが、できたらSheet1は参照するだけでいじりたくない
0803デフォルトの名無しさん
2010/07/08(木) 12:20:260804デフォルトの名無しさん
2010/07/08(木) 13:14:37最後の引数をTRUEにすればVLOOKUPは早くなる。
0805デフォルトの名無しさん
2010/07/08(木) 13:17:39逆
アルファベットは列、数字が行
0806799
2010/07/08(木) 13:37:24すまん、一度trueでやったんだが駄目だった
falseではうまくいった
0807799
2010/07/08(木) 13:42:20そうだった
日本語で躓いてたとは・・・
0808デフォルトの名無しさん
2010/07/08(木) 19:42:580809デフォルトの名無しさん
2010/07/08(木) 20:01:38行 って漢字に = が含まれてるから、行は横に伸びる
0810デフォルトの名無しさん
2010/07/08(木) 20:23:030811デフォルトの名無しさん
2010/07/08(木) 20:27:18縦書きの世界は縦が行
0812デフォルトの名無しさん
2010/07/08(木) 20:38:19実世界は列
0813デフォルトの名無しさん
2010/07/08(木) 21:18:100814デフォルトの名無しさん
2010/07/08(木) 21:28:200815デフォルトの名無しさん
2010/07/09(金) 02:13:170816デフォルトの名無しさん
2010/07/09(金) 02:32:080817デフォルトの名無しさん
2010/07/09(金) 07:30:320818デフォルトの名無しさん
2010/07/09(金) 08:16:380819799
2010/07/09(金) 09:07:050820デフォルトの名無しさん
2010/07/09(金) 13:05:33向きは違うけど列はアルファベットでしょ
0821デフォルトの名無しさん
2010/07/09(金) 13:11:01それをワークシートに一度に貼り付けると、量によっては時間がかなりかかるんだけど、
貼り付けの待ち時間にプログレスバーを表示したいのですが、どのような方法で実装すればよいのですか?
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
0822デフォルトの名無しさん
2010/07/09(金) 13:12:260823821
2010/07/09(金) 13:16:25ループを0から始めてるので最後の貼付け範囲はRange("A1:GS10001")でしたorz
0824デフォルトの名無しさん
2010/07/09(金) 13:50:14たとえば
For row1 = 1 To 10000 Step 100
Range("A" & row1 & ":GR" & row1 + 99) = a
Debug.Print row1 / 100; "%" 'この部分で進行状況を表示
Next
みたいに、処理を100分割してイミディエイトウィンドウに進行状況をパーセント表示する
0825デフォルトの名無しさん
2010/07/09(金) 13:52:31最後が10000じゃなくて10001だから端数が出た部分の処理は別にしなきゃいけない
どっちにしても単一の代入文の進行状況を表示するのは不可能だから、何かしら工夫が必要。
0826デフォルトの名無しさん
2010/07/09(金) 13:58:280827821
2010/07/09(金) 16:03:36ありがとうございます。
処理を100分割してそれぞれの処理を実行するたびにプログレスバーに1加えていく(MAX100として)ってことですね。
確かに求めていたような動作にはなりますが、処理時間がかなり遅くなりそうな気がします。
イメージ的にはAPI等を使用して、Rangeに格納された容量(メモリ?)のようなものを取得し、
そのうちどれだけ処理が実行されたか、をプログレスバーに表示するようなことができないかと。
遅いPCで実行したときにエクセル下部のステータスバーに「フィル」というプログレスバーが表示されるのをフォームで実装できないかな、と思いました。
0828デフォルトの名無しさん
2010/07/09(金) 16:20:29Rangeオブジェクトの内部が公開されていないので、かなり難しいでしょうね。
APIをフックして、たとえばmallocあたりが呼ばれたかどうかを調べたとしても、
進行状況を線形に把握するのはたぶん不可能だと思います。
それに経験上、この規模の処理なら100分割してもそれほど速度は変わらないと思います。
なんなら簡単なプログラムでベンチマークしてみればよいでしょう。
0829デフォルトの名無しさん
2010/07/09(金) 16:23:42マシンの処理速度を把握した上で終了時刻を予測して、あとはタイマーで処理するという方法もあります。
不正確ですが利用者のイライラを低減させる効果はあるでしょう。
ファイルのコピーやダウンロードの残り時間の予想もけっこういいかげんですよね。
0830デフォルトの名無しさん
2010/07/09(金) 17:41:24ファイルのコピーやダウンロードの残り時間の予想は確かに不正確だけど、
> 別の方法として、まず最初に簡単なベンチマークを実行し、
> マシンの処理速度を把握した上で終了時刻を予測して、あとはタイマーで処理するという方法
こんな途方もないいい加減さとは違う。
0831デフォルトの名無しさん
2010/07/09(金) 19:20:05それと比べたら、パソコン内部だけで完結する処理の方が予想しやすい
ただし、あまりにも時間がかかって、その間に別の作業を始められてしまうとお手上げだけど
0832デフォルトの名無しさん
2010/07/09(金) 20:13:13意外と早かったとか無いかなあ。単なる思い付きだけど。
0833デフォルトの名無しさん
2010/07/09(金) 20:17:270834821
2010/07/09(金) 20:30:14(貼付け速度のみ。配列へ格納する処理は除く。)
それでも砂時計マークが出て、当方のPCだと上記のような簡単な処理でも10秒ほどかかってしまいます。
もちろん、他の常駐ソフト等の設定により処理時間はさらに増減するものだと思われます。
そこで、視覚的に(錯覚的に)処理時間を短縮したかのように見せられないかと思い質問させていただきました。
0835デフォルトの名無しさん
2010/07/09(金) 20:33:080836デフォルトの名無しさん
2010/07/09(金) 21:29:31> 大容量の二次元配列データをシートに書き込むには、>>821で記述したやり方が一番速いと思っています。
そんなことはない。
excelの大規模データインポート処理は十分最適化されているのに対して、>821のような
軽い処理が大量に繰り返される処理はほとんど最適化されない。
0837デフォルトの名無しさん
2010/07/09(金) 21:45:11繰り返しループはただのテストデータの作成で
セルへの書き込みは最後の1行だけでしょ
200万セルの書き込みが10秒なら十分最適化されてると思うけど
0838デフォルトの名無しさん
2010/07/09(金) 22:05:500839デフォルトの名無しさん
2010/07/09(金) 22:25:370840821
2010/07/10(土) 13:07:22配列への格納の処理(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を増加させていくことはできないかと思っています。
0841840
2010/07/10(土) 13:08:520842名無しさん@そうだ選挙に行こう
2010/07/10(土) 13:39:10読み込んでセルに内容を反映したいのですが
どうしたらいいの?
0843名無しさん@そうだ選挙に行こう
2010/07/10(土) 14:04:55私ならファイル全部読み込んで配列に入れてなんとかする
varRecords = Split(.readall, vbLf)
0844名無しさん@そうだ選挙に行こう
2010/07/10(土) 15:36:50開きたいのですが、できますでしょうか?
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
0845名無しさん@そうだ選挙に行こう
2010/07/10(土) 15:39:13できるからといってなんでもやってよいわけではない
0846名無しさん@そうだ選挙に行こう
2010/07/10(土) 15:45:10コメントが間違っている
※4は xlcsv
xlTextPrinter は 36
0847名無しさん@そうだ選挙に行こう
2010/07/10(土) 16:02:19どうしても元もフォーマット(罫線や幅)が無くなってしまいます。どうしたらいいでしょうか?
0848名無しさん@そうだ選挙に行こう
2010/07/10(土) 16:49:200849名無しさん@そうだ選挙に行こう
2010/07/10(土) 16:54:30やはりフォーマットをそのまま残すにはxlsでないと駄目ですか?
0850844
2010/07/10(土) 17:04:44何卒よろしくお願いします。
0852名無しさん@そうだ選挙に行こう
2010/07/10(土) 18:37:07XMLで保存すれば?
0853844
2010/07/10(土) 19:19:17データ容量がどうしても大きくなってしまうのでcsvで保存したいのですよ・・・
20行目から30行目だけcsvで保存して、読み込むときは入力どおりに出力したいのですよ・・・
0854名無しさん@そうだ選挙に行こう
2010/07/10(土) 19:51:540855名無しさん@そうだ選挙に行こう
2010/07/10(土) 19:58:57アクセスデータベースをエクセル制御すれば、エクセルで使うデータ量程度なら十分
0856名無しさん@そうだ選挙に行こう
2010/07/10(土) 22:08:50854の言うとおり、ZIP圧縮が無難だな。
0857名無しさん@そうだ選挙に行こう
2010/07/10(土) 22:20:28xlsとcsvファイル2つにそれぞれ保存して
xlsファイルを開くときにcsvファイルを取り込むように組めばいいように思うけど?
0858名無しさん@そうだ選挙に行こう
2010/07/10(土) 22:46:31重いってのがどの程度を想定してるのか分からないけど、
XMLはテキストデータだから軽いかと思うよ。
0859名無しさん@そうだ選挙に行こう
2010/07/10(土) 22:57:46開始タグ終了タグ積んでるXMLは重量級。
グダグダ言わずに測れば分かるか。
「あ」が336個罫線とともに敷き詰められたデータを
Excel2010(ベータ)で保存したらこうなった。
xlsx: 10.6KB
xml(Excel2003 SpreadsheetML): 26.9KB
0860名無しさん@そうだ選挙に行こう
2010/07/10(土) 22:59:02フォルダを圧縮フォルダにでもすればいい話だよ。
0861名無しさん@そうだ選挙に行こう
2010/07/10(土) 23:34:230862名無しさん@そうだ選挙に行こう
2010/07/11(日) 00:01:22単に貧乏性なのか、本当に肥大化しまくっているのかいまいち判らん。
0863名無しさん@そうだ選挙に行こう
2010/07/11(日) 08:35:27http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_110_050.html
にあるようなコーディングすればいいのに
0864名無しさん@そうだ選挙に行こう
2010/07/11(日) 12:11:36xlsxを解凍ソフトで解凍してみれ
0865名無しさん@そうだ選挙に行こう
2010/07/11(日) 12:29:070866名無しさん@そうだ選挙に行こう
2010/07/11(日) 12:38:060867名無しさん@そうだ選挙に行こう
2010/07/11(日) 14:10:45a l
a l ←「a」の範囲だけ行を選択
a l
a-
b
a-
a l ←「a」の範囲だけ行を選択
a-
b
上のように「a」の範囲だけ行を選択したいです。
教えてください。
0868名無しさん@そうだ選挙に行こう
2010/07/11(日) 14:58:060869名無しさん@そうだ選挙に行こう
2010/07/11(日) 16:21:00forで上から見て行って、ifで条件に合致した場合に処理をするのが基本だよ。
選択してから何をしたいのかが分からないけど、
unionのparramarrayに順次追加して、最後に処理するのはお勧め出来ない。
それをやりたがる人が多いんだけど、何か本とかに載ってるのかな?
0870名無しさん@そうだ選挙に行こう
2010/07/11(日) 16:32:56こんなのでいいんじゃないの
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
0871>>867
2010/07/11(日) 17:15:201.上から「a」以外のセルの位置を吐き出す
2.6番目に「b」があったとすれば、1〜5番までの行を選択する
といったやりかたでいいでしょうか?
今までは「a」を見つけて、「a」のセルを順次選択していこうと思ってたのですが・・・。
0872名無しさん@そうだ選挙に行こう
2010/07/11(日) 17:28:550873名無しさん@そうだ選挙に行こう
2010/07/11(日) 18:04:08その後にソートしてから、必要の行がまとまるので全部消せばよくね?
0874名無しさん@そうだ選挙に行こう
2010/07/11(日) 18:44:440875名無しさん@そうだ選挙に行こう
2010/07/11(日) 21:53:23aをアクティブセルにしてCtrl+Shift+\したのち、
Ctrl+9するっていう手もあるよ。
0876デフォルトの名無しさん
2010/07/12(月) 11:55:110877デフォルトの名無しさん
2010/07/12(月) 11:59:02Unionは分ってない人が一見スマートに見えるからよく使うだけ。
あんな幾何級数的に遅くなるもの普通の人は使わん。
まぁ選択するんだったらオートフィルターだが、その後何するか分らんがオートフィルターはほとんどの場合最善じゃねー
0878デフォルトの名無しさん
2010/07/12(月) 23:22:15A1、A2を「データ→グループとアウトラインの設定からグループ化して」で表示・非表示を操作
bは表示したいからA3はそのまま
A4、A5も「データ→グループとアウトラインの設定からグループ化して」で表示・非表示を操作
前 後
A A
1 a 3 b
2 a
3 b →
4 a
5 a
説明下手だから通じないかもしれないけど。
0879デフォルトの名無しさん
2010/07/13(火) 05:23:09だって、そのグループ化ってやつ、複数選択でやってみるとエラーになるし
0880デフォルトの名無しさん
2010/07/13(火) 23:19:19VBScriptだと正規表現の方言がJavaScript系なので弱い部分がある為、
別の言語で処理出来るようなライブラリ等があるのかなぁ、と思いまして
0881デフォルトの名無しさん
2010/07/14(水) 00:26:33DLLの呼び出し部分を自分で定義してやれば、たいていのライブラリが使える。
ただし日本語対応の正規表現ライブラリ自体が、あまり種類が多くない。
Bregexp.dllならドキュメントがけっこう充実しているのでそこそこ使いやすいと思う。
ttp://www.geocities.co.jp/SiliconValley-Bay/1992/excel/reg.html
0882880
2010/07/14(水) 08:05:22まんこの中見る器具!(性器表現)
こいつはいい…今まで知らなかったぜ!
派手に暴れてくる!マジ助かった、Thank you
0883デフォルトの名無しさん
2010/07/14(水) 19:53:10それはクスコ
0884デフォルトの名無しさん
2010/07/14(水) 20:30:240885デフォルトの名無しさん
2010/07/14(水) 23:06:05ファイルという変数に画像を取り込んで、エクセルの任意の場所に張り付けたいと考えています。
次のように、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
ご教授をお願いします。
0886デフォルトの名無しさん
2010/07/15(木) 00:01:57オブジェクトの位置を指定するには
左端または上端からの距離(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
0887デフォルトの名無しさん
2010/07/15(木) 00:10:17天才がいるぞ、天才が!
あ、ありがとうございます! >>886
ホントに涙が出てきた。。。
0888デフォルトの名無しさん
2010/07/15(木) 00:32:40バカがいるぞ、バカが!
あ、ありがとうございます! >>887
ホントに尿が出てきた。。。
0889デフォルトの名無しさん
2010/07/16(金) 19:12:080890886
2010/07/16(金) 20:40:02実際に 変数の定義が誤っているからしかたないかなと思ってたりする
0891デフォルトの名無しさん
2010/07/16(金) 21:27:070892デフォルトの名無しさん
2010/07/16(金) 21:39:04アンカー付けて
0893デフォルトの名無しさん
2010/07/16(金) 23:59:30ここは表現の添削もしてくれるスレか? 馬鹿にしているんじゃなくて、馬鹿はお前だろ?
0894デフォルトの名無しさん
2010/07/17(土) 01:07:270895デフォルトの名無しさん
2010/07/17(土) 01:45:070896デフォルトの名無しさん
2010/07/17(土) 14:38:35VBAでもっと軽くする方法ない?
具体的には
・参照したいデータ数1000(列)
・参照元のデータ数30000(列)、アイテム数50(行)から
0897デフォルトの名無しさん
2010/07/17(土) 14:39:260898デフォルトの名無しさん
2010/07/17(土) 14:47:190899デフォルトの名無しさん
2010/07/17(土) 18:46:110900デフォルトの名無しさん
2010/07/17(土) 18:57:270901デフォルトの名無しさん
2010/07/17(土) 19:13:060902デフォルトの名無しさん
2010/07/17(土) 19:46:080903デフォルトの名無しさん
2010/07/17(土) 20:49:310904デフォルトの名無しさん
2010/07/17(土) 20:53:08お前列と行を勘違いしてるだろ?
30000行50列だろうが。
50列もあるのにVLOOKUPなんて考えるやつ、Excelにたいする適性がないからやめた方がいい。
0905デフォルトの名無しさん
2010/07/17(土) 20:56:09Findで見つけてResizeでまとめてと考えてるだろうし。
0906デフォルトの名無しさん
2010/07/17(土) 20:56:130907デフォルトの名無しさん
2010/07/17(土) 20:57:200908デフォルトの名無しさん
2010/07/17(土) 21:02:500909デフォルトの名無しさん
2010/07/17(土) 21:08:06お前が教えてやれ。
0910デフォルトの名無しさん
2010/07/17(土) 21:08:16アドインで作ったマクロから
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
を適用させるにはどうしたら良いでしょうか?
0911デフォルトの名無しさん
2010/07/17(土) 21:12:09俺がわかるわけないだろ?
0912896
2010/07/18(日) 00:03:43参照先がラベル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
0913デフォルトの名無しさん
2010/07/18(日) 00:18:070914デフォルトの名無しさん
2010/07/18(日) 00:28:31アドイン側へ元となるコードを記述したモジュールを作成して
それを新規シートモジュールにコピーする方法はどうですか?
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)
0915896
2010/07/18(日) 00:49:49vlookupの検索条件をfalseからtrueに変えると計算早くなるみたいなんですが、
近似値検索だと万が一でも間違った参照をしてしまうことってありますか?
ラベルがアルファベット+数字ごちゃまぜなんで、いざ間違ってても確認しにくいんです・・・
0916デフォルトの名無しさん
2010/07/18(日) 01:35:05わかり易く教えていただきありがとうございます。
CodeModuleの存在をはじめて知りました。
ただ・・・
「Visual Basic プロジェクトへのアクセスは信頼性に欠けます」というエラーを回避するようにしても、
低スペックのためか、なぜかエクセル自身のエラー→自動回復になってしまってうまく動きません・・・
この問題を解決して、教えていただいたマクロを利用しても良いのですが、自分だけでなく、会社で複数のPCに
アドインを入れたいと思っているので、アクセス許可がちょっと気になります。(デフォルトで許可にチェックが入っていないため)
アドインの中のマクロでシートを作成して、作成したシートをダブルクリックした時にvalueを返したいのですが、
他に良い方法はないでしょうか?
勉強不足のため、イベントプロシージャでしかできないのか、イベントプロシージャを作成するならCodeModuleを利用しないと
いけないのか判断できなくて申し訳ないのですが、教えていただけたらと思います。
0917914
2010/07/18(日) 02:02:42シートモジュールにコードを直接書込みたかったのでCodeModule使っただけ
普通は使わない
エラーでるなら止めておいたほうがいいかも
後は
アドイン内のクラスモジュールでイベントを拾えばいいんだろうけど
なにもしないと全てのシートに適用されしまうので新規作成したシートをどう識別するかが問題
0918デフォルトの名無しさん
2010/07/18(日) 02:15:05近似値なんだから、完全に一致はしていない行を参照する可能性は当然あるよ。
VLOOKUP+IFの二段構えでチェックとかすれば良いのだろうけど、
計算コスト的にどうなのかは一寸判らないな。
あと、検索アルゴリズムに二分探索を使うから予めソートされていないと駄目だな。
0919914
2010/07/18(日) 02:42:13別の視点から考えてみた
1)アドインブックへ新規作成状態のシートを作成
2)そのシートモジュールへ例のコードを記述
3)シート新規作成ではなくシートコピーする
ThisWorkbook.Sheets(1).Copy Before:=Sheets(1)
0920916
2010/07/18(日) 11:47:55本当、ありがとうございます!
許可も不要だし、イベントもうまく動作しました。
すばらしい発想でした。
自分ではとても思いつかなかったので、とても助かりました。
最後にもう一言。
ありがとうございました。
0921デフォルトの名無しさん
2010/07/18(日) 13:09:44画像のような課題が出たのですが、どうしてもうまく出来ません。
ttp://www.dotup.org/uploda/www.dotup.org1034392.bmp.html
今こんな状態なんですが、どこが間違っているかすらも分からないので助けてください
0922デフォルトの名無しさん
2010/07/18(日) 14:00:45しかも課題だし
0923デフォルトの名無しさん
2010/07/18(日) 14:39:060924デフォルトの名無しさん
2010/07/18(日) 14:40:37俺は位相とかもう完全に忘れた
0925デフォルトの名無しさん
2010/07/18(日) 15:04:290926デフォルトの名無しさん
2010/07/18(日) 15:08:150927デフォルトの名無しさん
2010/07/18(日) 15:14:24| ノ\ ヽ |
/ ●゛ ● | |
| ∪ ( _●_) ミ j
彡、 |∪| | J
/ ∩ノ ⊃ ヽ
( \ / _ノ | |
.\ “ /__| |
\ /___ /
0928デフォルトの名無しさん
2010/07/18(日) 15:21:230929デフォルトの名無しさん
2010/07/18(日) 19:18:28もう二度とレスしないか、ちゃんと書いて質問するかどっちかにしろ
0930デフォルトの名無しさん
2010/07/18(日) 20:33:000931デフォルトの名無しさん
2010/07/18(日) 21:53:16しかもただの計算だけじゃねーか
0932デフォルトの名無しさん
2010/07/18(日) 22:06:12お前にとっては、ただの計算かもしれんが、俺には難しんだよ。
答えられねぇくせにしゃしゃり出てくるんじゃねぇよ。
0933デフォルトの名無しさん
2010/07/18(日) 22:12:590934デフォルトの名無しさん
2010/07/18(日) 22:13:37悪いな、このスレ、三人用なんだ
0935デフォルトの名無しさん
2010/07/18(日) 22:22:59ファイト!w
0936デフォルトの名無しさん
2010/07/18(日) 22:33:21数式自体の意味が難しくて分からないなら
VBAどころか Excelうんぬん以前の問題
質問する場所が違うってことじゃね
0937デフォルトの名無しさん
2010/07/18(日) 22:35:420938デフォルトの名無しさん
2010/07/18(日) 22:39:01>>935 いっぱ〜つぅ!
>>936 数式の意味はわかってるよ。 俺がわからないってどこに書いてあるんだよ。勝手に判断するな。
0939デフォルトの名無しさん
2010/07/18(日) 22:39:24逆ギレしちゃうお子チャマは2ちゃんしないでママのオッパイでもしゃぶってれ
0940デフォルトの名無しさん
2010/07/18(日) 22:43:54932>お前にとっては、ただの計算かもしれんが、俺には難しんだよ。
って事ね
本当に分かってるって言わないと思うけどね
0941デフォルトの名無しさん
2010/07/18(日) 22:55:08何をどうしたいの?
問題解いてやればいいの?
VBA書いてやればいいの?
構ってやればいいの?
0942デフォルトの名無しさん
2010/07/18(日) 23:22:24>>930とかは私じゃないです。変なの沸かせちゃってすいませんでした
0943デフォルトの名無しさん
2010/07/18(日) 23:35:01>>934 にもコメントしてやれよ。 なにが言いたかったのかは俺にも不明だが。
あと、アンカーも打てねぇやつは他で練習してから書き込めよ。
俺の質問は、他のスレで解をもらったから、すでにどうでもいいんだけどね。
ぐらいちゃんと打てるようになるまでROMってろよ
0944デフォルトの名無しさん
2010/07/18(日) 23:39:54>>942 偽者乙。
>>943 俺の質問は、他のスレで解を貰ってないから、全くわからないんだけどね。
0945デフォルトの名無しさん
2010/07/19(月) 00:15:110946デフォルトの名無しさん
2010/07/19(月) 21:03:45三流君のサイトばっかでてきてうぜぇぇぇぇぇぇぇ(笑)
三流君のサイトはごちゃごちゃして結局問題解決したことないわw
0947デフォルトの名無しさん
2010/07/19(月) 22:31:470948デフォルトの名無しさん
2010/07/20(火) 03:59:00例として、A列に大量のデータが存在するとします。
これをVariant変数使って一気に2次元配列に代入する場合なんですが、
Dim C as Variant
C = range("A1:A" & range("65536").End(Xlup).row)
上記で代入はできますが、A列に1セルのみ値が書き込まれている際にエラーが出てしまいます。
これを回避する方法が分かる方いましたらお願いします。
0949デフォルトの名無しさん
2010/07/20(火) 07:48:520950デフォルトの名無しさん
2010/07/20(火) 10:24:31本当に動いているのか?
C = Range("A1:A" & Range("A65536").End(xlUp).Row)
A入れないと動かないと思うが・・・
0951デフォルトの名無しさん
2010/07/20(火) 13:28:39なんか響かないようだから949の補足だ
セル数が1個だったら
redim c(1 to 1,1 to 1)
c(1,1)=範囲.value
2個以上のときはc=範囲.valueとすりゃいい。
0952デフォルトの名無しさん
2010/07/20(火) 17:34:23c = range("a1").currentregion.columns(1)
でいいのでは。
でも、なんで二次元配列に入れたいのだろうか。
0953デフォルトの名無しさん
2010/07/20(火) 18:16:48一応動くのですが、1セルの場合、空白の場合の処理を入れていない為
一つ一つ例外処理を入れていこうかと思いまして…
>>952
二次元配列=高速化とWebで見てしまった事とPCのスペックが低いので代入は2次配列で行っています。
データ量は10〜300行程度なのですが無駄なのでしょうか。
>>949>>951
初期化の際のエラーは出なくなりました、ありがとうございます。
ただ、ひとつ問題が発生してしまいまして、A列にデータが1つの場合ですが
Ubound(C,1)で『型が一致しません』のエラーが出てしまいます。
Msgbox C ではセルのデータは表示されるのですが。
A列に複数データの処理では問題なくコンパイルされました。
処理の流れですが、
�@ワークシートに予め記載されているA列のキー値を配列に代入
�Aワークシートには書式設定(セル結合など)がありエラーの元になると面倒なので、Cells.Clearで一旦削除
⇒ここで削除するため配列などにデータ全部格納しておきたいと思いました。
�Bキー値を元に別シートから参照データ引っ張ってきています。
0954デフォルトの名無しさん
2010/07/20(火) 18:28:35君のその報告こそどうでもいい事なんだが
0955デフォルトの名無しさん
2010/07/20(火) 20:21:48お前>>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個でもエラーにならないだろ?
それから結合セルの話はしないでくれな。
俺はアレルギーで蕁麻疹が出るから。
0956デフォルトの名無しさん
2010/07/20(火) 20:41:56それは良いことだ。
0957デフォルトの名無しさん
2010/07/20(火) 21:39:43ぐあああ出来ました!!!
.Count使うとは思いませんでした。エラー対応が全くなかったので助かりました。
構文なども書いてもらえて自分との違いが分かり勉強になりました。
長文付き合って下さり本当にありがとうございました。
0958デフォルトの名無しさん
2010/07/22(木) 00:41:16どうしてもわからなかったので質問させていただきます。
「閉じているブックのシート一覧を読み込む」です。
OpenFileName = Application.GetOpenFilename("Microsoft Ecel ブック,*xls")
で読み込んだファイルのシートをString型【str(配列数)】に読み込みたいです。
このサイトが近いかなぁ、と思ったのですが、うまく実装できませんでした。
http://officetanaka.net/excel/vba/tips/tips29.htm
よろしくお願いいたします。
0959デフォルトの名無しさん
2010/07/22(木) 01:08:40セルの値が〜 と 数式が〜の2つのパターンがあると思います。
以下、例としてですが
�@セルの値が〜
C2セルの値が あああ ならば、文字を赤色
C2セルの値が いいい ならば、文字を青色 に設定し、
�A数式が〜
C2の値が あああ ならば、背景色を灰色
C2の値が いいい ならば、背景色を青色
のような設定したいのですが、マクロですとどのように記述したらよいか
教えて頂けないでしょうか。
0960デフォルトの名無しさん
2010/07/22(木) 01:09:30操作を記録すれ
0961デフォルトの名無しさん
2010/07/22(木) 01:19:25http://www.cocoaliz.com/excelVBA/index/47/
あとはそのサイトを参考に頑張れ。
頑張れないなら素直に諦めた方が良い。割と難易度高めの処理だし。
0962デフォルトの名無しさん
2010/07/22(木) 08:00:14操作を記録してやってみましたが、どうしても記録したサンプル+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
0963デフォルトの名無しさん
2010/07/22(木) 08:59:44INDIRECT(ADDRESS(ROW(), COLUMN()+2))
とかで現在セルから2つ右とかはみられるよ。
0964デフォルトの名無しさん
2010/07/22(木) 10:21:100965デフォルトの名無しさん
2010/07/22(木) 10:53:45INDIRECT使う必要あるか?
A1の条件付書式なら=C1="あああ"とかで大丈夫だろ?
0966デフォルトの名無しさん
2010/07/22(木) 12:35:32>オフセットだけの話なら
>オフセットだけの話なら
0967デフォルトの名無しさん
2010/07/22(木) 12:43:15数式でR1C1形式にしてみりゃすぐわかる。
0968デフォルトの名無しさん
2010/07/22(木) 13:01:400969デフォルトの名無しさん
2010/07/22(木) 13:43:480970デフォルトの名無しさん
2010/07/22(木) 15:13:180971デフォルトの名無しさん
2010/07/22(木) 18:51:580972962
2010/07/23(金) 02:05:42回答ありがとうございます。
試してみたのですが、条件付き書式設定をした基準セルを元に
数か所の行、列のセルを判定させる予定でしたので断念しました。
情報提示不足で申し訳ないです・・・
条件付き書式について理解不足だったのもあり失礼しました。
無意味に色々機能を使ってると実感しましたので少々勉強してみます。
0973デフォルトの名無しさん
2010/07/23(金) 12:05:16コンパイルエラー、Function または変数が必要です。って出るようになって使えない
元のシート上のやつはちゃんと動くのに、どういうことですかね・・・?
subを変えてみたりもしたんですがだめでした
0974デフォルトの名無しさん
2010/07/23(金) 12:48:210975デフォルトの名無しさん
2010/07/23(金) 14:40:250976デフォルトの名無しさん
2010/07/23(金) 14:44:420977デフォルトの名無しさん
2010/07/23(金) 14:47:39そんなことの原因も割り出せないでどうやって暮らしてきたの?
質問に答えなくて悪いけど素直に疑問。
0978デフォルトの名無しさん
2010/07/23(金) 14:50:13会社の同僚に聞け。
聞く奴がいなけりゃ自分で勉強しろ。
0979デフォルトの名無しさん
2010/07/23(金) 15:03:42他のモジュールを写してない
0980デフォルトの名無しさん
2010/07/23(金) 15:08:590981デフォルトの名無しさん
2010/07/23(金) 16:06:18Ctrl+Break無いし、Esc押しても止まらんし、しかたなく強制終了したら作ってたの全部消えたorz
0982デフォルトの名無しさん
2010/07/23(金) 16:18:090983デフォルトの名無しさん
2010/07/23(金) 17:19:18いつも×ボタン連打とかタスクマネージャーから頑張ってころしてた。
0984デフォルトの名無しさん
2010/07/23(金) 20:46:150985デフォルトの名無しさん
2010/07/24(土) 00:54:24ネットブックだと本当に省略されてるから困る
0986デフォルトの名無しさん
2010/07/24(土) 09:40:08OSと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とかも同じか?
一〇番
一〇番
一番
一番
0987デフォルトの名無しさん
2010/07/24(土) 10:40:27一〇番
一番
一〇番
xp+2003
0988デフォルトの名無しさん
2010/07/24(土) 10:54:05一〇〇番
daskin
0989デフォルトの名無しさん
2010/07/24(土) 11:14:140990デフォルトの名無しさん
2010/07/24(土) 11:41:59サンクス、やっぱそうなるのか。
>>988
ダスキンは俺も使ってるけど、俺のダスキンで掃いてもそうならないなぁ。
誰か他の組み合わせ求む。
OSは関係無しかも知れないけどXP+2007とかVista+2003とかいない?
0991デフォルトの名無しさん
2010/07/24(土) 12:07:272.画面に開いたExcelBが表示
3.ExcelBに対して処理を実行する
4.(処理内容)各セルの値を調査する(この処理は実装済み)
1〜3を実装するにはどうすればいいでしょうか?
0992デフォルトの名無しさん
2010/07/24(土) 13:07:507(x64)+2007 では >>986 と同じになったよ
0993デフォルトの名無しさん
2010/07/24(土) 15:09:29ダイアログで選択してもらう時に、対象のブックを変数に代入しておけばいい。
そうすりゃ開くだけじゃなくて、処理対象も、閉じる対象も全部明確化出来る。
0994991
2010/07/24(土) 23:38:56選択したブックを変数にして処理をするのは理解できました
しかし、その選択したExcelファイル内のシートもユーザに選択させたいのですが、
何かいい手はありますでしょうか?
該当ブックのシート名を全て取得し、選択ダイアログ等にするのは微妙です
ユーザに普段Excelを使う時のように各シートを自由に開ける(遷移する)ようにした上で
該当シートでマクロを再開(メイン処理)させたいのです
流石に再開させるトリガフラグが不明確過ぎで無理ですかね?
例えばユーザが各シートに切替えた時に「このシートに対してメイン処理を実行しますか?」とダイアログが
毎回出るようなトリガフラグ判定とかできませんかね?
0995デフォルトの名無しさん
2010/07/24(土) 23:58:49最初に外部Excelを開くとき、
「まず使用するシートを選択し、次にXXX(呼び出し元プログラムのどこかのボタン)を押してください」
みたいなメッセージを表示するだけじゃだめなの?
ボタンが押されたら現在アクティブなシートを処理するだけ
0996991
2010/07/25(日) 00:42:38なるほど、処理を最初から2つに分けて
1つ目の処理はファイル選択ダイアログとアラートのみで
2つ目の処理でアクティブシートにメイン処理ですか
この2つの処理って、1つ目の処理でのファイル選択ダイアログで開かれたファイル名を
2つ目の処理のトリガが発生する前に2つ目の処理に引数として渡すって事ですか?
そんな事出来るんですか?
0997デフォルトの名無しさん
2010/07/25(日) 01:11:43たのみます
0998デフォルトの名無しさん
2010/07/25(日) 17:19:080999デフォルトの名無しさん
2010/07/25(日) 17:19:131000デフォルトの名無しさん
2010/07/25(日) 17:19:33次スレ案内
Excel VBA 質問スレ Part16
http://pc12.2ch.net/test/read.cgi/tech/1280045912/
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。