Home Php C# Sql C C++ Javascript Python Java Go Android Git Linux Asp.net Django .net Node.js Ios Xcode Cocoa Iphone Mysql Tomcat Mongodb Bash Objective-c Scala Visual-studio Apache Elasticsearch Jar Eclipse Jquery Ruby-on-rails Ruby Rubygems Android-studio Spring Lua Sqlite Emacs Ubuntu Perl Docker Swift Amazon-web-services Svn Html Ajax Xml Java-ee Maven Intellij-idea Rvm Macos Unix Css Ipad Postgresql Css3 Json Windows-server Vue.js Typescript Oracle Hibernate Internet-explorer Github Tensorflow Laravel Symfony Redis Html5 Google-app-engine Nginx Firefox Sqlalchemy Lucene Erlang Flask Vim Solr Webview Facebook Zend-framework Virtualenv Nosql Ide Twitter Safari Flutter Bundle Phonegap Centos Sphinx Actionscript Tornado Register | Login | Edit Tags | New Questions | 繁体 | 简体


10 questions online user: 14

0
votes
answers
24 views
+10

允許使用execvp執行程序

0

我創建了一個shell副本,並且遇到了可執行自制程序的問題。我的意思是,當我想執行諸如javalswc等等的東西時,一切正常...... PATH變量中已經存在的所有東西。允許使用execvp執行程序

現在我想能夠執行一個「myls」命令,它是原始ls的副本。問題是我的程序沒有在PATH變量中註冊,所以當我嘗試execvp("myls", …)時,出現錯誤「沒有這樣的文件或目錄」。

我想知道我如何管理這個問題,並能夠按照這個層次來執行我的命令:

src 
include 
bin 
makefile 
executable <- this one is my main executable 
myLs 
    executableLS <- would like to be able to call this one through execvp 
myPs 
    executablePS <- would like to be able to call this one through execvp 
+2

要麼將??你的程序放在你的'$ PATH'目錄下,要麼把你的程序放在'$ PATH'上的目錄,或者使用適當的路徑名(相對或絕對)來標識要運行的程序。 –

沙发
0
2

要允許與execvp()要執行的程序,你必須:

  • 或者把你的程序放在你的目錄$PATH,
  • 或者把程序的目錄放在你的$PATH,
  • 或安排使用程序的絕對路徑名(),
  • 或者安排使用程序的正確相對路徑名(../useful/myLs或甚至./myLs)。

注意當它看到的命令名稱不包含/execvp()只搜索上$PATH(所以./myLs停止尋找它的$PATH)。相對的名字通常是最不有用的;如果更改目錄,則相對路徑名可能會發生更改。

如有疑問,請確保您有一個目錄$HOME/bin,將您的程序放在那裏(或符號鏈接到您的程序),並將$HOME/bin添加到您的路徑。它生活在我的PATH的前面;我想我知道我在做什麼。

+0

噢,這正是我一直在尋找的!謝謝你一切正在工作! – LenweSeregon

0
votes
answers
47 views
+10

access_token在嘗試使用ADAL.js AuthenticationContext獲取訪問標記時與id_token相同?

4

我使用Azure AD對我的單頁應用程序(Angular4)進行身份驗證,並使用Adal.js進行驗證。在登錄頁面上,我單擊一個重定向到Microsoft AAD的按鈕,並在成功登錄後重定向迴應用程序主頁,並從JWT收到id_token和用戶信息。access_token在嘗試使用ADAL.js AuthenticationContext獲取訪問標記時與id_token相同?

我需要access_token用於後端API訪問,而我試圖通過該ADAL AuthenticationContextgetCachedToken()方法來獲取併發送的clientId作爲參數:

this.context.getCachedToken(this.configService.AdalConfig.clientId) 

但這種方法會返回存儲在會話存儲中的相同標記爲id_token (adal.idtoken)adal.access_token.key239f6fc7-64d2-3t04-8gfd-501efc25adkd = <id-token-value>:它基本上與級聯鍵,它具有相同的值,id_token

adal.access_token.key + clientId = id_token 

前創建會話存儲的新項目。

我也嘗試用AuthenticationContext.acquireToken()方法取access_token方法,但它也給了id_token回來。

我哪裏錯了?

