コンピュータの知性・・・

はてなに次のような質問がありました。
知性の向上について質問です。 ↓のブログに書いたのですが、 http://d.hatena.ne.jp/ey272/ 知性の向上とは、「計算処理速度が速くなること」だと思っているのですが、 みなさんはどう思われますか? 抽象化、演繹、帰納の段階が増えると知性が向上するとも思えないのですが・・・(逆に観測している現象から逸脱しすぎてしまう!?=現実離れした推定をする?)
コンピュータの知性は、処理速度を上げるだけで、上がるのでしょうか?
多分、難しいと思います。
なぜなら、処理速度を上げても速くなるだけで、創造アルゴリズムや過去の状況判断アルゴリズムを生み出すことはできないからです。
人間がそれらのアルゴリズムをコンピュータに実装し、コンピュータに知性を与えられるのは、相当先の未来になる感じですね。

トリニティ(三位一体)という知性を持ったコンピュータ

知性を持ったコンピュータが出てくる冒険小説を最近読んだばっかりでした。実はそういうのが好きだったりする。ビッグバンや神の話が出てくる箇所は好き嫌いが分かれるところですね。
公民館のお祭りの古本コーナーで、上下合わせて\40! 結構面白かった。

神の足跡(上) (講談社文庫)

神の足跡(上) (講談社文庫)

神の足跡(下) (講談社文庫)

神の足跡(下) (講談社文庫)

難しい人名の簡単な入力方法があった!

はしご高や、立がついた崎の入力には、一生懸命IMEパッドの手書きや部首で探していました。
でも、何と簡単に入力できるということが分かりました。
これからは、苦労しなくて済む。回答して教えていただいたhighgearさんに感謝。

入力方法

IMEの変換方法を「一般」から「人名/地名」に変更する。

Excelのショートカットキーのキーボードレイアウト上での割付

以前、「ExcelやWordのショートカットキーの割付を書きます」と言ってて、書いていませんでした。

Excelのショートカットレイアウト

EXCEL生産性向上委員会 ショートカット一覧にデフォルトのショートカットキー割付がスクリーンキーボードで見えやすくまとまっています。
ショートカットを覚えるというより、空きの場所を探したり、マニアックなショートカットを探すのにすごく役立ちそうです。

Wordのショートカット

残念ながら、キーボード上にレイアウトしたものはまだ探しきれていません。
Excelと同様、生産性向上委員会のものが結構良さそうです。
同じホームページ上にあるキー一覧の出力
で一覧を出して、レイアウトにまとめればできますが、割愛。

マクロの取り消しはできる?

マクロの難点は、簡単にCtrl+Zで取り消しでききないことですね。
でも、ある程度簡単なことでしたら、取り消しできます。
別マクロで取り消し動作を書いてあげればいいのです。

エクセルマクロについて教えて下さい。 下記のような条件付き書式のマクロを使用してみたんです、 マクロの動作はこれで問題ないんですが、 A列は文字を入力してしまうと、 ショートカットのやり直し「CTRL+Z」が効きません。。 これはどうしようもないんでしょうか? それともやり直しが効くようにする 書き方があるんでしょうか? --------------------- Private Sub Worksheet_Change(ByVal Target As Range) Dim intColor As Integer Dim celcolor As Integer If Target.Count > 1 Then Exit Sub If Intersect(Target, Range("A:A")) Is Nothing Then Exit Sub Select Case Target.Value Case Is = "あ" intColor = 1 celcolor = 2 Case Is = "い" intColor = 1 celcolor = 2 Case Is = "う" intColor = 1 celcolor = 3 Case Is = "え" intColor = 1 celcolor = 4 Case Is = "お" intColor = 1 celcolor = 5 End Select Target.Font.ColorIndex = intColor Target.Interior.ColorIndex = celcolor End Sub ----------------

回答が終了になっていましたが、ここで要望のことができるプログラムを掲載しておきます(ソースの一部は質問部分から流用)。


●ポイント

  • 前の値をUndoで持ってくる
  • Application.EnableEventsで変更したときにChangeイベントが発生しないようにする(Undoのとき、元に戻すマクロを動かしたとき)
  • セーブしておく場所は標準モジュール側に記載しておく