編輯:張貼代碼。 我在調用函數login(),併成功登錄後,試圖通過 adal.config.ts中的get accessToken()屬性訪問器獲取主頁中的訪問令牌。

config.service.ts

import { Injectable } from '@angular/core'; 

@Injectable() 
export class ConfigService { 
    constructor() {} 
    public get AdalConfig(): any { 
    return { 
     tenant: 'common', 
     clientId: <application-id>, 
     redirectUri: window.location.origin + '/', 
     postLogoutRedirectUri: window.location.origin + '/' 
    }; 
    } 
} 

adal.service.ts

import { ConfigService } from './config.service'; 
import { Injectable } from '@angular/core'; 
import { adal } from 'adal-angular'; 
let createAuthContextFn: adal.AuthenticationContextStatic = AuthenticationContext; 

@Injectable() 
export class AdalService { 
    private context: adal.AuthenticationContext; 
    constructor(private configService: ConfigService) { 
    this.context = new createAuthContextFn(configService.AdalConfig); 
    } 

    login() { 
    this.context.login(); 
    } 

    logout() { 
    this.context.logOut(); 
    } 

    handleCallback() { 
    this.context.handleWindowCallback(); 
    } 

    public get userInfo() { 
    return this.context.getCachedUser(); 
    } 

    public get accessToken() { 
    return this.context.getCachedToken(this.configService.AdalConfig.clientId); 
    // return this.context.acquireToken(this.configService.AdalConfig.clientId, function(message, token, response) { 
    // console.log(message, token, response); 
    // }); 
    } 

    public get isAuthenticated() { 
    return this.userInfo && this.accessToken; 
    } 
} 
+0

你應該張貼您的整個驗證碼... –

+0

爲了驗證我只是創造了所有必要的信息的'AdalConfig'對象,如'tenant','clientId','redirectUri'等,然後初始化一個使用'AdalConfig'的新'AuthenticationContext',然後使用初始化上下文的方法。我發佈了方法調用。請讓我知道還有什麼是必需的。 – Rishabh

+0

你在哪裏指定你想要撥打的資源?你需要發佈你的代碼或者沒有人能夠幫助你。 –

沙发
0
2

其實一點閱讀後,原來那SPA的連接到Azure的指令要求的OAuth 2.0隱式授予流程。該Microsoft documentation說:

在這種情況下,當,JavaScript的前端 使用Active Directory身份驗證JavaScript庫(ADAL.JS)用戶登錄 和隱含授權授權以獲得一個ID令牌(id_token )來自Azure AD的 。當調用其Web API後端 (使用OWIN中間件進行保護)時,令牌被緩存,客戶端將其作爲不記名令牌附加到 請求中。

因此,我需要將id_token本身發送到後端API,後者又可以進行驗證和使用。有關驗證的更多信息,請參閱here

只接收到id_token不足以驗證用戶; 您必須驗證id_token的簽名並根據您的應用程序的要求驗證 令牌中的聲明。 v2.0端點使用JSON Web 令牌(JWT)和公鑰密碼體系對令牌進行簽名,並驗證 它們是否有效。

您可以選擇驗證客戶端 代碼中的id_token,但通常的做法是將id_token發送到後端 服務器並在其中執行驗證。一旦您驗證了id_token的 簽名,就會有一些聲明要求您驗證 。

+0

你是否設法使用adal從id令牌獲取訪問令牌? – hngdev

0
votes
answers
24 views
+10

懶VS初始化爲迅速

0

我使用Socket.io庫的實時功能添加到我的應用程序單的設計,和我使用Singleton設計懶VS初始化爲迅速

import SocketIO 

class SocketIOManager: NSObject { 

    static let sharedInstance = SocketIOManager() 

    var socket: SocketIOClient! 

    func establishConnection() { 
     socket = SocketIOClient(socketURL: URL(string: mainURL)!, config: [.log(false), .compress, .connectParams(["token": "asdasdasdsa"])]) 
     socket.connect() 

    } 

    func closeConnection() { 
     socket.disconnect() 
    } 

} 

因此從技術上講,只要我的應用程序加載up socket不能爲零,否則會崩潰。我發現了兩個解決方案,可以解決這個問題

  1. lazy var socket = SocketIOClient(socketURL: URL(string: mainURL)!, config: [.log(false), .compress, .connectParams(["token": "asdasdasdsa"])]) 
    

通過使用這種方法socket永遠是零,因爲它總是會被初始化。但這種方法的問題是,如果創建SocketIOClient不便宜,那麼它將是一個很好的使用方法。

  • 初始化()

    class SocketIOManager: NSObject { 
    
        static let sharedInstance = SocketIOManager() 
    
        let socket: SocketIOClient! 
    
    
    
    init() { 
         super.init() 
         socket = SocketIOClient(socketURL: URL(string: mainURL)!, config: [.log(false), .compress, .connectParams(["token": "asdasdasdsa"])]) 
        } 
    } 
    
  • 通過使用該方法,我有點困惑,因爲我不最初創建SocketIOManager對象像

    let socket = SocketIOManager() 
    

    因爲如果我沒有錯誤的套接字將被初始化,如果只有對象被創建,我不確定abou t在單例設計中使用init()

    哪種方法適合我的用例?

    沙发
    0
    1

    在斯威夫特全局變量,包括類的靜態成員默認情況下,所以這是正確的:

    class SocketIOManager: NSObject { 
    
        static let sharedInstance = SocketIOManager() 
    
        let socket: SocketIOClient! 
    
        private override init() { 
         super.init() 
         socket = SocketIOClient(socketURL: URL(string: mainURL)!, config: [.log(false), .compress, .connectParams(["token": "asdasdasdsa"])]) 
        } 
    } 
    

    註上的init,以防止他人試圖實例化這個類的私人,因爲它是一個單身人士。

    +0

    我得到這個錯誤'屬性'self.socket'沒有初始化super.init調用' – airsoftFreak

    +1

    'socket = SocketIOClient(soc ....'需要超過'super.init()',然後'編譯:假設'SocketIOClient(socketURL:config)'不是failable初始值設定項。 –

    板凳
    0
    1

    documentation

    存儲類型屬性在他們的第一次訪問延遲初始化。它們保證只被初始化一次,即使同時被多個線程訪問,也不需要使用lazy修飾符進行標記。

    推薦的方法是申報插座作爲非可選,首先初始化屬性,然後調用super

    class SocketIOManager: NSObject { 
    
        static let sharedInstance = SocketIOManager() 
    
        let socket: SocketIOClient 
    
        init() { 
         socket = SocketIOClient(socketURL: URL(string: mainURL)!, config: [.log(false), .compress, .connectParams(["token": "asdasdasdsa"])]) 
         super.init() 
        } 
    } 
    

    或者初始化socket與閉合,但是這需要有對其他沒有訪問屬於同一類。

    class SocketIOManager: NSObject { 
    
        static let sharedInstance = SocketIOManager() 
    
        let socket: SocketIOClient = { 
         return SocketIOClient(socketURL: URL(string: "https://server.com/path")!, config: [.log(false), .compress, .connectParams(["token": "asdasdasdsa"])]) 
        }() 
    } 
    

    或者,如果mainURL被宣佈爲你可以初始化socket懶洋洋地在同一類常量。這意味着套接字將首先在上初始化。

    class SocketIOManager: NSObject { 
    
        static let sharedInstance = SocketIOManager() 
    
        let mainURL = URL(string: "https://server.com/path")! 
    
        lazy var socket: SocketIOClient = { 
         return SocketIOClient(socketURL: mainURL, config: [.log(false), .compress, .connectParams(["token": "asdasdasdsa"])]) 
        }() 
    } 
    

    在第二和第三情況下,不需要額外的init方法。

    +0

    如果'getToken()'不存在,那麼它將不會建立連接,因爲最初套接字被加載沒有令牌如何重新初始化socket? – airsoftFreak

    +0

    沒有人能讀懂你的想法什麼是getToken()?如果你需要一個ad hoc連接,一個singleton可能是錯誤的解決方案,或者你必須將套接字' var'並且根據需要創建一個新的 – vadian

    +0

    ''token「'在'.connectParams'的init函數中。 – airsoftFreak

    0
    votes
    answers
    23 views
    +10

    FrozenLake Q-Learning更新問題

    0

    我正在學習Q-Learning,並試圖在OpenAI Gym的FrozenLake-v0問題上構建Q-learner。由於問題只有16個狀態和4個可能的操作,所以它應該相當容易,但看起來像我的算法沒有正確更新Q表。FrozenLake Q-Learning更新問題

    以下是我的Q學習算法:

    import gym 
    import numpy as np 
    from gym import wrappers 
    
    
    def run(
        env, 
        Qtable, 
        N_STEPS=10000, 
        alpha=0.2, # 1-alpha the learning rate 
        rar=0.4, # random exploration rate 
        radr=0.97 # decay rate 
    ): 
    
        # Initialize pars:: 
        TOTAL_REWARD = 0 
        done = False 
        action = env.action_space.sample() 
        state = env.reset() 
    
        for _ in range(N_STEPS): 
         if done: 
          print('TW', TOTAL_REWARD) 
          break 
    
         s_prime, reward, done, info = env.step(action) 
         # Update Q Table: 
         Qtable[state, action] = (1 - alpha) * Qtable[state, action] + alpha * (reward + Qtable[s_prime,np.argmax(Qtable[s_prime,])]) 
    
         # Prepare for the next step: 
         # Next New Action: 
         if rand.uniform(0, 1) < rar: 
          action = env.action_space.sample() 
         else: 
          action = np.argmax(Qtable[s_prime, :]) 
    
         # Update new state: 
         state = s_prime 
         # Update Decay: 
         rar *= radr 
         # Update Stats 
         TOTAL_REWARD += reward 
         if reward > 0: 
          print(reward) 
    
        return Qtable, TOTAL_REWARD 
    

    然後運行Q-學習1000次迭代:

    if __name__=="__main__": 
        # Required Pars: 
        N_ITER = 1000 
        REWARDS = [] 
        # Setup the Maze: 
        env = gym.make('FrozenLake-v0') 
    
        # Initialize Qtable: 
        num_actions = env.unwrapped.nA 
        num_states = env.unwrapped.nS 
        # Qtable = np.random.uniform(0, 1, size=num_states * num_actions).reshape((num_states, num_actions)) 
        Qtable = np.zeros((env.observation_space.n, env.action_space.n)) 
    
        for _ in range(N_ITER): 
         res = run(env, Qtable) 
         Qtable = res[0] 
         REWARDS.append(res[1]) 
        print(np.mean(REWARDS)) 
    

    任何意見,將不勝感激!

    沙发
    0
    1
    0
    votes
    answers
    13 views
    +10

    Easiest way to split a string on newlines in .NET?

    I need to split a string into newlines in .NET and the only way I know of to split strings is with the Split method. However that will not allow me to (easily) split on a newline, so what is the best way to do it?

    50
    votes
    answers
    93 views
    +10

    EJB 3.0 - Nested Transaction != Requires New?

    I just read the Transactions Chapter (10) of "Mastering EJB 3.0" and now I'm confused about nested transactions.

    The book says

    "The EJB-defined transaction manager does not support nested transactions; it requires support for only flat transactions." (Site 278, Note)

    This fact is described not only by this book, I found this statement in other books / websites.

    But if I call a "Requires New" annotated Method from a, let's say "Required" annotated Methode, what I have is a nested transaction, isn't it? I can roll back the inner transaction or commit it, without affecting the outer transaction. And if I want the outer Transaction to be aborted, I throw an EJBException back and the whole transaction will be rolled back.

    So is it just that this behavior is not required by the EJB 3.0 specification or have i misunderstood something? I just can't get the difference between nested transactions and the described behavior.

    Regards Norman

    up vote 41 down vote accepted favorite
    沙发
    +410
    +50

    RequiresNew不會創建嵌套事務,因為第一個事務在第二個事務運行時被掛起。嵌套事務如下所示:

     嵌套事務示例&gt; method1  -  begin tran1&gt; method2  -  begin tran2 workA&lt; method2  -  commit tran2&lt; method1  -  rollback tran1(tran2也回滾,因為它是嵌套的)  

    相反,RequiresNew看起來像這樣:

      EJB RequiresNew example&gt; method1  -  begin tran1&gt; method2  -  suspend tran1,begin tran2 workA&lt; method2  -  commit tran2,resume tran1&lt; method1  -  rollback tran1(tran2保持提交) 
         
    			
            

    感謝這個答案,現在我很清楚:)但如果我使用mandatoy或內部事務所需,它的行為就像一個嵌套的事務,雖然它屬於外部事務,對吧? - NorRen於2012年5月30日18:44

    如果使用mandatory或required,則容器不會對inner方法執行任何操作。沒有“內部”/“外部”事務區別,容器只留下事務。 - Brett Kail於2012年5月30日18:53

    是的,EJB RequiresNew與該文檔中描述的“嵌套頂級事務”相同。EE沒有與該文檔中描述的“嵌套子事務”相同的內容。 - Brett Kail 2013年4月24日0:18

    @MikeArgyriou不,對於非嵌套(JTA)事務,這兩個事務是完全獨立的:一個事務的提交/回滾對另一個沒有影響。 - Brett Kail 2015年7月23日6:21

    @MikeArgyriou不,在那種情況下,企業bean方法重用客戶端的現有事務,它不會開始新的事務(嵌套或其他)。此時,您可能應該打開一個新問題,而不是在這個舊答案上提問。 - Brett Kail 2015年7月23日16:27

    +90

    簡單回答是“外部”交易在新交易開始前暫停。兩個事務的命運沒有任何關聯,所以所有意圖和目的都不會嵌套到另一個事務中。

    如果 REQUIRES_NEW 方法拋出 EJBException 它創建的新事務將被回滾,而不是“外部”事務。

    0
    votes
    answers
    23 views
    +10

    無法從遠程URL

    0

    我用盡了一切,但仍然無法從以下網址獲得JSON內容得到JSON內容:http://onderbrekingen.infrax.be/onderbrekingen/Home/GetOnderbrekingen無法從遠程URL

    這是我最新的PHP:

    $url = 'http://onderbrekingen.infrax.be/onderbrekingen/Home/GetOnderbrekingen'; 
    $curlSession = curl_init(); 
    curl_setopt($curlSession, CURLOPT_URL, 'http://onderbrekingen.infrax.be/onderbrekingen/Home/GetOnderbrekingen'); 
    curl_setopt($curlSession, CURLOPT_BINARYTRANSFER, true); 
    curl_setopt($curlSession, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($curlSession, $jsonData = json_decode(curl_exec($curlSession)); 
    curl_close($curlSession); 
    
    switch (json_last_error()) { 
    case JSON_ERROR_DEPTH: 
        echo 'json_decode() - Maximum stack depth exceeded'; 
    break; 
    case JSON_ERROR_STATE_MISMATCH: 
        echo 'json_decode() - Underflow or the modes mismatch'; 
    break; 
    case JSON_ERROR_CTRL_CHAR: 
        echo 'json_decode() - Unexpected control character found'; 
    break; 
    case JSON_ERROR_SYNTAX: 
        echo 'json_decode() - Syntax error, malformed JSON'; 
    break; 
    case JSON_ERROR_UTF8: 
        echo 'json_decode() - Malformed UTF-8 characters, possibly incorrectly encoded'; 
    break; 
    default: 
        echo 'json_decode() - Unknown error'; 
    break; 
    case JSON_ERROR_NONE: 
        print '<b>JSON var_dump:</b>'; 
        print '</br></br>'; 
        var_dump($jsonData); 
        print '</br></br><hr></br>'; 
    break; 
    } 
    
    print '<b>echo content:</b>'; 
    print '</br>'; 
    echo stream_get_contents(fopen($url, "r")); 
    

    我已經也試過用file_get_contents(),也不行。 var_dump每次都會返回NULLstream_get_contents也似乎不會返回原始的JSON內容。

    Grtz, phyck

    +1

    告訴我們的輸出,而不是隻是 「它不工作」會很有幫助 – KayakinKoder

    +1

    爲什麼:curl_setopt($ curlSession,$ jsonData = json_decode(curl_exec($ curlSession)); –

    +0

    只寫: $ jsonData = json_decode(curl_exec($ curlSession)); –

    沙发
    0
    0

    更換

    curl_setopt($curlSession, $jsonData = json_decode(curl_exec($curlSession)); 
    

    $jsonData = json_decode(curl_exec($curlSession)); 
    curl_setopt($curlSession, $jsonData,true); 
    

    它工作得很好,當我測試

    //output 
    {"Onderbrekingen":[{"Id":"5f303a78-6bcb-e711-80d7-005056b663fa","Cabinenummer":"097LTF","Onderbrekingstype":"Storing","Discipline":"Elektriciteit","Postcode":" ","Gemeente":" ","BeginDatum":"/Date(1510873200000)/","EindDatum":null,"BeginUur":"08:46","EindUur":null,"Latitude":0,"Longitude":0,"GeimpacteerdeStraten":[],"GeimpacteerdKlantAantal":"101 - 500","ExtraBeschrijving":null,"DnbCode":null,"Scada":true,"InterneOpmerking":"Aangemaakt vanuit SCADA","IsRedLine":true,"ValidationErrors":null,"IsValid":true,"IsDirty":true,"Error":""}],"ScadaSync":"19:16"}<b>JSON var_dump:</b></br></br>int(1) 
    


    板凳
    0
    0

    @hazelcodes:謝謝,但它仍然不能在我的網絡服務器上工作。

    仍然得到同樣的輸出:

    JSON的var_dump:

    NULL

    回聲內容:

    0
    votes
    answers
    27 views
    +10

    創建,用於輸入參數和返回用最低的成本

    0

    這裏一個供應商提供的SQL函數是這樣一個問題:創建,用於輸入參數和返回用最低的成本

    代碼並執行,以創建一個名爲PreferredVendor函數,它接受一個
    產品ID參數作爲輸入的語句並返回具有最低成本
    賣方在VendorProduct賣方ID

    我無法返回廠商ID用最低的成本

    ,這裏是表結構

    Create table VendorProduct(
    
    VendorProductID int identity primary key, 
    Cost decimal(12,4), 
    ProductID int identity foreign key references Product(ProductID), 
    VendorID int identity foreign key references Vendor(VendorID) 
    ) 
    

    我到目前爲止創建的代碼如下:

    CREATE FUNCTION dbo.PreferredVendor (@ProductID int) 
    RETURNS int 
    AS 
    BEGIN 
        DECLARE @LowestVendorPrice int 
        SELECT @LowestVendorPrice = VendorID FROM VendorProduct 
        WHERE ProductID = @ProductID 
        RETURN @LowestVendorPrice 
    END 
    GO 
    

    我一直無法找出如何在這裏使用MIN!

    +0

    哪個[DBMS](https://en.wikipedia.org/wiki/DBMS)產品是您使用? 「SQL」只是一種查詢語言,而不是特定數據庫產品的名稱。 –

    沙发
    0
    2

    使用此選擇你的功能

    SELECT TOP 1 @LowestVendorPrice = VendorID FROM VendorProduct 
        WHERE ProductID = @ProductID 
        ORDER BY Cost 
    
    +0

    非常感謝!我完全無視了整個聲明! –

    0
    votes
    answers
    17 views
    +10

    排序號碼數字

    -4
    var a = [[11,"b"], [2,"b"], [11,"a"], [1,"a"], [1,"a"]]; 
    a.sort(); 
    alert(JSON.stringify(a)); 
    

    給出:排序號碼數字

    [[1,"a"],[1,"a"],[11,"a"],[11,"b"],[2,"b"]] 
    

    我怎麼樣數值?

    沙发
    0
    0

    假設內部數組的第一個元素將是總是一個數字,你要排序的數組,它立足,你可以比較來自內部陣列第一[0]

    注意a[0] - b[0]將按升序對元素進行排序。

    const a = [[11,"b"], [2,"b"], [11,"a"], [1,"a"], [1,"a"]]; 
     
    
     
    const r = a.slice().sort((a, b) => a[0] - b[0]); 
     
    
     
    console.log(JSON.stringify(r));

    +0

    ['陣列#sort'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort)就地排序。同一個數組的返回看起來像獲得一個新的已排序數組,它不能像這樣工作。 –

    板凳
    0
    -1

    可以使用underscoreJs _.sortby功能

    var a = [[11,"b"], [2,"b"], [11,"a"], [1,"a"], [1,"a"]]; 
     
    var b = _.sortBy(a,function(val){ 
     
        return val[0]; 
     
    }); 
     
    console.log(JSON.stringify(b));
    <script src="https://cdn.jsdelivr.net/npm/[email protected]/lodash.min.js"></script>

    0
    votes
    answers
    12 views
    +10

    數組範圍和IsEmpty如果然後聲明VBA。覆蓋所有內容而不是有選擇地插入

    1

    我是VBA的全新產品。到目前爲止,我的腰帶已經有4個星期了。這是完成報告數據清理和分析的宏列表的最後一部分。也許這不是最好的辦法嗎?我仍然對此感到陌生,所以我願意接受其他建議。但它需要是一個宏觀。這基本上是什麼樣子(突出顯示的字段中填充VLOOKUP,這就是爲什麼我有兩個不同的陣列,因爲他們不是連續的):數組範圍和IsEmpty如果然後聲明VBA。覆蓋所有內容而不是有選擇地插入

    link to snip of the worksheet

    的行數取決於變化報告。有時它的4000行,有時更多,有時更少。但是我確信每一列都是一樣的。我們試圖儘可能地自動化,以便我們能夠讓一些技術含量較低的人員能夠貫穿整個過程。我第一次經歷這個過程花了6個小時(儘管我也是在記筆記)。對於這裏的高級人員來說,每個人需要大約2小時,具體情況取決於。在年底之前,我們有大約300個這樣的領域。

    無論如何,這段代碼可以工作,但它會覆蓋我插入的所有iferror/vlookup結果。我猜我的'For If If Then'的聲明是怪罪。但是我一直在研究這個問題幾天,嘗試不同的方法來實現這個目標,而且這是我最接近的。任何幫助將不勝感激。我敢肯定它的東西超級簡單...

    Sub AutomateAllTheThings6() 
    Dim arr3() As String 
    Dim arr11() As String 
    Dim rng3 As Range 
    Dim rng11 As Range 
    Dim sourcerng As Range 
    Dim lastRow As Long 
        Call OptimizeCode_Begin 
         lastRow = Range("D1:D" & Range("D1").End(xlDown).Row).Rows.Count 
         Set rng3 = ActiveSheet.Range("BH2:BJ2" & ":BH" & lastRow) 
         Set rng11 = ActiveSheet.Range("BL2:BV2" & ":BL" & lastRow) 
         Set sourcerng = ActiveSheet.Range("BE2:BF2" & ":BE" & lastRow) 
         arr3() = Split("UNKNOWN,UNKNOWN,UNKNOWN", ",") 
         arr11() = Split("UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, 00/00/0000, 00/00/0000, 00/00/0000, 00/00/0000, NEEDS REVIEW", ",") 
          For Each cell In sourcerng 
           If IsEmpty(cell) Then 
            rng3.Value = arr3 
            rng11.Value = arr11 
           End If 
          Next 
        Call OptimizeCode_End 
    End Sub 
    
    +2

    的範圍是錯誤的:'範圍( 「BH2:BJ2」 & 「:BH」 &LASTROW)'應該用'範圍( 「BH2:BJ」 &LASTROW)'等 –

    +0

    1.閱讀全部@Scott Craner的評論2.把它們變成答案3. ??? 4.利潤! – Excelosaurus

    +0

    例如:如果按下Ctrl + G並在immedate窗口中輸入以下內容:debug.Print ActiveSheet.Range(「BH2:BJ2」&「:BH」&3)。地址 你得到$ BH $ 2:$ BJ $ 3,這是一個用3代替lastRow的例子,但是顯示了實際發生的事情 – QHarr

    沙发
    0
    2

    你指的整個範圍內:

    rng3.Value = arr3

    所以,當發現任何空白的整個範圍內得到設置,而不僅僅是那一行。我們可以通過使用Intersect

    Intersect(rng3, ActiveSheet.Rows(cell.Row)).Value = arr3 
    

    同樣做到這一點排,你的範圍是在錯誤

    Set rng3 = ActiveSheet.Range("BH2:BJ2" & ":BH" & lastRow)

    將涉及到的範圍BH2:BJ2:BH100

    Cahnge到:

    Set rng3 = ActiveSheet.Range("BH2:BJ" & lastRow) 
    

    這樣:

    Sub AutomateAllTheThings6() 
    Dim arr3() As String 
    Dim arr11() As String 
    Dim rng3 As Range 
    Dim rng11 As Range 
    Dim sourcerng As Range 
    Dim lastRow As Long 
        Call OptimizeCode_Begin 
         lastRow = ActiveSheet.Range("D1").End(xlDown).Row 
         Set rng3 = ActiveSheet.Range("BH2:BJ" & lastRow) 
         Set rng11 = ActiveSheet.Range("BL2:BV" & lastRow) 
         Set sourcerng = ActiveSheet.Range("BE2:BF" & lastRow) 
         arr3() = Split("UNKNOWN,UNKNOWN,UNKNOWN", ",") 
         arr11() = Split("UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, 00/00/0000, 00/00/0000, 00/00/0000, 00/00/0000, NEEDS REVIEW", ",") 
          For Each cell In sourcerng 
           If IsEmpty(cell) Then 
            Intersect(rng3, ActiveSheet.Rows(cell.Row)).Value = arr3 
            Intersect(rng11, ActiveSheet.Rows(cell.Row)).Value = arr11 
           End If 
          Next 
        Call OptimizeCode_End 
    End Sub 
    
    +0

    謝謝Scott!就像真的一樣。這讓我在過去幾天感到沮喪。如果你曾經在波特蘭,第一輪就在我身上! – pnwAnalyst

    +0

    @pnwAnalyst俄勒岡州或緬因州? –

    +0

    波特蘭,俄勒岡州:) – pnwAnalyst

    板凳
    0
    1

    您也可以使用這種版本的陣列。儘管在我的代碼中,結果沒有粘貼到數組中,但計算是基於它們完成的,代碼的執行速度要比在範圍內對單元格進行操作時快得多。

    Option Explicit 
    Option Base 1 
    
    Sub AutomateAllTheThings6() 
    
    Dim arr3() As String, arr11() As String 
    Dim rng3 As Range, rng11 As Range, sourceRng As Range 
    Dim vSource As Variant 
    Dim nCounter1 As Long, nCounter2 As Long, lastRow As Long 
    
        Call OptimizeCode_Begin 
    
        Const firstRow As Long = 2 
    
        With ActiveSheet 
         lastRow = .Range("D1:D" & Range("D1").End(xlDown).Row).Rows.Count 
         Set rng3 = .Range("BH" & firstRow & ":BJ" & lastRow) 
         Set rng11 = .Range("BL" & firstRow & ":BV" & lastRow) 
         Set sourceRng = .Range("BE" & firstRow & ":BF" & lastRow) 
        End With 
    
        vSource = sourceRng 
    
        arr3() = Split("UNKNOWN,UNKNOWN,UNKNOWN", ",") 
        arr11() = Split("UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, 00/00/0000, 00/00/0000, 00/00/0000, 00/00/0000, NEEDS REVIEW", ",") 
    
        For nCounter1 = LBound(vSource) To UBound(vSource) 'loop through all rows in source range 
         For nCounter2 = LBound(vSource, 2) To UBound(vSource, 2) 'loop through all columns in the row 
          If IsEmpty(vSource(nCounter1, nCounter2)) Then 'if cell is empty 
           rng3.Rows(nCounter1) = arr3 
           rng11.Rows(nCounter1) = arr11 
           Exit For 
          End If 
         Next nCounter2 
        Next nCounter1 
    
        Call OptimizeCode_End 
    
    End Sub 
    
    +0

    我想我會保存試圖瞭解這一個爲我的第二個月的VBA經驗。 ;) 大聲笑。我遵循它直到For語句。試圖讓代碼在同一時間工作和學習會使我的頭部受傷。 – pnwAnalyst

    +0

    其實很簡單,'LBound(vSource)'是下邊界,第一行數組對應,'UBound(vSource)'是上邊界,最後一行是對應的。 'LBound(vSource,2)'在逗號後面有「2」,意思是第二維:列。 'vSource(nCounter1,nCounter2)'是一個數組「cell」,由它的「row」和「column」索引指定。 –

    +0

    另外'Option Base 1'將默認'LBound'從0更改爲1(並且效果增加了'Ubound by 1'),我經常使用它,以便數組與列表上的行和列具有相同的枚舉。 –