●Sheet1側

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

Dim intColor As Integer
Dim celColor As Integer
Dim NowVal As Variant

If Target.Count > 1 Then Exit Sub
If Intersect(Target, Range("A:A")) Is Nothing Then Exit Sub

intColor = 0
Select Case Target.Value
    Case Is = "あ"
        intColor = 1
        celColor = 2
    Case Is = "い"
        intColor = 1
        celColor = 2
    Case Is = "う"
        intColor = 1
        celColor = 3
    Case Is = "え"
        intColor = 1
        celColor = 4
    Case Is = "お"
        intColor = 1
        celColor = 5
End Select

If intColor <> 0 Then
    NowVal = Target.Value
    Application.EnableEvents = False
    Application.Undo
    OrgVal = Target.Value
    Target.Value = NowVal
    Application.EnableEvents = True
    ActiveCell.Offset(1, 0).Activate
    
    Set OrgTarget = Target
    OrgintColor = Target.Font.ColorIndex
    OrgcelColor = Target.Interior.ColorIndex
    Target.Font.ColorIndex = intColor
    Target.Interior.ColorIndex = celColor
End If

End Sub

●標準モジュール側

Option Explicit

Public OrgintColor As Integer
Public OrgcelColor As Integer
Public OrgVal As Variant
Public OrgTarget As Range

Sub UndoColor()

    OrgTarget.Font.ColorIndex = OrgintColor
    OrgTarget.Interior.ColorIndex = OrgcelColor
    Application.EnableEvents = False
    OrgTarget.Value = OrgVal
    Application.EnableEvents = True

End Sub

OLEオブジェクトはどうやれば操作できるんでしょう?

 OLEオブジェクト(Wordでの数式)の編集は中々できないですね。

WordファイルにMicrosoft 数式にて貼り付けた数式のDiff(差分)をとりたいと思います。 通常の機能では、OLEオブジェクトの差分は検知できないようなのですが、 それが可能なソフトウェア・VBAマクロ・その他の手段等はないでしょうか? バージョンは、2000です。

タッチの差で回答が終了になってしまいましたが、ここで要望のことができるプログラムを掲載しておきます。

Option Explicit

Sub GetEquation()
    
    ' (1)EQNEDT32.EXEの場所が違う場合は適宜調整
    Const sMathEdit As String = "C:\Program Files\Common Files\Microsoft Shared\EQUATION\EQNEDT32.EXE"
        
    Dim oMath As InlineShape
    Dim vPID As Variant

    vPID = Shell(sMathEdit, vbNormalFocus)
    If vPID = 0 Then Exit Sub
    Selection.WholeStory
    For Each oMath In Selection.InlineShapes
        oMath.OLEFormat.DoVerb VerbIndex:=1
        Waitfew (2)
        SendKeys ("%EL"), True
        Waitfew (2)
        SendKeys ("%EC"), True
        Waitfew (2)
        SendKeys ("%FX"), True
        Waitfew (2)
        
        AppActivate vPID
        Waitfew (2)
        SendKeys ("%EP"), True
        SendKeys ("{ENTER 2}"), True
        Waitfew (2)
    Next
End Sub

'少し待つ
Sub Waitfew(iWait As Integer)
    ' Application.wait (Now + TimeValue(sWait)) wordにwaitメソッドなし
    Dim Start
    
    Start = Timer
    Do While Timer < Start + iWait
        DoEvents
    Loop

End Sub

(1)のところは、EQNEDT32.EXEの場所が違う場合、それにあった物に変更ください。
デフォルトでインストールしてある場合は、変更不要です。

「フィルタオプションの設定」で色々フィルタできます

 Excelでのフィルタは、複雑な条件でデータ抽出できますが、比較的知られていないようですね。

たぶんIF関数になると思うのですが… Sheet1の A列に社員コード B列に社員名 があります。 C列?N列には4月から3月まで各月の残業時間数が入っています。 このデータから各月45時間以上残業したものをピックアップしてSheet2に載せたいのですが どのように計算してあげたらよいのでしょうか? (社員コードと社員名も対象者は乗せます) オートフィルタで4月、5月、それぞれ行っても良いのですが加工に非常に手間がかかってしまって… お手数ですが教えてください。 よろしくお願い致します。

各種数式やVBAを駆使しなくても、「条件に合うデータの抽出」は次のような感じで簡単にできます。


●やり方

  1. ヘッダを適当なところへコピー(例では表を下げて1行目へコピー)
  2. 条件を入れる(例では時間の列へ1行ずつ">=45"を12ヶ月分)
  3. データ→フィルタ→フィルタオプションの設定でリスト部分とフィルタ部分を指定する
  4. めでたく希望のフィルタ結果が出るのでコピーしてSheet2へ貼り付ける


 ↓

条件は、1行の中はandでつながれ、別な行はorです(Accessのような感じと思えばOKです)。
ですから複雑な条件があっても、柔軟で単純に変更できます。
例えば、4月も5月も45時間以上残業している人を出したいとか(この場合、同じ行に">=45"を2つ書く)。
100時間で行うのであれば、">=45"を">=100"に一括で置き換えるか、何度も同じことをするのであれば、条件を別に作っておいて切り替えるという手もあります。
ちなみに、全部を再度表示させるのは、「データ→フィルタ→すべての表示」で戻ります。再度フィルタしたいときは、「フィルタオプションの設定」を選べば、同じ条件で行われます。


分からない場合は、次も参考にしてみてください。
Excel(エクセル)基本講座:フィルタオプションの設定(データ抽出)
Excelのヘルプ:「フィルタ」で検索し「フィルタについて」

Wordでのcopy&pasteは書式なしが便利

Wordへのテキスト貼り付けは、簡単に1行マクロ&ショートカットでできます。
Microsoft Word で、「貼り付け」→「形式を選択して貼り付け」→「テキスト」をものすごく頻繁に使います。 ただ、そのたびに上の「貼り付け」→「形式を選択して貼り付け」→「テキスト」を繰り返すので大変面倒です。 これを何かショートカットにするか、アイコンをすぐ使える場所に出しておきたいのですが、どうやったら いいのでしょうか。使っているのはMicrosoft Word 2007です。】の質問にあったように、私もWordではテキスト形式での貼り付けを結構多用します。
 毎回メニューから出すのは鬼のように面倒なので、マクロをショートカットにして軽快に使いましょう。
毎回メニューから同じのを選ぶというのは、苦痛!(機械に使われているように感じてしまうのは私だけ?)

Sub 値貼り付け()
'
' 値貼り付け Macro
' 記録日 2005/04/19 記録者 hoge hoge
'
    Selection.PasteSpecial Link:=False, DataType:=wdPasteText, Placement:= _
        wdInLine, DisplayAsIcon:=False
End Sub

たった、これだけです。
手早くやるのは、次の手順。この手順を1回行うだけで、該当PCのWordは全文書でこの機能が使えます。

  1. Word中の適当な文字列をコピーしておく
  2. 「ツール→マクロ→新しいマクロの記録」でマクロを記録
  3. マクロ名=後で見てわかり易い適当な名前(上の例なら、値貼り付け)
    メニューかキーボードにショートカットを割付(キーボードがお勧め。Ctrl+Shift+Aなど)
    マクロの保存先=「すべての文書(normal.dot)=デフォルトのまま」
  4. 「形式を選択して貼り付け」でテキストを選ぶ
  5. マクロの記録を終了して、wordを閉じる

これで、ストレスなくクリップボードに入ったIE(ホームページ)やWordの書式付きテキスト、他アプリのデータが存分に貼り付けられる! 楽ちん、楽チン


なお、Word以外の文字列をクリップボードに入れて、マクロの記録をしたときは、なぜかWordが変なマクロを吐き出しますので、ご注意を。Wordのマクロ記録のバグと思われます。
念のため、Alt+F11を押して中身を見てみるといいと思います(標準モジュール>NewMacros)。

    ' ●Word以外の文字列をクリップボードに入れるとマクロ記録がバグ
    ' このマクロが吐き出される→これは書式付きになる
    ' Selection.PasteAndFormat (wdPasteDefault)  

    ' でもパラメータを変えて書式なしにすれば、最初のマクロと同じ効果
    Selection.PasteAndFormat (wdFormatPlainText)